写一个死鱼解释器

2021-02-01 21:20

Sandbox,CodidactA用更简单的输入格式和准则重写这个问题。challengeheadfish使用一个累加器,所有命令都将在其上执行。它具有以下特性命令:commanddescriptio

解答动态

  • 传送,90 76字节 {lt;^vlt;^vlt;'o'^quot;,*quot;=256.=quot;}。底部是-1/256的检查,通过计算a*=a!=256和a*=a!= -1. 然后累加器循环返回开始下一轮。
    累加器的一次迭代回路:

    • JavaScript(ES10),66 bytes 需要一个代码点列表。
      a=gt;n%5?p: (p=(p=[p-!!p、 p+1,,p*p][namp;p,[]),p=0) 在线试用!怎么做? o是唯一一个代码点(\$111\$)模5\$不等于0\$的命令。这也是唯一需要不更新累加器的特殊操作的命令。这就是为什么我们首先测试它。
      如果第一个模是\$0\$,我们应用一个模\$4\$来区分其他命令,并相应地更新累加器。
      char。

      • 代码

        • mod 5

          • mod 4------------------+----+----'d'

            • 100

              • 0

                • 0'i'

                  • 105

                    • 0

                      • 1'o'

                        • 111

                          • 1

                            • (3)'s'

                              • 115

                                • 0

                                  • 3

                                    • flex,86\$\cdots\$83 82 bytes 节省了2个字节,并且由于Mukundan314被移动到了TIO中!!!
                                      %{a;m(){a*=a!=256;}%}%%i m(++a);d m(aquot;%damp;--a);s m(a*=a);o printf(quot;,a);%% 这里我们有4个字符以及遇到每个字符时要运行的代码。只有当累加器不为零时,减量才会发生。
                                      后面有一个程序段,但如果忽略它,它将默认为运行解析器的main(如本例中所示)。
                                      您可以从上面生成C源代码lexer(在deadfish.l文件中)并用以下内容:
                                      flex deadfish.lgcc雷克斯·yyc-o公司deadfish-lf 编译后,运行以下:
                                      echo iissso

                                      • ./deadfishecho diissido

                                        • ./deadfishecho iissiddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd输出:
                                          028801 425 676 4583290 0 0 0 0 1 16 16 164112 您也可以将其作为./deadfish运行,并拥有一个交互式的deadfish环境来尽情地玩!

                                          • Ruby,60 58 bytes 由于@Sisyphus
                                            a=0;$<;,节省了2个字节。字节{

                                            • b

                                              • a=0if(a=eval'~-~pa*'[b%20/3,2]+?a) ^256<;1} 联机尝试或验证所有测试用例。
                                                从STDIN读取字符串并输出到STDOUT的完整程序,每行一个数字。
                                                累加器a上的每个操作都是通过计算一个3字节的字符串来执行的。第三个字节始终是a。前两个字节从索引b%20/3处开始的字符串~-~p a*中提取:
                                                Op\$b\$\$\left\lfloor\frac{b\bmod20}{3}\right\rfloor\$evald\$100\$\$0\$~-ai\$105\$\$1\$-~ao\$111\$3\$p为\$115\$\$5\$a*a

                                                • Nim,104 bytes var r=0表示c in标准读取:r=[r*r,r,r+1,r-1][28-c.ord div 4];r*=int(r xor 256)>;0;如果c=='o':echo r 在线测试!
                                                  基于@ovs惊人的Python answer.
                                                  Nim,120 114 109 bytes var r=0for c in标准读取:案例c of'i':r+=1 of'd':r-=1 of's':r*=relse:r.echo如果r in[-1256]:r=0 联机试用!
                                                  这是令人尴尬的可读性。
                                                  -5字节的灵感来自@Gotoro的Python answer

                                                  • Python 3,120 95 bytes n=0forx in input():#9;if“o”==x:print(n) ;其他:n=[n+1,n-1,n*n][ord(x)%4^1] 联机试用!多亏了丹尼斯的建议,
                                                    把它减少了25个字节!
                                                    使用位操作^我们从可能的操作。原始建议使用ord(x)%4^2,它产生0,1,2,3作为索引,并要求在索引0处的列表中使用额外的0;
                                                    使用^1产生0,1,2,这允许在比较中节省2字节。
                                                    也许可以说明额外的0并将其作为打印o的条件

                                                    • Python 2,83 82 76 74 bytes 感谢dingledooper发现了一个bug和-6个字节!-感谢穆昆丹!
                                                      将输入作为代码点列表。
                                                      a=0表示input()中的x:a=[a-1,a+1,a,a*a][x/6%4];a*=a^256>;0如果x%5:打印a Try it online!

                                                      • 05AB1E,23 22字节 -1字节,感谢命令主控!
                                                        将输入作为码点列表。
                                                        ???vgt;nquot;yè.VD?xAE;P* 在线试用!或者试试所有的案子!
                                                        页注释:
                                                        ?? #打印不带尾随换行符的空字符串#如果代码?#push 0中没有'o',并且输入v#迭代输入中的指令y:gt;nquot;#push string literalgt;nquot;#这些是05AB1E中的指令,相当于“isdo”y#推送当前指令;#将指令的模化索引减半到指令字符串中。V#执行指令D#复制当前值?#按256键,按-1键,将它们配对到[256,-1]ê#是否每个元素都不等于当前值?P#取乘积,如果当前值不在{1256}*.#将结果乘以当前值 a transpiler from Deadfish to 05AB1E为20字节,但这仍然需要.V?和初始值0:
                                                        0gt;nquot;I;?quot;V? 联机试用!

                                                        • AWK,83字节 {对于(d=0;c=$++b%9;)printf c-3?(d=(x=c-6?c-1?d*d:--d:++d)quot;\nquot;0quot;\nquot;truthy";部分中的逻辑更新累加器,但总是返回一个值f。由于这是一个未初始化的变量,AWK根据使用它的内容选择一个值。在这种情况下,它会变成一个空字符串,因此printf不会为非o命令生成任何输出。
                                                          更新累加器的代码被绑定到print语句中,因此只为a、d、i和s命令调用它。因此,它不必检查o.
                                                          在线尝试!

                                                          • AWK,55 53 52 51 bytes 感谢用户41805删除AWK标志
                                                            期望每个操作都在单独的行
                                                            {a*=a!=256}/i/{a++}/d/{aamp;a--}#如果行包含'd',且a为非零,则将a减少1/s/{a*=a}#如果行包含's'平方a/o/{print+a}#如果行包含'o'输出a

                                                            • PowerShell,68字节 switch-r($args){i{$a++}d{$a--}s{$a*=$a}o{+$a}.{$a*=$a-notin-1256}} 在线试用!

                                                              • x86-16机器代码,45字节 源代码与x86和x86

                                                                • 64兼容。将386条指令与提供的polyfill一起使用。
                                                                  由于整数溢出而使一次测试失败,但演示中给出了将其切换为64位算术的指令。
                                                                  00000000:31 d2 ac 3c 64 72 25 74 0d 3c 69 74 0c 3c 6f 74 1..lt;it.<;ot00000010:0b 0f af d2 eb 09 4a eb 06 42 eb 03 89 d0 ab 83……J..B……00000020:fa ff 74 dc 81fa 00 01 74 d6 eb d6 c3..t..t.. //quot;//quot;注释仅用于突出显示语法//sed-i-e的#//####g'死鱼.asm//nasm兼容[bits 16][cpu 386]//对于imul dx,dx global deadfish//Input://si:Input,以null结尾的字符串//di:output,uint16\u t数组//output:///di:points超过数组中的最后一个值伊德鱼:.Lzero://将累加器设置为0 xor dx,dx.Lloop文件用法:/Load byte lodsb//检查空终止符和'd'cmp al,'d'//下面的意思空终止符,返回jb.Lret//等于'd'je.Lop\u d//检查'i'cmp al,'i'je.Lop\u i//检查'o'cmp al,'o'je.Lop\u o//假定's'。Lop\u s://Square//8086兼容版本://xchg ax,dx//mul ax//xchg dx,ax imul dx,dx jmp。下一个Lop\u d://递减dec dx jmp。下一页://增量inc dx jmp。下一页Lop\u o://输出//将dx移动到ax mov ax,dx//*di++=axstosw.下一步://检查-1和256//如果相等,跳转到xor dx,dx方便地放在循环cmp dx,-1之前

                                                                  • End

                                                                  免责声明:

                                                                  本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。