指定された長さの文字列を出力するBrainf_ckプログラムを生成します


11

あなたの友人は、独特のロックシステムを備えた金庫に侵入しようとしています。特定の場所で一定数の穏やかなノックが必要です。あなたの友人は番号(1〜99999の範囲)を発見し、必要なノックを生成するガジェットを所有しています。ただし、ガジェットはBrainfuckインタープリターです!したがって、友人はBrainfuckプログラムをフィードする必要があります。これは、明らかに、可能な限り短くする必要があります(ガジェットのI / Oが遅い)。

あなたの仕事は彼を助けることです!入力として数値を受け入れ、入力を受け付けNず、印刷可能なASCII文字の文字列を出力するBrainfuckプログラムを出力するプログラムまたはサブルーチンを任意の言語で記述します(スペース文字を除く-範囲33のコード... 126)の長さN

例:入力の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の数値を保持できる)があると仮定しましょう。また、ラッピングなし:セルがオーバーフローすると、マシンは自己破壊します!


1
「Nの値に続く(乱数)」は、xkcd.com
cirpis

参考のために、スペース文字(文字コード32)は通常、印刷可能なASCII範囲に含まれています。ただし、範囲を明示的に定義しているため、チャレンジに対して実際には違いはありません。
マーティンエンダー

3
Brainfuckのセルを任意の幅の整数と仮定できますか?そうでない場合、どのように、いつラップしますか?
orlp

1
少なくとも67175 +数個を含めることができると仮定するとよいでしょう。
orlp

@anatolyg後でそれを実現しました。ごめんなさい。
エソランジングフルーツ

回答:


3

Python 2、スコア:1021

私はこのコンテストがかなり古いことに気づきましたが、それでも、投稿されたものよりも優れたソリューションを思いついたので、それも投稿しました。

仕事をする102バイトのPythonスクリプトを次に示します。

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

考えは、Nにベース5エンコードを使用することです(少なくとも現在の入力には最適なベースであり、これは非常に "ランダム"でなく、OPによって任意に選択されたように見えます)。任意の長さの数値をデコードします(数値は、変換の終了を検出するために各桁を1ずつ増やしてエンコードされます)。文字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未満のスコアを取得しますが、十分に短くするためのゴルフ言語は知りません)。
アナトリグ

8

BrainF ***、スコア:193,313

140文字以下ではないので(147なので、近い!!)、これは勝てませんが、クールだと思いました。

43のプラス記号、次にNピリオドを印刷します。あまり最適ではありません。

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

誰かがこれを短くするのを手伝うことができるなら、私はそれが大好きです。


Brainfuckを使えば、テープ上で入力を受け取る「サブルーチン」を作成すれば十分だと思います。「標準入力デバイス」から読み取る必要はありません。
アナトリグ

@anatolygこれにより、はるかに簡単になります-おそらく約80または90文字です。変更する必要がありますか?
mdc32

5

J、合計スコア= 1481

(以前のエントリと説明については、改訂履歴を確認してください。)

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

この関数は、入力番号のbase10桁に基づいてネストされた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

Pyth、1702

N + xの係数を使用して数値を再構築します。

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

2この出力について++。BFでは何も印刷しません。
ランダラ

@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

どのように機能しますか?
アナトリグ

@anatolyg最初のバージョンは、基数5の数値を生成するだけです。後のバージョンでは、最初の2桁に特別なケースが追加され、デクリメントも使用されました。
jimmy23013

@ user23013ああ、申し訳ありませんが、仕様の変更はありません。(それに応じて私の答えを更新しました。)
randomra

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

Befunge-93-24 + N、合計= 193009

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

これは、プレフィックスを使用して+++[>++++[>++++<-]<-]>>、最初のテープインデックスを24文字の「0」に設定します。Befungeプログラムは非常に基本的で、N '。'とともに出力します。文字。


私は...私のループはどんな方が良いだろうと考えた理由を今、私はこれを見ることを私は知らない
マーティン・エンダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.