Brainf *** NOPの生成


26

Brainfuckコードを書くときデバッグを促進するために必要以上に長くする必要があると感じることがあります。><そこにa を入れるだけでそれを行うことができますが、それは何が楽しいですか?コードを読んでいる人を混乱させるために、NOPeyをもっと長くする必要があります。

Brainfuckの簡単な紹介

Brainfuckは、1993年にUrbanMüllerによって作成された難解なプログラミング言語であり、極端なミニマリズムが特徴です。(ウィキペディア)

Brainfuckは、8つのコマンドに基づく言語です+-><,.[]。コードはチューリングマシンのようなもので実行されます。値を変更できる無限のテープです。この課題では、最初の4つに焦点を当てます。

+    increment the value at the pointer
-    decrement the value at the pointer
>    move the pointer right
<    move the pointer left

Brainfuck NOP

Brainfuck NOPは、任意の状態から実行されたときに状態に変化をもたらさない一連のBrainfuckキャラクターです。これらは上記の4文字で構成されています。

チャレンジ

課題は、実行されたときに、指定された長さのランダムなBrainfuck NOPを生成するプログラムまたは関数を作成することです。

入力

入力として非負の偶数整数を受け取りますn。(NOPは奇数には不可能ですn。)

出力

あなたは長さのランダムなBrainfuck NOPを出力しますn

ルール

  • NOPの定義:プログラムの出力がBrainfuckプログラムの任意のポイントに挿入された場合、そのプログラムの動作は決して変化してはなりません。つまり、インタープリターの状態を変更してはなりません。
    • たとえば+>-<、2つのセルの値を元に戻すことなく変更するため、これは正しくないことに注意してください。投稿する前にこれらのソリューションをテストしてください。
    • また、これ+>-<->+<はNOPであり、を削除するだけでは何にも削減できないことに注意してください>< <> +- -+。したがって、これらを相互に挿入するだけのアルゴリズムは使用できません。
  • 長さのすべての有効なNOPにはn、出力に表示されるゼロ以外のチャンスが必要です。ただし、分布は均一である必要はありません。
  • 問題のブレインファックインタープリターには、任意精度セルの二重無限テープがあります。つまり、両方向に無限に移動し、各セルを無制限にインクリメント/デクリメントできます。
  • プログラムは、私のマシンで= 100の場合1分以内にn終了する必要があるため、可能なすべてのNOPを生成して選択することはありません。
  • 無効な入力(非整数、負、奇数など)が与えられた場合、クラッシュを含め、好きなことを行うことができます。

得点

これはであるため、バイト単位の最短回答が優先されます。

以下は、n= 4の有効な出力です。

++--    +-+-    +--+    --++    -+-+    -++-
>><<    ><><    ><<>    <<>>    <><>    <>><
><+-    ><-+    <>+-    <>-+
>+-<    >-+<    <+->    <-+>
+><-    -><+    +<>-    -<>+
+-><    -+><    +-<>    -+<>

以下に、n= 20のいくつかの可能な出力を示します。

+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<

18
ここでは使用しませんbrainfuckのNOPです+-<>:あなたが尋ねたようにa
undergroundmonorail

1
非単純なNOPは存在しないと思うので、おそらくその資格を取り除けます。.副作用,があり、を使用しないと回復できない値を上書きします[]。しかし[]、値をゼロに設定することになります。また[]、影響を受けるセルが最初からゼロであったことが確実でない限り、これは値を上書きします(したがって、回復するために別のものが必要になります)。ただし、そのようなセルをのようなもので検索する必要があり[>]、元の位置に確実に戻ることは不可能です。
マーティンエンダー

4
@Eumel「問題のブレインファックインタプリタには、任意の精度のセルの二重無限テープがあります。」
マーティンエンダー

2
システムレベルの質問タイトル「Brainfuck」は使用できなくなりました。非ASCII文字を使用することで制限を回避できたようです。将来的には、この制限を順守してください。
アレックスA.

2
@undergroundmonorailまあ、チューリングは完全です...技術的には他の言語と同じようにPRNGを書くことができます。(播種は難しいかもしれません。)
PurkkaKoodari

回答:


13

CJam、62 59バイト

3バイトを節約してくれたnhahtdhに感謝します。

各no-opが有限確率で現れる限り、特定の分布に対する要件はないため、それぞれ、-+とのバランスの取れた数を含む文字列を生成し<>、それがNOPであるかどうかをテストし、そうではありません。

もちろん、より長い入力の場合、これはほとんど常にソートされた出力になります8が、原則として特定の長さのNOPを生成できるかどうかを確認するために、入力を使用してコードをテストできます。

ri_0a*\2/{;"-+<>":L2/mR}%smr:SL["Xa.Xm"3/2e*L]z:sers~0-S$S?

