จำลองคอมพิวเตอร์ประเภทลูกบิลเลียด (ตามแรงโน้มถ่วง)


12

เครื่องจักร

เครื่องประเภทบิลเลียดลูกประกอบด้วยเพียงสัญลักษณ์พร้อมกับบนและกรณีที่ต่ำกว่าตัวอักษรช่องว่างและจำนวน\ _ /1

\และ/เป็นทางลาด ลูกบอลที่มาจากด้านบนจะถูกเบี่ยงเบนไปทางด้านขวาหรือด้านซ้ายตามลำดับ สำหรับทางลาดทั้งสองถ้าลูกบอลมาจากด้านใดด้านหนึ่งมันจะเบี่ยงลงไป

_เป็นองค์ประกอบตรรกะ ตรรกะดำเนินการโดยเป็นส่วนที่ไม่เหมือนบิลเลียดมากที่สุดของคอมพิวเตอร์ อย่างแรกลูกบอลที่มาจากทางซ้ายหรือขวาจะดำเนินต่อไปในทิศทางเดียวกัน ลูกบอลที่มาจากด้านบนจะหยุดลง จากนั้นหลังจากสิ้นสุดการประมวลผล (ดูที่การรันเครื่องด้านล่าง) หากจำนวนลูกที่ข้าม / ลงบนมันเป็นจำนวนที่เป็นบวกแม้กระทั่งลูกเดียวจะถูกปล่อยจากด้านล่างขององค์ประกอบ

พื้นที่ไม่ทำอะไรเลย ลูกบอลใดก็ตามที่มาจากทิศทางใดก็ตกลงมาเนื่องจากแรงโน้มถ่วง

อักษรตัวพิมพ์เล็กเป็นอินพุต อินพุตทั้งหมดจะเป็น 1 หรือ 0 เดียว

ตัวอักษรตัวพิมพ์ใหญ่เป็นผลลัพธ์ จำนวนเอาท์พุทจะเป็นจำนวนของลูกบิลเลียดที่ตีตำแหน่งของมัน

จำนวน1จะปล่อยลูกบิลเลียดเพิ่มที่ตำแหน่งนั้น เพราะมันหมายถึงตรรกะ 1

ตัวละครทุกตัวนอกจากจะ\_/ทำให้ลูกบอลจากทิศทางใดตกลงมาเนื่องจากแรงโน้มถ่วง

ลูกไม่เคยรวมกันแยกหรือชนกัน สิ่งเหล่านี้จะถูกสร้างขึ้นเมื่อปล่อยจากอินพุต, a _หรือ a 1เท่านั้น _พวกเขาจะถูกทำลายเฉพาะเมื่อพวกเขาล้มลงตรงไปยัง

เครื่องตัวอย่าง -

1 a
\_/ b
  \_/
 \/
 /\ /
_  _
A  B

จะไม่มีบรรทัดว่างใด ๆ ในเครื่อง แต่_อาจทำให้ปรากฏว่ามีบรรทัดว่างเปล่า

ใช้งานเครื่อง

เครื่องจักรทำงานในเลเยอร์หรือแถว การเคลื่อนไหวของลูกบิลเลียดทั้งหมดที่ชั้นบนสุดจะดำเนินการก่อนที่จะเกิดอะไรขึ้นในชั้นที่สอง

เครื่องจักร

ab
\_A
 C

รันดังนี้:

ครั้งแรกก็แจ้งให้สำหรับการป้อนข้อมูลในรูปแบบa a:ผู้ใช้จะป้อน 1 หรือ 0 (ตามด้วย Enter) bมันซ้ำนี้สำหรับการป้อนข้อมูล นี่คือจุดสิ้นสุดของเลเยอร์แรก ฉันจะสมมติว่าผู้ใช้ป้อน 1 สำหรับอินพุตทั้งสอง

จากนั้นก็มีร่องรอยจากเส้นทางของลูกแรก (จากa) ซึ่งจะไปตาม\ข้าม_เข้าและตรงลงไปยังจุดภายใต้A Aจากนั้นจะออกนอกเส้นทางสำหรับลูกบอลลูกที่สอง (จากb) ซึ่งไปลงบน_และสิ้นสุด นี่คือจุดสิ้นสุดของเลเยอร์ที่สอง

ตอนนี้ก่อนที่เลเยอร์ที่สามเนื่องจาก_มันมีสองลูกที่ข้ามมันมันปล่อยหนึ่งลูก เอาท์พุทมีลูกหนึ่งข้ามมันดังนั้นมันจะออกผลลัพธ์AA:1

สำหรับเลเยอร์ที่สามมันจะติดตามเส้นทางของบอลลูกแรก (จาก_) ซึ่งไปแม้ว่าCและจะตกลงไป ลูกที่สอง (ซึ่งหล่นผ่านไปA) ก็ตกลงมาตรงๆ

ตอนนี้ก่อนที่ชั้นสี่เนื่องจากการส่งออกมีการเดินทางลูกหนึ่งมากกว่านั้นมันจะออกผลลัพธ์CC:1

เนื่องจากเลเยอร์ที่สี่นั้นว่างเปล่าโปรแกรมจึงถูกยกเลิก

ผลรวมควรมีลักษณะ

