首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成大脑* NOPs

生成大脑* NOPs
EN

Code Golf用户
提问于 2015-12-07 10:45:41
回答 5查看 2.5K关注 0票数 25

有时,在编写brainfuck代码时,您会感觉到需要使它比需要的时间更长,以鼓励调试。你只需在里面放一个><就可以做到,但这有什么意思呢?您将需要更长、更少的NOPey来迷惑阅读代码的人。

快速介绍Brainfuck

布莱福克是城市米勒于1993年创建的一种深奥的编程语言,以其极端的极简主义著称。(维基百科)

Brainfuck是一种基于八个命令的语言:+-><,.[]。代码运行在类似图灵机的东西上:一种可以改变值的无限磁带。在这个挑战中,我们将集中讨论前四项:

代码语言:javascript
运行
复制
+    increment the value at the pointer
-    decrement the value at the pointer
>    move the pointer right
<    move the pointer left

Brainfuck NOPs

brainfuck NOP是从任何状态执行的一系列brainfuck字符,它不会导致状态的变化。它们由上面提到的四个字符组成。

挑战

挑战是编写一个程序或函数,当执行时,生成给定长度的随机brainfuck NOP。

输入

您将收到一个非负的偶数整数n作为输入。(对于奇数n来说,NOPs是不可能的。)

输出

您将输出长度为n的随机brainfuck NOP。

规则

  • NOP的定义:当程序的输出被插入到brainfuck程序的任何一点时,该程序的行为绝不能以任何方式改变。换句话说,它不能改变解释器的状态。
    • 请注意,例如,+>-<是不正确的,因为它更改两个单元格的值而不更改它们。请在发帖前测试您的解决方案。
    • 还请注意,+>-<->+<是一个NOP,不能仅通过删除>< <> +- -+就可以减少到零。因此,您不能使用只将这些内容插入到彼此内部的算法。

  • 长度为n的每个有效NOP必须有一个非零的机会出现在输出中。不过,分布并不一定是统一的。
  • 问题中的brainfuck解释器有一个由任意精确单元组成的双无限磁带。也就是说,您可以无限地向两个方向前进,并无限期地递增/减少每个单元格。
  • 在我的机器上,n = 100的程序必须在1分钟内完成,因此不能生成所有可能的NOPs并选择一个。
  • 如果输入无效(非整数、负数、奇数等)你可以做任何你想做的事,包括克拉什。

评分

这是密码-高尔夫,所以以字节为单位的最短答案获胜。

示例

以下是n =4的所有有效输出:

代码语言:javascript
运行
复制
++--    +-+-    +--+    --++    -+-+    -++-
>><<    ><><    ><<>    <<>>    <><>    <>><
><+-    ><-+    <>+-    <>-+
>+-<    >-+<    <+->    <-+>
+><-    -><+    +<>-    -<>+
+-><    -+><    +-<>    -+<>

下面是n =20的几个可能的输出:

代码语言:javascript
运行
复制
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
EN

回答 5

Code Golf用户

发布于 2015-12-07 13:20:16

Mathematica,350个字节

代码语言:javascript
运行
复制
Quiet@(For[a="+",If[{##4}=={},#3!=0||Union@#!={0},Switch[#4,"+",#0[ReplacePart[#,#2->#[[#2]]+1],#2,#3,##5],"-",#0[ReplacePart[#,#2->#[[#2]]-1],#2,#3,##5],">",#0[#~Append~0,#2+1,#3+1,##5],"<",If[#2<2,#0[#~Prepend~0,1,#3-1,##5],#0[#,#2-1,#3-1,##5]]]]&@@{{0},1,0}~Join~Characters@a,a=""<>RandomSample@Flatten@RandomChoice[{{"+","-"},{">","<"}},#/2]];a)&

太久了?是。我还在乎吗?除非别人发了一个有效的答案。

票数 4
EN

Code Golf用户

发布于 2018-10-24 06:56:30

Python 3,163个字节

代码语言:javascript
运行
复制
from random import*
n=int(input())
p=0;d=[0]*n;a=choices(b'+-<>',k=n)
for c in a:d[p]+=c%2*(44-c);p+=~c%2*(c-61)
if p|any(d):a=n//2*b'+-'
print(*map(chr,a),sep='')

在网上试试!

将结果打印到STDOUT的完整程序。运行BF代码的行可能是金色的。

采用Tyilo的方法;如果生成的BF代码不是NOP,则完全丢弃它,然后重复使用'+-'

票数 2
EN

Code Golf用户

发布于 2018-10-25 00:41:32

Python 3,177个字节

代码语言:javascript
运行
复制
from random import*
n=int(input())
r=[0]*n*3
p=0
a=[43,45]
s=choices(a+[60,62],k=n)
for c in s:p+=~c%2*(c-61);r[p]+=c%2*(44-c)
if any(r+[p]):s=a*(n//2)
print(*map(chr,s),sep='')

在网上试试!

我在BF模拟中使用了Bubbler的答案中的代码。

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

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

复制
相关文章

相似问题

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