生成一个Brainf_ck程序,该程序输出给定长度的字符串


11

您的朋友正试图闯入一个具有特殊锁定系统的保险库:它需要在特定位置轻敲几次。您的朋友发现了该号码(范围为1 ... 99999),并拥有一个可产生所需敲击声的小工具。但是,该小工具是Brainfuck解释器!因此,您的朋友需要为其提供一个Brainfuck程序,该程序显然应该尽可能短(小工具的I / O速度很慢)。

您的任务是帮助他!用任何语言编写一个程序或子程序,该程序或子程序接受数字作为输入N,然后输出Brainfuck程序,该程序不进行任何输入,而是输出一串可打印的ASCII字符(不包括空格字符-范围为33的代码... 126)的长度N

示例:对于input 10,输出可能是

+++++++++++++++++++++++++++++++++..........

(但我可以确定可以缩短它!)

您的分数将是以下值N(它们是随机数)的输出长度的总和:

55
68
15
28
841
838
522
846
4898
9004
9363
3810
13230
67175
37231
44701

哦,您将通过Twitter将您的代码(生成器程序)传输给您的朋友。因此,请确保它不超过140个字符


PS Brainfuck语言有多种变体。假设磁带在两个方向上都是无限的(或“圆形且足够大”),并且这些单元具有32位int容量(有限,并且能够容纳高达99999的数字)。而且,无需包装:当单元溢出时,机器会自毁!


2
“以下N的值(它们是随机数)”使我想起xkcd.com/221
cirpis

仅供参考,空格字符(字符代码32)通常包含在可打印的ASCII范围内。由于您已经明确定义了范围,因此对挑战并没有真正的影响。
马丁·恩德

3
我们可以假设Brainfuck中的单元格是任意宽度的整数吗?如果没有,它们如何以及何时包装?
orlp 2015年

1
最好能够至少包含67175 +一些。
orlp 2015年

@anatolyg我后来才意识到。抱歉。
硕果累累

Answers:


3

Python 2,得分:1021

我刚刚意识到这个比赛已经很久了,但是由于我想出了一个比发布的解决方案更好的解决方案,所以我也发布了它。

这是一个102字节的python脚本,可以完成这项工作:

n=input()
s='>'
while n:
    s+='>'+'+'*(n%5+1);n/=5
print s+'[->[-<+++++>]<<]<+++++++[>+++++<-]>>[-<.>]'

这个想法是对N使用基数5编码(至少对于当前输入而言,这是最好的基数,顺便说一下,这似乎不是很“随机”,看起来像是OP任意选择的),并编写了通用的Brainfuck算法来解码任意长度的数字(对数字进行编码,每个数字加一,以检测转换结束)。我选择打印字符35 #,字符36 $是等效的。

您可以运行以下bash脚本来获取分数:

i=0
while read p; do
  i=$((i+`echo $p | python convert.py | wc -m`))
done
echo $i

有了一个更高级的程序,它用小数的乘法替换了编码,并选择了对每个数字进行编码的最佳基础,我可以达到958个Brainfuck字符,但是Python太冗长了(我是一个非常糟糕/懒惰的高尔夫球手)使转换器变成144个字节!


这是一个好主意!也许我会用它一次来改善答案(用Python编写脚本以使得分低于950,但我不知道打高尔夫球的语言是否足够简短)。
anatolyg

8

BrainF ***,得分:193,313

它不少于140个字符(现在是147个字符,如此接近!),所以不能赢,但我认为这很酷。

打印43加号,然后N句点。不是很理想。

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

如果有人可以帮助缩短它,我会喜欢的。


我想用Brainfuck足以使一个“子例程”在磁带上接收其输入-无需从“标准输入设备”读取。
anatolyg

@anatolyg可以轻松得多-大约80或90个字符。我应该改变它吗?
mdc32

5

J,总分= 1481

(有关我先前的输入和解释,请查看修订历史记录。)