a:1     (the user entered the one)
b:1     (same here)
A:1
C:1

เป้าหมาย

เป้าหมายของคุณคือการใช้เครื่องจักรจาก STDIN และจำลองมันโดยรับอินพุตและเอาต์พุตการพิมพ์ตามต้องการเพื่อ STDOUT ส่วนแรกของอินพุตไปยังโปรแกรมของคุณจะประกอบด้วยเครื่องที่จะทำงานตามด้วยบรรทัดว่าง ตัวอักษรอินพุตที่พบควรทำให้โปรแกรมของคุณพร้อมท์ให้ป้อนข้อมูลในรูปแบบของชื่ออินพุตตามด้วยเครื่องหมายโคลอน ควรแสดงผลลัพธ์ใด ๆ ในรูปแบบของชื่อเอาต์พุตตามด้วยเครื่องหมายโคลอนตามด้วยจำนวนลูกบอลที่ส่งผ่านจุดนั้น

นี่คือกอล์ฟ

ตัวอย่าง

ข้ามสาย

ab
\/
AB

ประตู XOR

ab1
\_/
 C

งูพิษเต็ม

1 a
\_/ b
  \_/
 \/
 /\
_ __/
 \_/ 
  \/c
 \\_/ 
  _S1
\  \/
 __/
  /
 _
\__
 C

ในตัวอย่างแรกของคุณทำไมลูกแรกล้มลงใต้ A มีกฎที่ไม่ได้เขียนไว้หรือไม่ว่าลูกบอลจะหยุดเมื่อพวกเขาผ่านไปสู่ตัวละครที่ไม่ใช่\_/หรือ?
Peter Taylor

@PeterTaylor ใช่ฉันควรเพิ่มว่าตัวอักษรทั้งหมดทำตัวเหมือนพื้นที่ว่างเปล่าเมื่อมันกระทบกับลูกและแรงโน้มถ่วงดึงบอลลงมา
PhiNotPi

1
คุณหมายถึง 'flipper' ไม่ว่า 'billard' ใช่ไหม?
ผู้ใช้ที่ไม่รู้จัก

ทำ ESOLANG
Matthew Roh

1
@AlexL สิ่งที่เกี่ยวข้อง: Marbelous
PhiNotPi

คำตอบ:


3

JavaScript ( 392 423)

สมมติว่าเครื่องถูกตั้งค่าในตัวแปรที่เรียกว่าmจากนั้นแจ้งเตือนผลลัพธ์สุดท้าย

l=m.split(q='\n');o='';for(r=Array(z=l[i=0].length);i<l.length;i++){L=l[i];n=Array(z);for(c=0;c<z;n[c]=N,r[c++]=R){C=L[c];N=~~n[c];R=~~r[c];if(C>'`'){N+=x=~~prompt(C);R+=x;o+=C+': '+x+q}else if(C=='\\'||C=='/'){for(d=c+(g=C=='/'?-1:1);L[d]=='_';r[d]+=R,d+=g);if(L[d]>'@'&L[d]<'[')r[d]+=r[c];n[d]=~~n[d]+R}else if(C<'2')N+=R+=~~C;else if(C!='_')o+=C+': '+R+q}for(c=0;c<z;c++)if(L[c]=='_')n[c]+=(r[c]%2)?0:r[c]>0;r=n}alert(o)

ตัวอย่างแหล่งที่มา (เรียกใช้เครื่อง adder ดูประวัติของแหล่ง golfed น้อยกว่า): http://jsfiddle.net/96yLj/12/

สปอยเลอร์:

- rติดตามจำนวนลูกบอลในแถวปัจจุบันnติดตาม # บอลในแถวถัดไป
- อัลกอริทึม: ประมวลผลแต่ละแถวของตัวละครโดยตัวละคร แต่_สุดท้ายของกระบวนการ
- ขั้นตอนวิธีการ: \-> ปฏิบัติตาม_และการเพิ่มขึ้นจนไม่r _เหมือนกัน/แต่กลับทิศทาง ในตอนท้ายเพิ่มnแรงโน้มถ่วงสำหรับดึงลูกบอลลง gถือทิศทาง
- if(L[d]>'@'&L[d]<'[')r[d]+=r[c];สำหรับข้อผิดพลาดที่กล่าวถึงในที่แก้ไข 1 เหตุผลที่เราไม่สามารถเพียงแค่บอกว่าr[d]+=r[c];เป็นเพราะ\_/จะเป็นสองเท่านับลูกเมื่อการประมวลผล/
- else if(C<'2')จับทั้งสองกรณี'1'และ' 'ซึ่ง~~Cกลายเป็นที่ 1 และ 0 ตามลำดับ


แก้ไข 1:แก้ไขข้อผิดพลาดที่มีการใช้บอลเกิน_ไม่รวมอยู่ในAรหัสตัวอย่าง


โปรดทราบว่าฉันไม่สนใจข้อกำหนดของ STDIN และ STDOUT เสมอเนื่องจากเป็นข้อ จำกัด ที่ไม่น่าสนใจ ฉันใช้promptสำหรับอินพุตและalertเอาต์พุตที่ค่อนข้างมาตรฐานสำหรับ JavaScript :-)
mellamokb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.