TwoMegaを解釈する


9

この課題では、あなたがのために通訳書き込みます2 Ω(として転写TwoMega)、ゆるくに基づく言語brainfuck無限次元の収納スペースとを。

言語

2 Ωは、状態の3枚が含まれています。

  • テープ全て0に初期化ビットの無限のリストである、それは、左端の要素、ない右端の要素を有しています。

  • メモリポインタテープの要素のインデックスである非負整数です。上位のメモリポインタは、さらに右側のテープセルを指します。0のメモリポインタは、左端の要素を参照します。メモリポインタは0に初期化されます。

  • ハイパーキューブ概念的であり、ハイパーキューブの幅はわずか2細胞にすべての次元で結合したが、寸法の無限の数を意味している0に初期化ビットを含む各々がセルの次元「ボックス」、細胞は数えられない

ハイパーキューブへのインデックスは、ハイパーキューブ内のセルを参照するビットの無限リストです(ビットの有限リストを使用して有限次元のハイパーキューブを参照するのと同じ方法で)。テープはビットの無限リストであるため、テープ全体は常にハイパーキューブの要素を参照します。この要素は参照対象と呼ばれます。

2 Ωは、 7種類の文字に意味を与えます:

  • < メモリポインタを1だけデクリメントします。0未満にデクリメントすることは未定義の動作であるため、処理する必要はありません。
  • > メモリポインタを1だけインクリメントします。
  • ! リファレントでビットを反転します。
  • . リファレントでビットを出力します。
  • ^テープ上のメモリポインターが指すセルのビットを、参照先のビットのに置き換えます。
  • [x]xリファレントのビットが1である限り、コードを実行します。

チャレンジ

あなたの仕事は、文字列を入力として受け取り、その入力をプログラムとして実行するプログラムを作成することです。

これはなので、有効な最短の回答(バイト単位)が優先されます。

ノート

  • プログラムは文字のみで構成され、適切にネストされる<>!.^[]と想定でき[]ます。
  • インタプリタは、システムで利用可能なメモリによってのみ制限されるべきです。サンプルプログラムを妥当な時間で実行できるはずです。

サンプルプログラム

印刷1:

!.

印刷010:

.!.!.

永久に0を印刷します。

![!.!]

永遠に0を出力します!

[.]![!.!]

2
小さな注記:1テープ上のs の数は常に有限であるため、ストレージセルの数は実際には数えられません。実際、自然数とテープの状態の間にはかなり単純な全単射があります(テープの内容を逆2進数として解釈します)。これは、ハイパーキューブが基本的に無限の1D配列であり、整数ポインター値のビット反転することによってアクセスされることを示しています、brainfuckのようにイン/デクリメントする代わりに。
リン

また、re:catプログラムを作成するための招待状:入力を取得するための指示がないようです。
リン

2
より多くの命令セットを使用するサンプルプログラムがあるはずだと思います。2つの単純なもの: .-単一のゼロを出力してから存在します。!^!.-1つ出力してから終了します。もっともっといいのに。現時点では、提出物を確認して検証するために提出物を理解する必要があります(したがって、賛成投票します!)
Jonathan Allan

@Lynn入力は、セルに1または0のいずれか[0,0,0,0,0,0,0...](つまり!、プログラムの開始時にaが存在すること)によって与えられます。
Esolanging Fruit

その後[.]![!.!]、そのセルの値を永久に印刷することができます
レオ

回答:


2

Python 2、167バイト

t=h=I=0
m=1
E=''
for c in input():i='[<>!.^]'.find(c);E+=' '*I+'while+2**t&h: m/=2 m*=2 h^=2**t print+(2**t&h>0) t=t&~m|m*(2**t&h<1) #'.split()[i]+'\n';I-=~-i/5
exec E

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

tはテープです。t = 6は、テープが[0 1 1 0 0 0…]であることを意味します

mは、メモリポインタの2乗です。したがって、m = 8は、テープのビット3を指していることを意味します。

hは超立方体です。h = 80(ビット4および6が設定されている)は、[0 0 1 0…]および[0 1 1 0…]のビットが設定されていることを意味します。

指示対象でビットを読み取るために、2 t&hをチェックします。それを反転するには、h ^ = 2 tを実行します。

命令をPythonコードに変換し、結果を実行します。whileループのインデントレベル保存します。


プログラムまたは2番目のテストケースのいずれかが間違っています
wastl

@wastl 2番目のテストケースは間違っていました。;)
DLosc


2

JavaScript(Node.js)、148バイト