オンラインでお試しください。


1
はい...任意の制限は、10秒未満でn = 1000でした。今日のコンピューターはちょうど速い方法です^^ n = 1000でもアルゴリズムの答えが1秒未満で解決するため
Falco

さらに大きいnの場合、バランスの取れた文字列がNOPでない場合、出力をソートするだけでよいと思います。分布はひどくゆがんでいますが、質問で許可されています。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳それは素晴らしいアイデアです。
マーティンエンダー

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳おかげで、実際にここでも3バイトを節約できます。
マーティンエンダー

16

CJam、118 116バイト

これは少し手に負えなくなりました...特に後半は非常にゴルフに適しているようです。

ri2/_)mr:R-"<>"R*mr_'=fm0\{1$+}%+__&e`]:\{mr1aa..+}*\@](\z:~\{~\("+-"*mr1$3$e=[{_,)mr_2$<@@>}*+]@@f{`1$`={(}@?\}W<}/

ここでテストしてください。

これはN = 100ほとんど瞬時に処理します。現在、コードの完全な内訳を書く時間がないので、アルゴリズムは次のとおりです。

  • ランダムなバランスの取れた文字列を生成<し、>ランダム(さえ)の間の長さと0してN包括的に。
  • テープヘッドの位置をこの配列に合わせます。例えばに"<>><"なり[0 '< -1 '> 0 '> 1 '< 0]ます。
  • プロセスで到達したすべてのポジションのリストを取得します。
  • そのような位置ごとに空の文字列を初期化します。また、長さの文字列に達するために残っている文字のペアの数を決定しますN
  • 残りのペアごと+-に、ランダムな位置の文字列に追加します。
  • これらのすべての文字列をシャッフルします。
  • 各位置に対して、その位置が波打った配列で発生する頻度を決定し、対応する文字列をその多くの(ランダムな長さの)チャンクに分割します。
  • 波打った配列で、位置の出現をランダムなチャンクで置き換えます。

できた これは、次の観察に基づいています。

  • 任意のNOPは、同量のを持っている必要があります<し、>元の位置にテープヘッドを返すように。
  • 各テープセルがデクリメントされるたびにインクリメントされる限り、コードはNOPになります。

ランダムでバランスの取れた量の+sと-sを、テープヘッドが特定のセル上にあるすべての場所に分散することにより、すべての可能なNOPを確実に見つけることができます。


4

Mathematica、350バイト

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
説明を付け加えて、これが有効であると人々が実際に確信できるようにしてください。:)
マーティンエンダー

どのくらい正確に 機能しますか?数値で関数を呼び出すと、戻ります+
マーティンエンダー

@MartinBüttner修正済み...現在、同数のランダムプログラムを生成するだけです+--偶然NOPになるまで、と<- >ペアです。その半分は、単純なBFインタープリターによって取得されます。
LegionMammal978

それは実際に1分以内に長さ100の有効なノーオペレーションを生成しますか?
マーティンエンダー

@MartinBüttnerはい。平均して、約5秒かかります。最初は、私は完全にランダムなプログラムを試してみましたが、それは長さ100で終了しません
LegionMammal978

2

Python 3、177バイト

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

Python 3、163バイト

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でない場合、それを完全に破棄し、'+-'繰り返しにフォールバックします。


n = 100
l4m2の

@ l4m2その要件に気付かなかった。一定。
バブラー


1

Wolfram言語(Mathematica)、224バイト

(s=RandomSample[##&@@@Table["<"">",(r=RandomInteger)[#/2]]];While[(g=Length@s)<#,s=Insert[s=Insert[s,"+",i=r@g+1],"-",RandomChoice@@Select[GatherBy[0~Range~++g,Count[#,"<"]-Count[#,">"]&@Take[s,#]&],!FreeQ[#,i]&]+1]];""<>s)&

オンラインでお試しください!

以下は、ゴルフをしていない(または、ゴルフをしていない)バージョンです。

Function[{n},
 k = RandomInteger[n/2];
 s = RandomSample[## & @@@ Table["<" ">", k]];
 While[Length[s] < n,
   s = Insert[s, "+", i = RandomInteger[Length[s]] + 1];
   p = GatherBy[Range[0, Length[s]], 
     Count[#, "<"] - Count[#, ">"]& @ Take[s, #]&];
   j = RandomChoice @@ Select[p, ! FreeQ[#, i] &]];
   s = Insert[s, "-", j + 1];
   ];
 ""<>s]

まず、使用する<の数とをランダムに選択し、>それぞれの数が等しいランダムリストを生成します。

残りの文字を埋めるために、を追加する位置を選択してから+、ポインターが同じ場所を指す位置を見つけて、-そこにaを追加します。

リストが長さを持つまで繰り返します n、結果を文字列化します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.