ตีความ TwoMega


9

ในความท้าทายนี้คุณจะเขียนล่ามสำหรับ2 Ω (ถ่ายเมื่อTwoMega ) ภาษาเคร่งครัดตามbrainfuckที่มีพื้นที่จัดเก็บอนันต์มิติ

ภาษา

2 Ωมีสถานะสามส่วน:

  • เทปซึ่งเป็นรายการที่ไม่มีที่สิ้นสุดของบิตทั้งหมดเริ่มต้นได้ที่ 0 มันมีองค์ประกอบทางด้านซ้ายสุด แต่ไม่มีองค์ประกอบด้านขวาสุด

  • หน่วยความจำตัวชี้ซึ่งเป็นติดลบที่เป็นดัชนีขององค์ประกอบในเทป ตัวชี้หน่วยความจำที่สูงกว่าหมายถึงเซลล์เทปทางด้านขวา ตัวชี้หน่วยความจำ 0 หมายถึงองค์ประกอบด้านซ้ายสุด ตัวชี้หน่วยความจำถูกเตรียมใช้งานเป็น 0

  • Hypercubeซึ่งเป็นแนวคิดมิติ "กล่อง" ของเซลล์แต่ละที่มีบิตเริ่มต้น 0 ความกว้างของ Hypercube ถูกผูกไว้ในทุกมิติให้เพียง 2 เซลล์ แต่อินฟินิตี้ของมิติหมายถึงจำนวนของ เซลล์คือนับไม่ได้

ดัชนีเข้า hypercube เป็นรายการที่ไม่มีที่สิ้นสุดของบิตที่หมายถึงเซลล์ใน hypercube ที่ (ในทางเดียวกันว่าเป็นรายการที่ จำกัด ของบิตสามารถนำมาใช้ในการอ้างถึง hypercube ของมิติ จำกัด ก) เนื่องจากเทปเป็นรายการที่ไม่มีที่สิ้นสุดของบิตเทปทั้งหมดจึงอ้างอิงองค์ประกอบของ Hypercube เสมอ องค์ประกอบนี้จะเรียกว่าอ้างอิง

2 Ωให้ความหมายถึง 7 ตัวอักษรที่แตกต่างกัน:

  • < ลดค่าตัวชี้หน่วยความจำลงด้วย 1 การลดระดับลงต่ำกว่า 0 เป็นพฤติกรรมที่ไม่ได้กำหนดดังนั้นคุณไม่จำเป็นต้องจัดการมัน
  • > เพิ่มตัวชี้หน่วยความจำทีละ 1
  • ! พลิกบิตที่ผู้อ้างอิง
  • . ส่งออกบิตที่อ้างอิง
  • ^แทนที่บิตที่เซลล์ที่ชี้โดยตัวชี้หน่วยความจำบนเทปด้วยค่าผกผันของบิตที่ตัวอ้างอิง
  • [x]รันโค้ดxตราบเท่าที่บิตที่ผู้อ้างอิงคือ 1

ความท้าทาย

งานของคุณคือการเขียนโปรแกรมที่ใช้เวลาสตริงเป็น input และดำเนินการป้อนข้อมูลที่เป็น 2 Ωโปรแกรม

นี่คือ ดังนั้นคำตอบที่ถูกต้องสั้นที่สุด (วัดเป็นไบต์) ชนะ

หมายเหตุ

  • คุณสามารถสันนิษฐานได้ว่าโปรแกรมจะมีเพียงตัวอักษร<>!.^[]และ[]จะซ้อนกันอย่างเหมาะสม
  • ล่ามของคุณควรถูก จำกัด ด้วยหน่วยความจำที่มีอยู่ในระบบ มันควรจะสามารถรันโปรแกรมตัวอย่างในเวลาที่เหมาะสม

โปรแกรมตัวอย่าง

พิมพ์ 1:

!.

พิมพ์ 010:

.!.!.

พิมพ์ 0 ตลอดไป:

![!.!]

พิมพ์ 0 ตลอดไปหรือ 1 ตลอดกาลหากได้!รับการเติม:

[.]![!.!]

