Fishstacks是基于堆栈的死鱼派生工具,当按下第五个元素时,该堆栈只能容纳四个元素;最后一个元素被踢出,最后打印到屏幕上。

我想出了TI-BASIC中用于我的计算器的解释器。但是,我对使用所有四个变量ABCD感到内gui。我想知道是否有更好的方法?也许带有列表(数组)。我刚刚开始了解它们,所以我还没有信心进行切换。任何指导将不胜感激。

此外,为了不将任何东西推送到屏幕上,直到有东西掉到栈外,我不得不将变量初始化为-2。这是我尚未转换为数组的主要原因。我看不到他们如何解决这个问题。 (甚至可能引发DOMAIN错误)。

:ClrHome
:Disp "FISHSTACKS IDSP","INTERPRETER"
:0->I
:-2->A
:A->B
:B->C
:C->D
:Input Str1
:While I<length(Str1)
:I+1->I
:sub(Str1,I,1)->Str2
:If Str2="I"
:A+1->A
:If Str2="D"
:A-1->A
:If Str2="S"
:A^2->A
:If Str2="P" and D>-1
:Then
:Disp D
:C->D
:B->C
:A->B
:0->A
:End
:If A=256 or A=-1
:0->A
:If A=-2
:Stop
:End


按照惯例,我用STO→代表了字符->

#1 楼

@Timtech要求我加入+发布改进。使用数组更容易理解,并且有太多的优化使我决定完全重写代码。我肯定可以通过像我这样的其他高级程序员来改善它,因为我在这里使用了几个长表达式...请注意,L1代表列表#1(计算器上的2nd + 1),而~是负标记。 br />
:ClrHome
:Disp "FISHSTACKS IDSP","INTERPRETER
:DelVar IInput Str1
:DelVar L1~{2,2,2,2→L1
:While I<length(Str1
:I+1→I
:sub(Str1,I,1→Str2
:(Str2="I")-(Str2="D
:Ans+L1(4→L1(4
:If Str2="S
:L1(4)²→L1(4
:If Str2="P
:Then
:L1(1
:If 2+Ans
:Disp Ans
:ΔList(cumSum(L1->L1
:0->L1(4
:End
:L1(4
:If Ans=256 or Ans<0
:0->L1(4
:End


改进


通过删除一些不需要的结尾括号和引号来保存字节
使用了DelVar,因为它不需要随后的冒号
使用数组而不是四个变量
使用复杂的表达式:(Str2="I")-(Str2="D保存到Ans以节省空间
使用ΔList(cumSum(L1->L1得到L1减去其第一个元素
其他几个我由于他们的小巧而没有上市;主要使用Ans来节省空间和速度


评论


\ $ \ begingroup \ $
哇,太好了,很高兴您能做到!入住愉快。
\ $ \ endgroup \ $
– Timtech
2014年12月16日20:05

\ $ \ begingroup \ $
感谢@Timtech,只要有时间,我可能会在不久的将来回答您的其他问题。
\ $ \ endgroup \ $
–FlyAwayBirdie
2014年12月16日20:07

\ $ \ begingroup \ $
欢迎使用代码审查!
\ $ \ endgroup \ $
–RubberDuck
2014年12月17日在2:09

\ $ \ begingroup \ $
哈哈,那个很好的老TI-BASIC,其中不关闭括号和字符串是常态:D
\ $ \ endgroup \ $
–莫文
2014年12月19日,0:26

#2 楼

除了您已经知道的错误名称之外,我还看到了一些可以改进的地方。

str1str2也是错误的变量名称。它们应该分别是strchr。这些名称将正确表示数据,并使此代码更易于理解。对任何查看代码的人来说,您在用户输入的字符串的每个字符中循环浏览都将立即清楚。

这部分代码没有意义。


:If Str2="P" and D>-1
:Then
:Disp D
:C->D
:B->C
:A->C
:0->A
:End



译成“普通”基本语言,看起来像这样。

    If char = "P" And d > -1 Then
        Print d

        d = c
        c = b
        c = a
        a = 0
    End If


显而易见,您只需要对c进行一次分配。

:If Str2="P" and D>-1
:Then
:Disp D
:C->D
:A->C
:0->A
:End


我在这里可以看到的另一个改进是,我认为这很有意义在这里使用For循环而不是While循环。这样,您不必在循环的每次迭代中手动增加I。这会使这个小程序更干净。

评论


\ $ \ begingroup \ $
不幸的是,您似乎不熟悉该语言。除了抓错字之外,真的没有任何改善。字符串无法重命名,For(循环占用更多空间,依此类推。
\ $ \ endgroup \ $
– Timtech
2014年12月16日19:34

\ $ \ begingroup \ $
tibasicdev.wikidot.com/for
\ $ \ endgroup \ $
– Timtech
2014年12月16日19:38在

\ $ \ begingroup \ $
我也是这样!赏金又开放了一个星期,所以也许有人在这里引起注意。 =)
\ $ \ endgroup \ $
–RubberDuck
2014年12月16日19:46在

\ $ \ begingroup \ $
是的,我的一位朋友说他现在正在写一个。
\ $ \ endgroup \ $
– Timtech
2014年12月16日19:48在

\ $ \ begingroup \ $
好吧,关于字符串名称的评论仍然没有意义:您不能在TI-BASIC中命名变量。有一串名为Str1,Str2,Str3 ...的字符串变量,您对此无能为力。您必须使用这些神秘名称。
\ $ \ endgroup \ $
–莫文
2014年12月19日下午0:29

#3 楼

:ClrHome
:Disp "FISHSTACKS IDSP","INTERPRETER"
:-{2,2,2,0->L1
:Input Str1
:For(I,1,length(Str1
:sub(Str1,I,1
:If Ans≠"P"
:Then
:(Ans="I")-(Ans="D")+L1(4)^int(e^(Ans="S"->L1(4
:If Ans≥0 and Ans≠256
:Else
:L1(1
:If 2+Ans
:Disp Ans
:augment(ΔList(cumSum(L1)),{0->L1
:End
:End


我可以通过组合一些表达式,更早地移动溢出检查以利用Ans,将L1设置为更少的字节,使用For循环以及其他几个方法,来进一步缩短FlyAwayBirdie的答案。东西。此外,我将变量初始化为-1而不是-2,除了初始累加器按照规范从0开始。

您可以删除行尾的右引号。

编辑:通过不将子字符串保存到Str2,节省了更多的字节。但是,未定义的命令现在将被识别为“ P”。

评论


\ $ \ begingroup \ $
太好了!通常,当他发布信息时,很难对其进行改进:P
\ $ \ endgroup \ $
– Timtech
15年5月25日在1:07