Simulasikan komputer tipe bola biliar (berbasis gravitasi)

12

Mesin

Mesin jenis bola bilyar hanya terdiri dari simbol \ _ /bersama dengan huruf besar dan kecil, spasi, dan nomor 1.

\dan /landai. Bola yang datang dari atas akan dibelokkan ke kanan atau kiri. Untuk kedua landai, jika bola datang dari kedua sisi, itu akan dibelokkan ke bawah.

_adalah elemen logika. Logika yang dilakukan olehnya adalah bagian komputer yang paling tidak biliar. Pertama, bola yang datang dari kiri atau kanan berlanjut ke arah yang sama. Bola yang datang dari atas akan dihentikan. Kemudian, setelah akhir pelaksanaannya (lihat Menjalankan Mesin di bawah), jika jumlah bola yang melintas / mendarat di atasnya adalah bilangan genap positif, maka satu bola dilepaskan dari bagian bawah elemen.

Ruang tidak melakukan apa pun. Bola apa pun yang datang dari arah mana pun jatuh lurus ke bawah karena gravitasi.

Huruf kecil adalah input. Semua input akan menjadi 1 atau 0 tunggal.

Huruf besar adalah keluaran. Jumlah yang dikeluarkan akan menjadi jumlah bola biliar yang mengenai lokasinya.

Nomor tersebut 1melepaskan bola bilyar tambahan di lokasi itu. Ini mewakili 1 logis.

Semua karakter selain \_/menyebabkan bola yang datang dari arah mana pun jatuh lurus ke bawah karena gravitasi.

Bola tidak pernah bergabung, terpecah, atau bertabrakan. Mereka hanya dibuat ketika dilepaskan dari input, a _, atau a 1. Mereka hanya hancur ketika mereka jatuh lurus ke atas _.

Contoh mesin-

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

Tidak akan pernah ada garis kosong di mesin, tetapi _'s mungkin membuatnya tampak bahwa ada garis kosong.

Menjalankan Mesin

Mesin dijalankan dalam lapisan, atau baris. Semua gerakan bola bilyar di lapisan atas dilakukan sebelum sesuatu terjadi pada lapisan kedua.

Mesin

ab
\_A
 C

Dijalankan sebagai berikut:

Pertama, ini meminta input adalam formulir a:. Pengguna kemudian akan memasukkan 1 atau 0 (diikuti oleh enter). Itu mengulangi ini untuk input b. Ini adalah akhir dari lapisan pertama. Saya akan berasumsi bahwa pengguna memasukkan 1 untuk kedua input.

Kemudian jejak jejak bola pertama (dari a), yang berjalan di sepanjang \, di _, ke A, dan jatuh ke tempat di bawah A. Ini kemudian menelusuri jalur untuk bola kedua (dari b), yang langsung menuju ke bawah _dan berakhir. Ini adalah akhir dari lapisan kedua.

Sekarang, sebelum lapisan ketiga, karena _telah memiliki dua bola silang di atasnya, ia melepaskan satu bola. Outputnya Amemiliki satu bola silang, sehingga menghasilkan A:1.

Untuk lapisan ketiga, ia melacak jalur bola pertama (dari _), yang masuk ke dalam Cdan jatuh lurus ke bawah. Bola kedua (yang jatuh melalui A) juga jatuh lurus ke bawah.

Sekarang, sebelum lapisan keempat, karena output Cmemiliki satu bola yang melewatinya, output C:1.

Karena lapisan keempat kosong, program berakhir.

Hasil total akan terlihat seperti

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

Target

Tujuan Anda adalah untuk mengambil mesin dari STDIN dan mensimulasikannya dengan mengambil input dan mencetak hasil cetak yang diperlukan untuk STDOUT. Bagian pertama dari input ke program Anda akan terdiri dari mesin yang akan dijalankan, diikuti oleh baris kosong. Setiap huruf input yang ditemui harus menyebabkan program Anda meminta input dalam bentuk nama input diikuti oleh titik dua. Setiap output harus ditampilkan dalam bentuk nama output, diikuti oleh titik dua, diikuti oleh jumlah bola yang melewati tempat itu.

Ini golf.

Contohnya

Penyeberangan kawat

ab
\/
AB

Gerbang XOR

ab1
\_/
 C

Penambah penuh

1 a
\_/ b
  \_/
 \/
 /\
_ __/
 \_/ 
  \/c
 \\_/ 
  _S1
\  \/
 __/
  /
 _
\__
 C
PhiNotPi
sumber
Dalam contoh pertama Anda, mengapa bola pertama jatuh di bawah A? Apakah ada aturan tidak tertulis bahwa bola berhenti ketika mereka meneruskan ke karakter yang tidak \_/?
Peter Taylor
@PeterTaylor Ya, saya harus menambahkan bahwa semua huruf berperilaku sebagai ruang kosong dalam hal mempengaruhi bola, dan gravitasi menarik bola ke bawah.
PhiNotPi
1
Apakah Anda, secara kebetulan, berarti 'sirip', bukan 'billard'?
pengguna tidak diketahui
MAKE DIS AN ESOLANG
Matthew Roh
1
@AlexL. Juga relevan: Marbelous
PhiNotPi

Jawaban:

3

JavaScript ( 392 423)

Asumsikan mesin diatur dalam variabel yang dipanggil m, lalu beri tahu hasil akhir.

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)

Sumber sampel (menjalankan mesin adder, lihat riwayat untuk sumber yang kurang golf): http://jsfiddle.net/96yLj/12/

Spoiler:

- rMelacak # bola melintasi baris saat ini, nmelacak # bola di baris berikutnya.
- Algoritma: memproses setiap karakter baris dengan karakter, tetapi memproses yang _terakhir.
- Algoritma: \-> ikuti _dan tambah rsampai non- _. Sama untuk /tetapi dalam arah sebaliknya. Pada akhirnya peningkatan ngravitasi menarik bola ke bawah. gmemegang arah.
- if(L[d]>'@'&L[d]<'[')r[d]+=r[c];untuk bug yang disebutkan dalam Edit 1 . Alasan kami tidak bisa hanya mengatakan r[d]+=r[c];karena \_/akan menghitung bola ganda saat memproses /
- else if(C<'2')menangani kedua kasus '1'dan ' ', yang ~~Cberubah menjadi masing-masing 1 dan 0.


Sunting 1: Memperbaiki bug dengan bola berlarian _tidak termasuk dalam Auntuk kode sampel.

mellamokb
sumber
Perhatikan bahwa saya selalu mengabaikan persyaratan STDIN dan STDOUT karena merupakan batasan yang tidak menarik. Saya menggunakan promptuntuk input dan alertuntuk output yang cukup standar untuk JavaScript :-)
mellamokb