首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现一个2操解释器

实现一个2操解释器
EN

Code Golf用户
提问于 2023-01-23 13:47:30
回答 3查看 7.4K关注 0票数 16

2操是脑梗死的一个简单的2D变体。和传统的brainfuck一样,1D内存磁带从一开始就向右扩展了30000字节,由0到255之间的值组成。

算术应该四舍五入,添加1到255将单元格设置为0,从内存单元格29999向右移动应将指针移回0。相反的情况应该发生在递减或向左移动的时候。

输入是一维单向字符串/流。

它有以下命令:

  • <将指令指针的方向更改为左。
  • >将指令指针的方向更改为右侧。
  • ^将指令指针的方向更改为向上。
  • v将指令指针的方向更改为向下。
  • [减少数据指针。
  • ]增加数据指针。
  • -减少数据指针下磁带的值。
  • +在数据指针下增加磁带的值。
  • ?如果数据指针下的值不是0,则逆时针旋转指令指针90度。
  • .以字符的形式输出数据指针下磁带的值。
  • ,从标准输入中读取字符,并将其复制到数据指针下磁带中的位置。如果EOF达到这个值,应该是NOOP。
  • 任何其他字符都应该被忽略。

指令指针从左上角开始,向右移动,如果它在任何方向越界,即当不可能到达更多指令时,执行就终止。

该程序可以作为一个二维数组传递给解释器,也可以作为一个具有换行功能的简单字符串传递给解释器。输入可以作为附加参数传递,也可以像空字节一样用分隔符连接到程序。但是,不要假设程序中的所有行都是相同的长度。

测试用例

"Hello“

代码语言:javascript
复制
v                >]++]+++]+++]+[[[[-v
v                           >[v
v         >]++++>?]+]+]-]]+>?[ -v
>++++++++>?]].]- --.+++++++ .. + ++. ]].[-.[.+++.------.--------.]]+.]++.
         ^                      <
                           ^  <
                ^                   <

将输入复制到输出

代码语言:javascript
复制
v     >-v
v  >.>?, v
>,>?
  ^      <
     ^  <

打印ASCII代码页

谢谢马泰奥

代码语言:javascript
复制
v      >-[v
v   >->?]] +[v
v                          >-[++++]v
v                             >-[[. +]]v
v                                            >-v
v                 >-]]++++>?[>?++++ +++ +++.>?[ v
>]->?] -]+ ++ +++>?
                 ^                              <
                                            ^  <
                             ^         <
                          ^        <
   ^         <
      ^   <
EN

回答 3

Code Golf用户

发布于 2023-01-24 01:51:41

JavaScript (ES6),224个字节

-16多亏了@l4m2

