2操是脑梗死的一个简单的2D变体。和传统的brainfuck一样,1D内存磁带从一开始就向右扩展了30000字节,由0到255之间的值组成。
算术应该四舍五入,添加1到255将单元格设置为0,从内存单元格29999向右移动应将指针移回0。相反的情况应该发生在递减或向左移动的时候。
输入是一维单向字符串/流。
它有以下命令:
<将指令指针的方向更改为左。>将指令指针的方向更改为右侧。^将指令指针的方向更改为向上。v将指令指针的方向更改为向下。[减少数据指针。]增加数据指针。-减少数据指针下磁带的值。+在数据指针下增加磁带的值。?如果数据指针下的值不是0,则逆时针旋转指令指针90度。.以字符的形式输出数据指针下磁带的值。,从标准输入中读取字符,并将其复制到数据指针下磁带中的位置。如果EOF达到这个值,应该是NOOP。指令指针从左上角开始,向右移动,如果它在任何方向越界,即当不可能到达更多指令时,执行就终止。
该程序可以作为一个二维数组传递给解释器,也可以作为一个具有换行功能的简单字符串传递给解释器。输入可以作为附加参数传递,也可以像空字节一样用分隔符连接到程序。但是,不要假设程序中的所有行都是相同的长度。
v >]++]+++]+++]+[[[[-v
v >[v
v >]++++>?]+]+]-]]+>?[ -v
>++++++++>?]].]- --.+++++++ .. + ++. ]].[-.[.+++.------.--------.]]+.]++.
^ <
^ <
^ <将输入复制到输出
v >-v
v >.>?, v
>,>?
^ <
^ <谢谢马泰奥
v >-[v
v >->?]] +[v
v >-[++++]v
v >-[[. +]]v
v >-v
v >-]]++++>?[>?++++ +++ +++.>?[ v
>]->?] -]+ ++ +++>?
^ <
^ <
^ <
^ <
^ <
^ <发布于 2023-01-24 01:51:41
-16多亏了@l4m2
+8处理未填充的输入:-(
期望(code)(input),其中code是一个字符串数组,input是一个字节数组。返回另一个字节数组。
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}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
} //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发布于 2023-01-23 19:40:28
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的磁带的版本,它不会超时。
发布于 2023-01-24 23:06:37
WS⊞υιUO⌈EυLιLυ P⪫υ¶≔⪪⮌S¹θ≔E׳⁰φ⁰η≔⁰ζ≔⁰εWKK«≔﹪§ηζ²⁵⁶δ≡ι<≔⁴ε>≔⁰ε^≔²εv≔⁶ε[≦⊖ζ]≦⊕ζ-§≔ηζ⊖δ+§≔ηζ⊕δ?≧⁺∧δ²ε.≔⁺ω℅δω,F¬¬θ§≔ηζ℅⊟θP⁰M✳ε»⎚ω在网上试试!链接是详细的代码版本。将程序作为以换行符结尾的字符串的列表,然后在空行后跟随输入(如果没有输入,则需要第二个空行)。解释:
WS⊞υι输入程序。
UO⌈EυLιLυ 用空格填充画布的矩形。
P⪫υ¶在不移动光标的情况下重印程序。
≔⪪⮌S¹θ将输入拆分为字符并将其反转。
≔E׳⁰φ⁰η创建一个由30,000个单元组成的数组。
≔⁰ζ初始化数据指针。
≔⁰ε初始化方向指针。
WKK«在不禁止当前指令的情况下重复。
≔﹪§ηζ²⁵⁶δ获取数据指针处单元格的值,即模256。
≡ι切换当前指令。
<≔⁴ε如果是<,则将方向指针设置为左侧。
>≔⁰ε如果是>,则将方向指针设置为右。
^≔²ε如果是^,那么将方向指针设置为up。
v≔⁶ε如果是v,则将方向指针设置为向下。
[≦⊖ζ如果它是一个[,那么减少数据指针。
]≦⊕ζ如果它是一个],那么增加数据指针。
-§≔ηζ⊖δ如果是-,则在数据指针处减少单元格。
+§≔ηζ⊕δ如果是+,则在数据指针处增加单元格。
?≧⁺∧δ²ε如果它是一个+,并且当前单元格是非零,那么旋转方向指针。
.≔⁺ω℅δω如果是.,那么将当前单元格的字符附加到输出字符串中。
,F¬¬θ§≔ηζ℅⊟θ如果它是一个,,并且输入不是空的,那么用下一个输入字符的序号替换当前单元格。
P⁰否则什么也不做。( ATO上较新版本的炭支持switch_delimited,它避免了这一点,但它本身仍然需要两个额外的字节。)
M✳ε向当前方向移动一步。
»⎚ω清除画布并打印最终输出字符串。
https://codegolf.stackexchange.com/questions/257017
复制相似问题