f10=.('>++++++++++<';'')rplc~;@([:(<@('+++++[>+++++++<-]>>+',;@((<'[>++++++++++')#~#)),[<@(']',~'<-','<.>'#~],[,])"0 #-i.@# )10#.inv])

此函数根据输入数字的以10为基的数字生成嵌套的BF循环。检查所有合理的基础并选择最小的BF码将以少量提高分数。

测试集的BF程序:

   f10 every 55 68 15 28 841 838 522 846 4898 9004 9363 3810 13230 67175 37231 44701
+++++[>+++++++<-]>>+[>++++++++++[-<<.....>>]<-<.....>]                                                                                     
+++++[>+++++++<-]>>+[>++++++++++[-<<......>>]<-<........>]                                                                                 
+++++[>+++++++<-]>>+[>++++++++++[-<<.>>]<-<.....>]                                                                                         
+++++[>+++++++<-]>>+[>++++++++++[-<<..>>]<-<........>]                                                                                     
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<....>>]<-<.>]                                                             
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<...>>]<-<........>]                                                       
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<.....>>>]<-<<..>>]<-<..>]                                                                 
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<....>>]<-<......>]                                                        
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<....>>>>]<-<<<........>>>]<-<<.........>>]<-<........>]                      
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<.........>>>>]<-<<<>>>]<-<<>>]<-<....>]                                      
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<.........>>>>]<-<<<...>>>]<-<<......>>]<-<...>]                              
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<...>>>>]<-<<<........>>>]<-<<.>>]<-<>]                                       
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<.>>>>>]<-<<<<...>>>>]<-<<<..>>>]<-<<...>>]<-<>]                 
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<......>>>>>]<-<<<<.......>>>>]<-<<<.>>>]<-<<.......>>]<-<.....>]
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<...>>>>>]<-<<<<.......>>>>]<-<<<..>>>]<-<<...>>]<-<.>]          
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<....>>>>>]<-<<<<....>>>>]<-<<<.......>>>]<-<<>>]<-<.>]          

在测试集上计算分数:

   +/#@> f10 each 55 68 15 28 841 838 522 846 4898 9004 9363 3810 13230 67175 37231 44701
1481

3

佩斯,1702年

使用N + x因子重建数字。

+holN+]++">>"*"+"Q"<<"mjk(">>"j">"m*"+"kP+Qd"<[[->[->+>+<<]>>[-<<+>>]<<<]>[-]>[-<<+>>]<<<]>"*"-"d"<<")50"++++++[>++++++<-]>>[<.>-]"

对于2此输出++。现在,在BF中不打印任何内容。
randomra 2015年

@randomra好了,这是在更新时发生的,我会修复的,给我一些。
orlp

@randomra应该是固定的,分数会更高(当然)。
orlp

3

CJam,52 74 108字节,总计= 1304 1244 1210

ri5b_,1>{(_3<{\(@5*+}*\+}*W%)\{T+_2>:T5*-_0>"-+"=\z*}%\T+'+*a+W%{"[->+++++<]>"\}*">x[>x<-]<[->>.<<]"'x/'+6**

测试脚本(在线解释器中较慢):

q~]
{
_[0:T;
5b_,1>{(_3<{\(@5*+}*\+}*W%)\{T+_2>:T5*-_0>"-+"=\z*}%\T+'+*a+W%{"[->+++++<]>"\}*">x[>x<-]<[->>.<<]"'x/'+6**
]s
_[L:RL@0\
"-+><.]"['('){+\_{)}0?@\}{@\+\_{)}0?}{R1$c+:R;}]:`"]a"{{_aa+1$4G#%{:~~1}{;0}?}g}`+a+er:~:~
];R,@=!"Error."N+*o
}%s,

我没有看到有关自我毁灭的部分。但是无论如何它永远不会溢出。
jimmy23013 2015年

它是如何工作的?
anatolyg

@anatolyg第一个版本只是生成以5为底的数字。后来的版本为前两位数字添加了特殊情况,并使用了减量。
jimmy23013 2015年

@ user23013哦,很抱歉,尚未看到规格更改。(相应地更新了我的答案。)
randomra 2015年

2

Befunge-98,N + 41,总计= 193281

&>'+\:v
v^-1,\_
' >1-:v
>v^,+'_
,'    :
>ff3++^
>2f*+v
^>/9+:,
>'>,61v
, v*6+<
^/2,:<@
v >+2+,
>'<,']^

我知道这很糟糕,但是我今天想写一些Befunge。Befunge最好的部分是,这些程序比实际的高尔夫语言更难理解,尤其是当它们重用代码时:D

使用与MartinBüttnerCJam答案类似的算法:

(N +'s)>+++++++++++++++++++++++++++++++++<[->.<]

1

果酱,40 + N,总计:193265

'+33*'>'+l~*"[<.>-]"

刚开始,这里是基准解决方案。它生成以下代码:

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

_N副本在哪里+

在此处运行发电机。


1

Befunge-93-24 + N,总计= 193009

&>">>]-<]-<++++>[++++>[+++"v
v  ,,,,,,,,,,,,,,,,,,,,,,, <
>:v
,v_@
"1
.-
"
^<

这使用前缀+++[>++++[>++++<-]<-]>>来将第一个磁带索引设置为24个字符的“ 0”。Befunge程序非常基础,并与N'一起输出。字符。


现在我看到了,我不知道为什么我在想我的循环会更好……
Martin Ender
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.