2
ข้อสังเกตเล็ก ๆ : จำนวนของที่เก็บข้อมูลของเซลล์นั้นไม่สามารถนับได้จริง ๆ เนื่องจากจำนวนของ1s บนเทปนั้น จำกัด เสมอ ในความเป็นจริงมี bijection ค่อนข้างง่ายระหว่างตัวเลขธรรมชาติและรัฐเทป (ตีความเนื้อหาเทปเป็นเลขฐานสองย้อนหลัง) ซึ่งแสดงให้เห็นว่า Hypercube นั้นเป็นอาร์เรย์อนันต์ 1D เข้าถึงโดยพลิกบิตในค่าตัวชี้จำนวนเต็ม แทนที่จะเป็นใน / ลดลงเช่นเดียวกับใน brainfuck
ลินน์

อีกครั้ง: คำเชิญของคุณให้เขียนcatโปรแกรม: ดูเหมือนจะไม่มีคำแนะนำสำหรับการป้อนข้อมูล
ลินน์

2
ฉันคิดว่าควรมีโปรแกรมตัวอย่างโดยใช้ชุดคำสั่งมากกว่าสองรายการง่ายๆ: .- พิมพ์ศูนย์เดียวแล้วมีอยู่; !^!.- พิมพ์หนึ่งเดียวจากนั้นออก จะดีกว่านี้อีก ในขณะนี้เราต้องเข้าใจสิ่งที่ส่งมาเพื่อตรวจสอบความถูกต้องของพวกเขา (และเพิ่มการโหวตขึ้น!)
Jonathan Allan

@Lynn อินพุตจะได้รับจากการมี 1 หรือ 0 ในเซลล์[0,0,0,0,0,0,0...](เช่นการมีอยู่ของ a !เมื่อเริ่มต้นโปรแกรม)
แยกผลไม้

จากนั้นคุณสามารถ[.]![!.!]พิมพ์ค่าของเซลล์นั้นได้ตลอดไป
Leo

คำตอบ:


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คือ hypercube h = 80 (ชุดบิต 4 และ 6) หมายถึงบิตที่ [0 0 1 0 …] และ [0 1 1 0 …] ถูกตั้งค่า

หากต้องการอ่านบิตที่อ้างอิงที่เราตรวจสอบ2 T & h จะพลิกมันที่เราดำเนินชั่วโมง ^ = 2ตัน

เราแปลคำแนะนำเป็นรหัส Python และดำเนินการผลลัพธ์ ฉันเก็บระดับการเยื้องของลูปในขณะนั้น


ไม่ว่าโปรแกรมของคุณหรือกรณีทดสอบครั้งที่สองจะผิด
ทำลาย

@wastl กรณีทดสอบที่สองผิด ;)
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>>>)

ต้องการ init ในการย้ายสถานที่ที่ถูกต้องและเริ่มต้นที่อยู่ปัจจุบันและขวาหนึ่งบิตของที่อยู่เป็น 1 ( >>>>>>>>^>^<)

ลองออนไลน์!

