@0@6000000@5
}0&0&0&0&0
>0@6&3
\\--\/&2
@0/\@4\/&1!!
@4@1..@2@5@3
IIIIIIIIIIII
FF&1FF&2FF&3
@1OO@2OO@3OO
:I
}1..}10001F7
=9&1++..&1&0
&0}0&1&0{1{1
{>\/{0//
:O
}0
+Z
+C
{0
Ini hanya berfungsi untuk nilai di bawah 256 karena Marbelous adalah bahasa 8 bit.
Bagaimana itu bekerja
Marbelous adalah bahasa 2D dengan nilai-nilai yang diwakili oleh kelereng 8 bit yang jatuh satu sel pada setiap centang kecuali beberapa perangkat mencegahnya jatuh. Program Marbelous ini terdiri dari 3 papan; mari kita mulai dengan yang termudah:
:O
}0
+Z
+C
{0
:Oadalah nama papan (tepatnya, O adalah nama dan: memberi tahu yang ditafsirkan bahwa baris ini adalah nama. Dengan memberi papan nama, papan lain dapat memanggil mereka
}0adalah perangkat input, ini dapat dilihat sebagai argumen fungsi ini. Sel ini akan digantikan oleh marmer input (nilai) ketika fungsi dipanggil.
+ZMenambahkan 35 ke marmer yang melewatinya dan membiarkannya jatuh. Melakukan +Chal yang sama tetapi hanya menambahkan 12. {0adalah sel output , ketika marmer mencapai sel ini, fungsi akan keluar dan mengembalikan nilai pada perangkat output ini.
Jadi, secara keseluruhan, board ini mengambil satu nilai dan kemudian menambahkan 47 nilai untuknya. Bagi kami, ini berarti mengubah angka satu digit menjadi kode ascii dari digit -1 (ini tentu saja juga berlaku untuk 10).
:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //
Papan ini terlihat sedikit lebih rumit. Anda harus dapat mengidentifikasi :Isebagai nama board dan telah melihat beberapa perangkat input dan output. Anda akan melihat bahwa kami memiliki dua perangkat input yang berbeda, }0dan }1. Ini berarti fungsi ini membutuhkan 2 input. Anda juga akan melihat bahwa ada dua contoh }1perangkat. Saat memanggil fungsi, kedua sel ini akan berisi nilai yang sama. Perangkat }0input langsung di atas \/perangkat, ini bertindak sebagai tempat sampah dan menghilangkan marmer yang jatuh di atasnya segera.
Mari kita lihat apa yang terjadi pada salah satu kelereng yang diletakkan di papan oleh }1perangkat input:
}1
=9 &1
&0
{>
Ini akan jatuh pada centang pertama dan tekan =9perangkat. Ini membandingkan nilai dari marmer sampai 9 dan membiarkan marmer itu jatuh jika pernyataannya =9dievaluasi. Marmer didorong ke kanan jika tidak. &0dan &1merupakan sinkronisasi. Mereka berpegang pada kelereng yang jatuh ke mereka sampai semua &nsinkronisasi lainnya diisi juga. Seperti yang dapat Anda harapkan, ini akan memicu perilaku yang berbeda pada beberapa bagian lain dari papan.
}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //
Jika saya memberi tahu Anda bahwa itu ++adalah incrementor, Anda seharusnya sudah dapat mengetahui apa yang akan diisi oleh berbagai sinkronisasi. Kiri &1akan berisi nilai input }1+ 1, di &0sebelahnya akan berisi 0 ( 00adalah bahasa literal, diwakili dalam heksadesimal). Yang kedua &1akan berisi nilai 1 dan hak &0terisi dengan F7, yang mengurangi 9 dari nilai karena penambahan di Marbelous adalah modulo 256.
// adalah alat deflektor, yang mendorong marmer ke kiri alih-alih membiarkannya jatuh.
Menyatukan semua ini memberi Anda ini: jika marmer di }1angka 9, &0sinkronisasi akan terisi. Ini akan menyebabkan nilai 0 jatuh ke dalam {0output dan F7(atau -9) ke dalam {1output. Jika }1bukan 9, {0akan diisi dengan }1+1 dan {0akan berisi 1. Ada juga {>perangkat, ini adalah output khusus yang mengeluarkan marmer di sebelah papan sebagai ganti dari di bawahnya. Ini akan diisi }1jika sama dengan 9.
@0 @6 00 00 00 @5
}0 &0 &0 &0 &0
>0 @6 &3
\\ -- \/ &2
@0 /\ @4 \/ &1 !!
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Oke, sekarang untuk yang besar. Papan ini tidak memiliki nama eksplisit, karena ini adalah papan utama file. Nama tersiratnya adalah Mb. Anda harus dapat mengenali beberapa sel. Ada perangkat input, beberapa literal bahasa ( 00dan FF). Ada beberapa sinkronisasi dan ada deflektor. mari kita selangkah demi selangkah demi selangkah.
@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4
Jadi nilai input (input baris perintah karena ini adalah papan utama) dimulai pada sel kedua dari atas di mana }0berada. Ini akan jatuh dan mencapai >0perangkat, yang merupakan perangkat pembanding lain. setiap marmer yang lebih besar dari 0 jatuh, setiap marmer lainnya terdorong ke kanan. (Karena variabel Marbelous tidak ditandatangani, hanya tepat 0 yang akan didorong ke kanan). Marmer bernilai nol ini kemudian akan mengenai @6perangkat. Ini adalah portal dan mengangkut marmer ke portal terkait lainnya, dalam hal ini tepat di atasnya. Marmer 0 kemudian akan mencapai &0sinkronisasi dan memicu beberapa hal di tempat lain.
Jika marmer bukan 0, jatuh, dibelokkan ke kanan oleh \\hit --yang menurunkannya satu dan kemudian jatuh /\, cloner. Perangkat ini mengambil marmer dan mengeluarkan satu salinannya ke kanan dan satu lagi ke kiri. Yang kiri akan dibawa ke atas ke yang lain di @0mana marmer akan melalui urutan yang sama lagi. Yang kiri akan dibawa ke tempat lain. Ini memberi kita satu loop, yang mengurangi input baris perintah satu kali per loop dan memicu beberapa perilaku pada setiap loop hingga mencapai 0. Kemudian memicu beberapa perilaku lainnya.
Mari kita lihat apa yang terjadi dengan marmer yang didorong ke dalamnya @4 pada setiap loop.
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Ada 3 literal bahasa di sini ( FF), yang akan segera jatuh ke portal. Portal-portal ini akan membawanya ke tiga IIperangkat.IImerujuk ke papan yang :Ikami definisikan lebih jauh di bawah file. Karena :Imemiliki 2 perangkat input yang berbeda, representasi di papan lain harus selebar 2 sel. Karena kami memiliki 6 sel yang mengandung II, kami dapat memberi tahu kami memiliki 3 contoh fungsi ini di papan tulis.
The FF(atau 256 atau -1 jika Anda akan) kelereng akan duduk di sel input dari :Ifungsi menunggu sampai ada cukup sto masukan marmer memulai fungsi (satu lagi yang). Di situlah @4portal masuk. Salinan input baris perintah menurun jatuh di sana pada setiap loop. Ini akan memicu :Ipapan paling kiri . Initialy dengan nilai 256 (atau -1) dan apa pun input baris perintah adalah -1. Marmer kiri akan dimasukkan ke dalam }0perangkat :Ipapan dan yang tepat ke dalam }1. Jika Anda ingat apa yang dilakukan papan ini, Anda akan dapat mengetahui hasil apa yang dimilikinya. Ini akan menampilkan versi tambahan dari input kanan pada output kiri (dan mengubah 9 menjadi 0, bukan 10) dan menghasilkan 1 atau -9 di sebelah kanan.
Nilai yang bertambah akan dibawa kembali ke sel input kanan oleh portal, dan nilai di sebelah kanan jatuh ke sinkronisasi. Jika sinkronisasi sudah memegang marmer, kedua kelereng akan bertabrakan. Kelereng yang bertabrakan dapat ditambahkan bersama-sama modulo 256. Jadi nilai-nilai di synchroizers akan melakukan berikut: Mereka mulai kosong, kemudian beralih ke 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, dan kemudian ke 1 lagi (sejak 247 ditambahkan modulo 256).
Anda juga mungkin ingat bahwa marmer mendapatkan output ke kanan ketika nilai input kembali ke 0. Karena :Ipapan tepat di sebelah satu sama lain, ini akan memicu papan ke kanan sekali. Ini akan mengisi tiga sinkronisasi dengan nilai-nilai yang satu lebih tinggi dari yang seharusnya menjadi representasi shortlex dari input baris perintah, pada saat ini telah diturunkan ke 0.
Anda mungkin juga ingat bahwa :Ofungsi mengubah nilai menjadi nilai ascii digit yang mewakili nilai -1. Output dari OOsel - sel ini kemudian akan jatuh dari papan, yang mencetak karakter ascii yang sesuai untuk STDOUT.
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
Jadi apa yang terjadi ketika marmer input baris perintah mencapai 0 dan mengisi &0sinkronisasi? nah, beberapa kelereng nilai 0 jatuh dan memicu tiga sinkronisasi yang menahan angka (+ 1) dari nomor shortlex di bagian bawah papan. &3dipicu terlebih dahulu, karena mengandung digit paling signifikan, kemudian &2diikuti oleh &1. Marmer ini kemudian dipindahkan ke @5perangkat lain sebelum akhirnya mengenai !!sel, yang mengakhiri papan.
19, 20, 21, 22dalam peta desimal menjadi08, 09, 10, 11dalam waktu singkat. Itu sebabnya saya bingung dulu100 -> 89!