+8处理未填充的输入:-(

期望(code)(input),其中code是一个字符串数组,input是一个字节数组。返回另一个字节数组。

代码语言:javascript
复制
c=>i=>{for(o=[],T=[x=y=d=p=j=0];c[v=T[p%=3e4]&=255,y]+0&&(c+0)[x];d&=3,x-=~-d%2,y+=~-~-d%2)(q='?[]-+.,v>^<'.indexOf(c[y][x]))>6?d=q:eval("d+=!!v;p+=29999;p++;T[p]--;T[p]++;o.push(v);T[i[j]*0+p]=i[j++]".split`;`[q]);return o}

在网上试试!

评论

主代码

代码语言:javascript
复制
c =>                      // c[] = code, as a list of strings
i => {                    // i[] = input array
  for(                    // main loop:
    o = [],               //   o[] = output array
    T = [                 //   T[] = tape array
      x = y =             //   (x, y) = position of the program pointer
      d =                 //   d = direction
                          //       (0:right, 1:up, 2:left, 3:down)
      p =                 //   p = tape pointer
      j = 0               //   j = input pointer
    ]                     //
    ;                     //   before each iteration:
    c[v = T[p %= 3e4]     //     force the tape pointer in [0 .. 29999]
          &= 255,         //     coerce the current tape cell to a byte
      y                   //     and save it in v
    ] + 0 && (c + 0)[x]   //     stop if we're out of bounds
    ;                     //   after each iteration:
    d &= 3,               //     force d in [0 .. 3]
    x -= ~-d % 2,         //     x <- x + dx
    y += ~-~-d % 2        //     y <- y + dy
  )                       //   at each iteration:
    ( q =                 //     let q be the index
        '?[]-+.,v>^<'     //       in this lookup string
        .indexOf(c[y][x]) //       of the current instruction
    ) > 6 ?               //     if this is a direction instruction:
      d = q               //       update d accordingly
    :                     //     else:
      eval(               //       evaluate some specific code
        "..."             //       (detailed below)
        .split`;`[q]      //       for this instruction, or just do
      );                  //       eval(undefined) if unrecognized
  return o                // end of loop: return the output string
}                         //

Instructions

代码语言:javascript
复制
d += !!v                  // '?': conditional 90° turn
p += 29999                // '[': decrement the tape pointer
p++                       // ']': increment the tape pointer
T[p]--                    // '-': decrement the value of the tape
T[p]++                    // '+': increment the value of the tape
o.push(v)                 // '.': output the value of the tape
T[i[j] * 0 + p] = i[j++]  // ',': load a new value from the input
票数 7
EN

Code Golf用户

发布于 2023-01-23 19:40:28

皮斯,191个字节

代码语言:javascript
复制
K*30000]0JE=.tQd=G,ZZ=H,1ZW.A+-VlMhBQGhMG=Y@@QhGeG=T@KZ [&qY\v=H,01&qY\^=H,0_1&qY\<=H,_1 0&qY\>=H,1 0&&TqY\?=H,eH_hH &qY\[=tZ&qY\]=hZ&qY\-XZK_1&qY\+XZK1&qY\.pC@KZ&qY\,&J,XKZChJ=tJ=+VGH=%R255K

在网上试试!

肯定还能得到更多的金牌。首先将程序作为字符串数组,然后将任何输入作为第二个输入。这是非常慢的,因为整个磁带是通过mod 255在每条指令上运行,但是这里有一个TIO链接到一个长度为30的磁带的版本,它不会超时。

票数 4
EN

Code Golf用户

发布于 2023-01-24 23:06:37

木炭,126个字节

代码语言:javascript
复制
WS⊞υιUO⌈EυLιLυ P⪫υ¶≔⪪⮌S¹θ≔E׳⁰φ⁰η≔⁰ζ≔⁰εWKK«≔﹪§ηζ²⁵⁶δ≡ι<≔⁴ε>≔⁰ε^≔²εv≔⁶ε[≦⊖ζ]≦⊕ζ-§≔ηζ⊖δ+§≔ηζ⊕δ?≧⁺∧δ²ε.≔⁺ω℅δω,F¬¬θ§≔ηζ℅⊟θP⁰M✳ε»⎚ω

在网上试试!链接是详细的代码版本。将程序作为以换行符结尾的字符串的列表,然后在空行后跟随输入(如果没有输入,则需要第二个空行)。解释:

代码语言:javascript
复制
WS⊞υι

输入程序。

代码语言:javascript
复制
UO⌈EυLιLυ 

用空格填充画布的矩形。

代码语言:javascript
复制
P⪫υ¶

在不移动光标的情况下重印程序。

代码语言:javascript
复制
≔⪪⮌S¹θ

将输入拆分为字符并将其反转。

代码语言:javascript
复制
≔E׳⁰φ⁰η

创建一个由30,000个单元组成的数组。

代码语言:javascript
复制
≔⁰ζ

初始化数据指针。

代码语言:javascript
复制
≔⁰ε

初始化方向指针。

代码语言:javascript
复制
WKK«

在不禁止当前指令的情况下重复。

代码语言:javascript
复制
≔﹪§ηζ²⁵⁶δ

获取数据指针处单元格的值,即模256。

代码语言:javascript
复制
≡ι

切换当前指令。

代码语言:javascript
复制
<≔⁴ε

如果是<,则将方向指针设置为左侧。

代码语言:javascript
复制
>≔⁰ε

如果是>,则将方向指针设置为右。

代码语言:javascript
复制
^≔²ε

如果是^,那么将方向指针设置为up。

代码语言:javascript
复制
v≔⁶ε

如果是v,则将方向指针设置为向下。

代码语言:javascript
复制
[≦⊖ζ

如果它是一个[,那么减少数据指针。

代码语言:javascript
复制
]≦⊕ζ

如果它是一个],那么增加数据指针。

代码语言:javascript
复制
-§≔ηζ⊖δ

如果是-,则在数据指针处减少单元格。

代码语言:javascript
复制
+§≔ηζ⊕δ

如果是+,则在数据指针处增加单元格。

代码语言:javascript
复制
?≧⁺∧δ²ε

如果它是一个+,并且当前单元格是非零,那么旋转方向指针。

代码语言:javascript
复制
.≔⁺ω℅δω

如果是.,那么将当前单元格的字符附加到输出字符串中。

代码语言:javascript
复制
,F¬¬θ§≔ηζ℅⊟θ

如果它是一个,,并且输入不是空的,那么用下一个输入字符的序号替换当前单元格。

代码语言:javascript
复制
P⁰

否则什么也不做。( ATO上较新版本的炭支持switch_delimited,它避免了这一点,但它本身仍然需要两个额外的字节。)

代码语言:javascript
复制
M✳ε

向当前方向移动一步。

代码语言:javascript
复制
»⎚ω

清除画布并打印最终输出字符串。

票数 4
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/257017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档