x=>eval(x.replace(e=/./g,c=>({'<':'u/=2','>':'u*=2','!':'e[v]^=1','.':'alert(+!!e[v])','^':'v=(v|u)^u*e[v]','[':'while(e[v]){'}[c]||'}')+';',v=u=1))

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

完全に調子がいい

BoolFuck TwoMega
< >^>^>[!]^<<<<[!]^>>[!]!^>[!]!^>[!]!^<<<<(>^>^>1<<<<1>>0>0>0<<<<)
> ^<^<[!]^>>>>[!]^<<[!]!^<[!]!^<[!]!^>>>(^<^<1>>>>1<<0<0<0>>>)

右にいくつかの場所を移動して初期化する必要があり、アドレスの現在および右の1ビットを1として初期化する(>>>>>>>>^>^<

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

場所nBoolFuckでは、次のように書かれています(0, 0, ..., 0(n*0), [1], 1, 0, 0, ...)

の場合>n=>n+1

     0 0 0 0 0[1]1 0 0 0 0
^    0 0 0 0 0[x]1 0 0 0 0
<    0 0 0 0[0]x 1 0 0 0 0
^    0 0 0 0[y]x 1 0 0 0 0, yx != 01
<    0 0 0[0]y x 1 0 0 0 0
[!]^ 0 0 0[1]y x 1 0 0 0 0, (0yx10) = 0
>>>> 0 0 0 1 y x 1[0]0 0 0
[!]^ 0 0 0 1 y x 1[1]0 0 0, (1yx10) = 0
<<   0 0 0 1 y[x]1 1 0 0 0
[!]! 0 0 0 1 y[x]1 1 0 0 0, (1yx11) = 1
^    0 0 0 1 y[0]1 1 0 0 0
<    0 0 0 1[y]0 1 1 0 0 0
[!]! 0 0 0 1[y]0 1 1 0 0 0, (1y011) = 1
^    0 0 0 1[0]0 1 1 0 0 0
<    0 0 0[1]0 0 1 1 0 0 0
[!]! 0 0 0[1]0 0 1 1 0 0 0, (10011) = 1
^    0 0 0[0]0 0 1 1 0 0 0
>>>  0 0 0 0 0 0[1]1 0 0 0

<仕事の仕方と同じ


この翻訳は有効ですか?boolfuckで!>.印刷1しますが、TwoMegaで!>^.1を印刷するように変換します(>テープに^は影響しません。参照先が1であるため、テープには影響しません)
Esolanging Fruit

@EsolangingFruit +>;do [1]00... 1[0]0...(出力0)、!>^.do (0,0,...)=1, ptr=([0],0,...) (0,0,...)=1, ptr=(0,[0],...) (0,0,...)=1, ptr=(0,[1],...)(出力0)、何が問題なのですか?
l4m2

@EsolangingFruitは!>.、boolfuckで>有効なコマンドです...
ASCIIのみ

1
@ l4m2 TwoMegaでは、テープセルで!はなく指示対象を反転します。
Esolanging Fruit

@EsolangingFruitなので、ここで何が問題になっていますか?
l4m2

1

Brain-Flak Classic、816バイト

<>(((<(())>)))<>{(([][][])(((({}){}[])({}))({})[]([][](({})(({}())(({}){}{}({}(<()>))<{<>({}<>)}{}>))))))(([]{()(<{}>)}{}){<((<{}>))<>(()(){[](<{}>)}{}<{({}[]<({}<>)<>>)}{}{}>)<>({()<({}<>)<>>}<<>{<>(({}){}<>({}<>)[])<>}{}<>({()<({}[]<<>({}<>)>)>}{})<>(({})<<>{({}[]<({}<>)<>>)}({}<>)<>{({}<>)<>}>)<>>)<>({}<>)<>>}{}([]{()(<{}>)}{}){{}<>({})(<>)}{}([]{()(<{}>)}{}){(<{}<>({}<{((<({}[])>))}{}{((<(())>))}{}>)<>>)}{}([]{()(<{}>)}{}){(<{}<>({}<({}())>)<>>)}{}([]{()(<{}>)}{}){(<{}<>[({})]<>>)}{}([]{()(<{}>)}{})<{((<{}>))<>{}({}<{<>(({}){}<>({}<>)[])<>}{}<>({()<({}[]<<>({}<>)>)>}{})<>(((){[](<{}>)}{})<<>{({}[]<({}<>)<>>)}{}(<>)<>{({}<>)<>}>)<>>)<>({}<>)<>}{}(<>)<>{({}<>)<>}{}>()){((({}[]<>){(<{}({}<>)>)}{}())<{({}<({}<>)<>((((((([][][]){}){}){}()){}){}({})())[][])>{[](<{}>)}{}{()(<{}>)}{})}{}({}<>)>[]){{}(<>)}}{}}

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

このコードは、チューリング完全性の証明を書く場所があるように書かれたものです。

チューリング完全性の証明

BoolfuckからTwoMegaへの削減を示します。

Boolfuck   TwoMega
>          >>
<          <<
.          !^!.!^!
[          !^![!^!
]          !^!]!^!
+          !^[!]^[>!^<[!]!^>[!]!^<]

この翻訳は、Boolfuckの状態をTwoMegaの偶数番号のテープセルに保存します。変換されたコマンドはすべて、次の不変条件を保持します。

  • メモリポインタは偶数番号のセルにあります。
  • 奇数番号のテープセルはすべてゼロです。
  • 奇数番号のセルがすべてゼロのテープの場合、ハイパーキューブの対応する値はゼロです。

スニペット!^![0]0一定に保たれ、との間でスワップ0[0]します[1]1(注意は、メモリポインターを移動せずに到達可能なハイパーキューブ上の行に限定されます)。そのため、現在のテープ値を一時的に、それを気にするBoolfuckコマンドの指示対象に入れるために使用されます。

TwoMegaに,期待されるセマンティクスの入力コマンドが与えられた場合、Boolfuckコマンド,はに変換され>^<,!^>[!]!^<ます。,Boolfuckがチューリング完全であることを証明する必要はないので、入力コマンドがなくてもこの証明には影響しません。


それは主に、キューブ自体ではなく、ハイパーキューブの位置に情報を格納しますか?
l4m2

@ l4m2 BoolFuckによる削減では、キューブ自体にデータが格納されません。私はハイパーキューブ上で行うすべての1sが0に設定したテープの細胞にのみ存在している
Nitrodon

0

Pythonの3297の 284 274バイト

ovsとJonathan Allanのおかげで-10バイト

C=input()
h={}
t=set()
def f(C,p):
 c=C[0];r=hash(frozenset(t));v=h.get(r,0)
 p={"<":p-1,">":p+1}.get(c,p)
 if'"'>c:h[r]=not v
 if"."==c:print(int(v))
 if"]"<c:t.discard(p)if v else t.add(p)
 if"["==c:
  while f(C[1:],p):1
 else:return c=="]"and v or C and f(C[1:],p)
f(C,0)

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


t.discard(p)->t-={p}
shooqie

しない限り動作しません@shooqie tですglobal
fergusq 2018年

@fergusqあなたが次のように宣言するfとうまくいくと確信していますがf(C,p,t=set())
shooqie

0

ピップ75 71バイト

lPB0aR:^"!><[].^_""!:_
--viPU0
++v
W_{
}
O_
i@v:!_LFBilPB0
l@FBi"^n;Vau

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

コードを同等のPipコードに変換して評価します。

iテープ、vテープポインター*、およびlハイパーキューブを表すために使用します。最初の2つは有用な値に事前初期化されています。lとして開始し[]、インデックス作成の空リストの問題を回避するために0lPU0)をプッシュします。