สถานที่nใน BoolFuck (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

เช่นเดียวกับวิธีการ<ทำงาน


คุณแน่ใจว่าการแปลนี้ถูกต้องหรือไม่ !>.พิมพ์1ใน boolfuck แต่แปล!>^.ว่าพิมพ์ 1 ใน TwoMega ( >ไม่ส่งผลกระทบต่อเทป^ไม่ส่งผลกระทบต่อเทปตั้งแต่ผู้อ้างอิงคือ 1)
ผลไม้ที่เสแสร้ง

@EsolangingFruit +>;ทำ[1]00... 1[0]0...(เอาต์พุต 0) !>^.ทำ(0,0,...)=1, ptr=([0],0,...) (0,0,...)=1, ptr=(0,[0],...) (0,0,...)=1, ptr=(0,[1],...)(เอาต์พุต 0) เกิดอะไรขึ้น
l4m2

@EsolangingFruit สำหรับ!>.เพียง>คำสั่งที่ถูกต้องใน boolfuck ...
เท่านั้น

1
@ l4m2 ใน TwoMega กลับ!การอ้างอิงไม่ใช่เซลล์เทป
แยกผลไม้

@EolangingFruit ดังนั้นที่นี่มีอะไรผิดปกติ?
l4m2

1

Brain-Flak Classic , 816 ไบต์

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

ลองออนไลน์!

รหัสนี้ถูกเขียนขึ้นดังนั้นฉันจึงมีที่สำหรับเขียนหลักฐานของทัวริงครบถ้วน

หลักฐานการทัวริงสมบูรณ์

เราแสดงการลดลงจาก Boolfuck เป็น TwoMega:

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

การแปลนี้จัดเก็บสถานะ Boolfuck ในเทปเซลล์ที่มีเลขคู่ใน TwoMega คำสั่งที่แปลทั้งหมดจะเก็บค่าคงที่ดังต่อไปนี้:

  • ตัวชี้หน่วยความจำอยู่ที่เซลล์ที่มีเลขคู่
  • เซลล์เทปที่มีหมายเลขคี่ทั้งหมดเป็นศูนย์
  • สำหรับเทปที่เป็นไปได้ใด ๆ ที่มีเซลล์เลขคี่ทั้งหมดศูนย์ค่าที่สอดคล้องกันของ hypercube จะเป็นศูนย์

ตัวอย่าง!^!จะเก็บ[0]0ค่าคงที่และสลับระหว่าง0[0]และ[1]1(ซึ่งความสนใจจะถูก จำกัด ที่บรรทัดบนไฮเปอร์คิวบ์ที่สามารถเข้าถึงได้โดยไม่ย้ายตัวชี้หน่วยความจำ) เช่นนี้จะใช้เพื่อใส่ค่าเทปปัจจุบันชั่วคราวลงในการอ้างอิงสำหรับคำสั่ง Boolfuck ซึ่งดูแลเกี่ยวกับมัน

หาก TwoMega ได้รับคำสั่งการป้อนข้อมูล,ที่มีความหมายที่คาดว่าคำสั่ง Boolfuck จะแปล, >^<,!^>[!]!^<เนื่องจาก,ไม่จำเป็นต้องพิสูจน์ว่า Boolfuck นั้นเป็นทัวริงสมบูรณ์การขาดคำสั่งอินพุตจึงไม่ส่งผลต่อการพิสูจน์นี้


มันเก็บข้อมูลเป็นส่วนใหญ่ในตำแหน่งในไฮเปอร์คิวบ์แทนที่จะเป็นลูกบาศก์ใช่หรือไม่
l4m2

@ l4m2 การลดลงของฉันจาก BoolFuck ไม่ได้จัดเก็บข้อมูลใด ๆ ในคิวบ์เอง 1s ใด ๆ ที่ฉันทำบน hypercube นั้นจะตั้งค่าเซลล์เทปให้เป็น 0 เท่านั้น
Nitrodon

0

Python 3 , 297 284 274 ไบต์

-10 ไบต์ขอบคุณสำหรับ ovs และ Jonathan Allan

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

@fergusq แม้ว่าฉันจะค่อนข้างแน่ใจว่ามันใช้งานได้ถ้าคุณประกาศfเป็นf(C,p,t=set())
shooqie

0

Pip , 75 71 ไบต์

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

ลองออนไลน์!

แปล 2 Ωรหัสลงในรหัส Pip เทียบเท่าและประเมินมัน

เราใช้iเพื่อเป็นตัวแทนของเทปvสำหรับตัวชี้เทป * และlสำหรับ hypercube สองคนแรกมีค่าเริ่มต้นมาเป็นค่าที่เป็นประโยชน์ lเริ่มต้น[]จากที่เรากด0( lPU0) เพื่อหลีกเลี่ยงปัญหาการทำดัชนีรายการที่ว่างเปล่า

* อันที่จริงมันเป็นการลบล้างตัวชี้เทปในระดับบิตเนื่องจากเรากำลังเก็บเทปไว้ข้างหลังเพื่อให้การแปลงเป็นทศนิยมได้ง่ายขึ้น

ส่วนที่เหลือของรหัสคือ:

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คือการอ้างอิง: องค์ประกอบของ hypercube lที่ดัชนี (แปลงiจากไบนารี) มันปรากฏขึ้นบ่อยครั้งดังนั้นเราจึงเรียกมัน_และแทนที่_ด้วยรหัสจริงในตอนท้าย

  • !:_ มีเหตุผลปฏิเสธการอ้างอิงในสถานที่

  • --viPU0decrements v(เลื่อนตัวชี้เทปไปทางขวา); จากนั้นดันอีกอัน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.