Tantangannya adalah menemukan implementasi game kehidupan terpendek dalam 3D ( contoh ). Inilah aturannya:
Sel (dalam hal ini, kubus) dengan hanya 1 atau kurang tetangga mati, seolah-olah karena kesepian.
Jika tepatnya 5 sel mengelilingi sel kosong, mereka berkembang biak dan mengisinya.
Jika sel memiliki 8 tetangga atau lebih, ia mati karena kepadatan yang berlebihan.
Buat setidaknya 10x10x10, di mana layer-layer tersebut dihasilkan secara individual seperti ini:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 X 0 0 X 0 0 0 0 0
0 0 X X X 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
Tentu saja, simulasi grafik 3D juga diterima
. Posisi awal dapat di-hardcode tetapi harus berfungsi jika diubah ke posisi awal mana pun. Itu harus dapat menghitung jumlah generasi berapa pun, dan pengguna harus dapat secara manual meminta generasi berikutnya.
Kode terpendek dalam karakter menang!
Saya membuat implementasi ini sendiri untuk ukuran (cube) berapa pun: http://jensrenders.site88.net/life3D.htm Anda dapat menggunakan ini untuk menguji, dan Anda dapat mendasarkan kode Anda pada milik saya, meskipun saya tidak berkomentar .
sumber
Jawaban:
Mathematica - 120 byte
Tentu saja bukan penantang untuk menang, tapi itu bukan maksud saya. Juga, ini mungkin bisa diturunkan secara signifikan dengan hanya mencari tahu nomor aturan. Saya hanya benar-benar ingin menulis visualisasi (walaupun saya sebenarnya yakin sudah ada banyak di luar sana). Jadi begini):
Dan setelah bereksperimen dengan banyak kondisi awal, saya mendapatkan hal-hal seperti berikut:
Dan di sini adalah satu dengan ukuran kotak
20x20x20
. Ini membutuhkan beberapa detik untuk mensimulasikan dan membuat:Omong-omong, ini mengasumsikan kondisi batas periodik.
sumber
APL, 46
Butuh beberapa waktu, tetapi saya turun menjadi 46 karakter:
Ini adalah fungsi yang mengambil matriks 3D boolean dari berbagai ukuran dan menghitung generasi berikutnya, sesuai dengan aturan yang diberikan. Kondisi batas tidak ditentukan, jadi saya memilih untuk membungkus sisi lain, seperti di ruang toroidal.
Penjelasan
Hasil antara
m
adalah matriks dengan bentuk yang sama dengan matriks asli, yang menghitung untuk setiap elemen berapa banyak sel yang hidup di lingkungan 3 × 3 × 3, termasuk dirinya sendiri. Kemudian:Contoh
Tentukan matriks acak 4 × 4 × 4 dengan sekitar 1/3 sel = 1 dan hitung generasi ke-1 dan ke-2. Bagian
⊂[2 3]
depan hanyalah trik untuk mencetak pesawat secara horizontal, bukan vertikal:sumber
J - 42 char
Kami mengasumsikan papan toroidal (membungkus) dalam ketiga dimensi. Tampilan otomatis hasil J tampaknya mengikuti spesifikasi output, digunakan
1
untuk sel hidup dan0
mati. Kode ini berfungsi di papan dengan lebar, panjang, dan tinggi berapa pun (bisa 10x10x10, 4x5x6, dan sebagainya).Penjelasan berikut:
,{3#<i:1
- Subekspresi daftar offset untuk sel dan semua tetangganya.<i:1
- Daftar bilangan bulat antara 1 dan -1 inklusif.,{3#
- Buat tiga salinan dari daftar (3#
), dan ambil produk Cartesian (,{
).(,{3#<i:1)|.&><
- Untuk setiap set offset 3D, geser larik. Dengan biaya 3 karakter, Anda dapat mengubah|.&>
untuk|.!.0&>
untuk tidak memiliki wrap-around.[:+/
- Jumlahkan semua papan yang digeser menjadi satu.((1&<*<&8)@-*]+.5=-)~
- Kata kerja terluar yang panjang adalah pengait sehingga menerima papan di kiri dan kanan, dan sisi di sebelah kanan kami telah bergeser dan menjumlahkan. The~
swap sekitar ini untuk kata kerja batin.5=-
- 1 di setiap sel bahwa jumlah papan bergeser minus papan asli (yaitu jumlah tetangga) sama dengan 5, dan 0 pada semua yang lain.]+.
- Logis ATAU di atas dengan papan asli.(1&<*<&8)
- 1 jika jumlahnya dibandingkan antara 1 dan 8 eksklusif, 0 sebaliknya.(1&<*<&8)@-*
- Bandingkan (seperti di atas) tetangga menghitung, dan kalikan (yaitu logis DAN ketika domain hanya 1 atau 0) hasil logis ATAU dengan ini.Penggunaan seperti halnya APL, cukup terapkan fungsi ke papan awal untuk setiap langkah. J memiliki operator daya fungsional
^:
untuk membuatnya mudah.Saya katakan "acak" karena
?.
primitif memberikan hasil acak yang dapat direproduksi dengan menggunakan benih tetap setiap waktu.?
adalah RNG sejati.sumber
|.
kata kerjanya yang busuk !! Kerja bagus.