}0
--@2
@2/\=0MB
}0@1\/
&0/\>0!!
--
@1
00@0
--/\=0
\\@0&0
Marbelous adalah bahasa 8 bit dengan nilai-nilai hanya diwakili oleh kelereng dalam mesin seperti Rube Goldberg, jadi ini tidak mudah. Pendekatan ini kira-kira setara dengan pseudo-code berikut:
function recursiveFunction(int i)
{
for(int j = i*512; j > 0; j--)
{
recursiveFunction(i - 1);
}
}
karena nilai maksimum adalah 256, (diwakili oleh 0 dalam program Marbleous, yang ditangani secara berbeda di tempat yang berbeda) Fungsi rekursif (1) akan dipanggil dengan total 256!*512^256
yang sama dengan 10^1200
, cukup mudah untuk hidup lebih lama dari alam semesta.
Marbelous tidak memiliki juru bahasa yang sangat cepat, sepertinya bisa menjalankan 10^11
panggilan fungsi ini per tahun, yang berarti kita sedang melihat runtime 10^1189
tahun.
Penjelasan lebih lanjut dari dewan Marbelous
00@0
--/\=0
\\@0&0
00
adalah bahasa literal (atau marmer), diwakili dalam heksadesimal (jadi 0). Marmer ini jatuh ke bawah --
, yang akan menurunkan marmer sebanyak 1 (00 membungkus dan berubah menjadi FF atau 255 dalam desimal). Marble dengan nilai FF jatuh ke bawah \\
yang mendorongnya satu kolom ke kanan, ke bawah @0
. Ini adalah portal dan memindahkan marmer ke @0
perangkat lain . Di sana, marmer mendarat di /\
perangkat, yang merupakan duplikator, menempatkan satu salinan marmer di sebelah --
kiri (marmer ini akan terus berputar di antara portal dan dikurangi pada setiap loop) dan satu di sebelah =0
kanan.=0
membandingkan marmer dengan nilai nol dan membiarkan marmer jatuh jika itu sama dan mendorongnya ke kanan jika tidak. Jika marmer memiliki nilai 0, ia akan mendarat di &0
, sinkronisasi, yang akan saya jelaskan lebih lanjut, nanti.
Secara keseluruhan, ini hanya dimulai dengan marmer bernilai 0 dalam satu lingkaran dan menurunkannya hingga mencapai 0 lagi, lalu menempatkan marmer bernilai 0 ini dalam sinkronisasi dan terus mengulang pada waktu yang sama.
}0@1
&0/\>0!!
--
@1
}0
adalah perangkat input, awalnya input baris perintah n (basis 0) saat memanggil program ditempatkan di setiap }n
perangkat. Jadi jika Anda memanggil program ini dengan input baris perintah 2, marmer nilai 02 akan menggantikan ini }0
. Marmer ini kemudian jatuh ke dalam &0
perangkat, sinkronisasi lain, &n
sinkronisasi memegang kelereng sampai semua korespondensi lainnya &n
diajukan juga. Marmer kemudian akan dikurangi, diteleportasi dan digandakan seperti pada loop yang dijelaskan sebelumnya. Salinan yang tepat kemudian diperiksa ketidaksetaraannya dengan nol ( >0
) jika bukan 0, ia gagal. Jika 0, maka akan didorong ke kanan dan mendarat !!
, yang mengakhiri papan.
Oke, sejauh ini kita memiliki loop yang terus-menerus menghitung mundur dari 255 ke 0 dan memungkinkan loop serupa lainnya (diumpankan oleh input baris perintah) berjalan sekali setiap kali klik 0. Ketika loop kedua ini telah berjalan n kali (maksimum 256) ) program berakhir. Jadi itu maksimum 65536 putaran. Hampir tidak cukup untuk hidup lebih lama dari alam semesta.
}0
--@2
@2/\=0MB
Ini harus mulai terlihat akrab, input akan dikurangi satu kali, kemudian nilai ini berputar dan disalin (perhatikan bahwa marmer hanya akan dikurangi satu kali, bukan pada setiap putaran). Kemudian akan diperiksa untuk kesetaraan ke 0 dan jika tidak nol MB
. Ini adalah fungsi di Marbelous, setiap file dapat berisi beberapa papan dan setiap papan adalah fungsi, setiap fungsi harus dinamai dengan mendahului grid oleh :[name]
. Setiap fungsi kecuali untuk fungsi pertama dalam file, yang memiliki nama standar: MB. Jadi loop ini terus menerus memanggil papan utama lagi dengan nilai di n - 1
mana n adalah nilai yang dengannya instance fungsi ini dipanggil.
Jadi mengapa n*512
?
Nah, loop pertama berjalan dalam 4 tick (dan 256 kali) dan loop kedua berjalan n kali sebelum board berakhir. Ini berarti papan menjalankan sekitar n*4*256
kutu. Loop terakhir (yang melakukan pemanggilan fungsi rekursif) adalah compacter dan berjalan dalam 2 ticks, yang berarti ia berhasil memanggil fungsi n*4*256/2 = n*512
kali.
Apa simbol yang tidak Anda sebutkan?
\/
adalah tempat sampah, yang menghilangkan kelereng dari papan, ini memastikan kelereng yang telah discart tidak mengganggu kelereng lain yang mengulang putaran dan mencegah program dari penghentian.
Bonus
Karena kelereng yang jatuh di bagian bawah papan marbelous mendapatkan output ke STDOUT, program ini mencetak sejumlah besar karakter ASCII saat dijalankan.