Brainf * ck循环问题


19

我遇到一个网络俱乐部的问题,要求您打印:

ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!

使用不超过29个字节的Brainf ** k,而不使用','字符。

我有一个工作代码:

++++++++++[>++++++>+++++++++<<-]>-->.<[>-.<-]

但是我的循环太长,超出限制发送了16个字节。

有没有更有效的方法将第二个和第三个单元格设置为58和90,以便我可以运行第二个循环?还是有一个更好的方法可以一起完成所有这些,而我只是没有看到?


1
至于您的问题,虽然它只保存四个字节,但实际上最好生成5990并将其更改-..-,然后删除>.<
马丁·恩德

我得到+[--->++<]>++++[.-]19个字节,但它也打印控制字符……
Timtech '16

@MartinEnder是的,很抱歉,我看到您对另一篇文章的评论,并且发现这个小组似乎更合适,我将在SO上删除该小组,因为它没有产生很多答案。
尼克·罗德

2
老实说,我很好奇这个“网络俱乐部”,因为男孩们他们一定有一些非常好的高尔夫球手!
Sp3000

Answers:


23

27 24字节

++[<++[++<]>>>+]<[-<-.>]

花了整整一天的时间,基本上编写了一个蛮力搜索程序,然后观察结果。现在我可以回去做一些实际的工作

在线尝试!

组件++[<++[++<]>>>+]将磁带初始化为

[130, 0, 0, 0, 91, 59, 0]
                       ^

这正是我们需要的完美选择!


8
巫术。(∩`-´)⊃━☆゚。* ・。 ゚
primo

@primo公平地说,我不知道上半年在结构方面发生了什么,我认为您能够提出自己的算法/技术的事实真是令人惊讶:)
Sp3000,2016年

每个循环末尾的磁带:codepad.org/ZoJUlQ8M。最终会终止于它所执行的值,甚至根本不终止;)
primo

1
另一种24:+[[>++<<]>->+>+]<[-<-.>]
普里莫

15

30字节

-<-[>+>-[---<]>]>++>+[---<.->]

在线尝试!

85171很容易在Brainfuck中生成(3-3的模逆)。85非常接近90,而171非常接近17759·3),在此使用。有了一点骇客,我就能生产88176

不过,距离目标还差一个字节。

其他建议

通常,迭代一个列表要短一些,乘以一个常数,而不是相反。对于3个或更多的值尤其如此。例如,这:

++++++++++[>++++++>+++++++++<<-]

可以写成:

+>++++[+++++[>++++++++++<-]<]>

内部值只有两个,因此在这种情况下并没有太大的改进。实际上,仅重构要短一个字节:

+++++[>++++++[>++>+++<<-]<-]>

乘以3023,而不是10通过69。在MartinBüttner的建议下,这已经减少到38个字节,对原始字节没有太多更改:

+++++[>++++++[>++>+++<<-]<-]>>-[>.-<-]

我从来没有想过要乘以58并乘以更大的数字,这样会更有效率。
尼克·罗德

4

34字节

为您节省了11个字节,但仍然太长了5个字节...

+[--->++<]>++++<+[--------->.-<]>.

我已经花了几个小时,希望有人可以对此进行改进。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.