*実際には、テープポインターのビット単位の否定です。これは、10進数に簡単に変換できるようにテープを逆方向に格納しているためです。

残りのコードは次のとおりです。

aR:...;     Do a bunch of replacements in a, translating it into Pip code
       Va   Evaluate a
         u  Suppress output of the final expression that was evaluated

変換テーブル:

!  !:_
>  --viPU0
<  ++v
[  W_{
]  }
.  O_
^  i@v:!_LFBilPB0
_  l@FBi

l@FBi指示対象です:lインデックスでのハイパーキューブの要素(iバイナリから変換)。それは頻繁に現れるので、それを呼び出して、最後に実際のコードに_置き換え_ます。

  • !:_ 指示対象を論理的に否定します。

  • --viPU0デクリメントv(テープポインターを右に移動); 次に、もう1つ0をの左側にプッシュiして、テープポインターが境界内に留まるようにします。

  • ++v増分v(OPごとの境界チェックは不要)。

  • W_{指示対象が真実(つまり、ゼロ以外、つまり1)のときにループを実行します。

  • } ループを閉じます。

  • O_ 改行なしで指示対象を出力します。

最後に、のために^

i@v:            Set the current tape cell to
    !_          The logical negation of the referent
                Now, make sure the list representing the hypercube is long enough:
      LFBi      Loop frombinary(i) times:
          lPB0  Push another 0 to the end of l
                This ensures that FBi will always be a valid index into l
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.