Permainan Kehidupan Conway adalah contoh klasik otomatisasi seluler. Sel-sel membentuk kotak persegi dan masing-masing memiliki dua keadaan: hidup atau mati. Pada setiap belokan, setiap sel secara bersamaan memperbarui sesuai dengan kondisinya dan dari delapan tetangganya:
- Sel hidup tetap hidup jika memiliki dua atau tiga tetangga hidup
- Sel mati menjadi hidup jika memiliki tiga tetangga yang hidup
Misi Anda, jika Anda memilih untuk menerimanya, adalah untuk mengkode implementasi Game of Life terpendek dalam bahasa favorit Anda.
Aturan:
- Kisi-kisi harus setidaknya 20x20
- Kisi harus membungkus (sehingga kisi-kisi itu seperti permukaan Torus)
- Implementasi Anda harus memungkinkan pengguna untuk memasukkan pola awal mereka sendiri
- GoL sedikit tidak ada gunanya jika Anda tidak dapat melihat apa yang terjadi, jadi harus ada output visual dari otomat berjalan, dengan hasil setiap belokan yang ditampilkan cukup lama untuk dilihat!
;
sebelumnya}
s.var
S juga dapat dihilangkan kadang-kadang (jika tidak merusak kode Anda). Dan untuk satu barisfor
s,if
s dll, Anda dapat menghilangkan{ }
sepenuhnya:for(...) for(...) dosomething()
.Jawaban:
Kanvas HTML5 dengan JavaScript,
940639586519 karakterSaya selalu ingin melakukan sesuatu dengan kanvas, jadi inilah usaha saya (versi asli online ). Anda dapat beralih sel dengan mengklik (juga dimungkinkan dalam mode berjalan).
Anda sekarang juga dapat mencoba versi baru di sini .
Sayangnya ada masalah yang belum bisa saya atasi. Versi online lebih panjang 11 karakter karena jsFiddle menempatkan simpul teks tepat sebelum kanvas (mengapa?) Dan dengan demikian kanvas tidak lagi menjadi anak pertama.
Sunting 1: Banyak optimisasi dan restrukturisasi.
Sunting 2: Beberapa perubahan kecil.
Sunting 3: Menyusun blok skrip lengkap ditambah perubahan kecil.
sumber
1
membuatnya secepat milikku daripada langkah lambat itu. Juga jika Anda ingin menerapkan gambar (daripada mengklik pada setiap kotak) Anda dapat membulatkan posisi mouse ke blocksize terdekat dan mengisi kotak pada saat itu. Lebih banyak karakter tetapi lebih banyak poin.new Array('#FFF','#800')
dengan['#FFF','#800']
.s
arraytan
danred
karena keduanya adalah warna dengan representasi terpendek - menghemat dua karakter. Juga, jika mungkin, masukkan versi literalj
ke dalam interval. Saya yakin ada banyak lagi yang harus dimatikan.Python, 219 karakter
Saya menggunakan golf maksimum, dengan antarmuka yang cukup untuk memenuhi pertanyaan.
Anda menjalankannya seperti ini:
Angka-angka dalam daftar mewakili koordinat sel awal. Baris pertama adalah 0-19, baris kedua adalah 20-39, dll.
Jalankan di terminal dengan 21 baris dan terlihat cukup manis.
sumber
2-(p in P)
==2-({p}<P)
. Tetapi kemudian Anda harus mengubah input Anda menjadi{8,29,47,48,49}
:)TI-BASIC, 96 byte (87 untuk entri yang tidak bersaing)
Untuk kalkulator grafik TI-84 series Anda (!). Ini cukup tantangan, karena tidak ada cara mudah untuk menulis rutin grafis buffered (pasti tidak ada yang dibangun di), dan layar grafik hanya memiliki empat perintah grafis yang relevan:
Pxl-On()
,Pxl-Off()
,Pxl-Change()
, danpxl-Test()
.Menggunakan setiap piksel yang dapat diakses di layar, dan membungkus dengan benar. Setiap sel adalah satu piksel, dan program memperbarui baris demi baris secara horizontal ke kanan melintasi layar. Karena kalkulator hanya memiliki prosesor z80 15MHz dan BASIC adalah bahasa yang ditafsirkan lambat, kode hanya mendapat satu frame setiap lima menit.
Input pengguna mudah: sebelum menjalankan program, gunakan alat Pena untuk menggambar bentuk Anda di layar grafik.
Diadaptasi dari entri saya ke kontes golf kode di forum kalkulator Omnimaga .
Versi Omnimaga (87 byte)
Kode ini memiliki fitur tambahan: mendeteksi jika sedang dijalankan untuk pertama kalinya, dan jika mengacak status layar. Dalam menjalankan selanjutnya secara otomatis melanjutkan simulasi jika berhenti setelah bingkai selesai. Namun, itu bukan entri yang bersaing karena tidak membungkus layar; sel-sel di perbatasan luar akan selalu dianggap mati jika layar grafik dibersihkan sebelumnya.
Versi ini mungkin adalah kode golf paling golf yang pernah saya tulis, dan berisi beberapa optimisasi membingungkan yang benar-benar buruk:
Saya menggunakan status jam sebagai bendera. Pada awal program, jam tanggal / waktu diaktifkan, dan saya menggunakan nilai flag isClockOn global untuk menentukan apakah itu adalah iterasi pertama. Setelah bingkai pertama diambil, saya mematikan jam. Menghemat satu byte di atas metode terpendek lainnya dan sekitar empat di atas metode yang jelas.
Saya menyimpan status tiga kolom di sebelah kolom yang diperbarui dalam larik 63-elemen dari nomor basis-7. Tempat 49 memegang kolom ke kanan, tempat 7 memegang kolom tengah, dan tempat unit memegang kolom kiri - 1 untuk sel hidup dan 0 untuk sel mati. Lalu saya mengambil sisa mod 6 dari jumlah tiga angka di sekitar sel yang dimodifikasi untuk menemukan jumlah total sel tetangga yang hidup (itu seperti pembagian dengan 9 trik — pada basis 7, sisanya mod 6 sama dengan jumlah dari digit). Menghemat sekitar 10 byte dengan sendirinya dan memberikan kesempatan untuk menggunakan dua optimasi berikutnya. Diagram contoh (misalkan ada peluncur yang berpusat pada kolom tertentu di Y = 45:
Sel pusat akan tetap mati, karena dikelilingi oleh tepat lima sel hidup.
Setelah setiap baris selesai, angka-angka dalam array diperbarui dengan membagi angka-angka yang ada dengan 7, membuang bagian desimal, dan menambahkan 49 kali nilai sel dalam kolom baru. Menyimpan ketiga kolom setiap kali melalui akan jauh lebih lambat dan kurang elegan, mengambil setidaknya 20 byte lebih banyak, dan menggunakan tiga daftar daripada satu, karena nilai sel di setiap baris harus disimpan sebelum sel diperbarui. Sejauh ini, ini adalah cara terkecil untuk menyimpan posisi sel.
Cuplikan
int(3fPart(3cosh(
memberi1
ketika input sama dengan 3/6,2
ketika sama dengan 4/6, dan0
ketika sama dengan 0, 1/6, 2/6, atau 5/6. Menghemat sekitar 6 byte.sumber
Mathematica - 333
Fitur:
Antarmuka interaktif: klik sel untuk membuat pola Anda
Grid yang bagus
Tombol: RUN, PAUSE, CLEAR
Kode di bawah.
Jika Anda ingin merasakan bagaimana ini berjalan, contoh kedua di blog ini hanyalah versi yang lebih rumit (analisis Fourier langsung, antarmuka yang lebih baik) dari kode di atas. Contoh harus dijalankan langsung di browser Anda setelah unduhan plugin gratis.
sumber
C 1063 karakter
Sebagai tantangan, saya melakukan ini di C menggunakan API Windows yang tidak ramah untuk IO waktu nyata. Jika capslock aktif, simulasi akan berjalan. Ini akan tetap diam jika capslock mati. Gambar pola dengan mouse; klik kiri menghidupkan kembali sel dan klik kanan membunuh sel.
EXE yang dikompilasi dapat ditemukan di sini
Sunting: Saya sudah mengomentari sumbernya. Ini tersedia di sini
sumber
J (39 karakter)
Berdasarkan versi APL ini (algoritma yang sama, konvolusi toroidal).
Contoh penggunaan:
sumber
Mathematica, 123 karakter
Implementasi yang sangat mendasar yang tidak menggunakan fungsi CellularAutomaton bawaan Mathematica.
sumber
Ruby 1.9 + SDL (
380325314)EDIT : 314 karakter, dan memperbaiki bug dengan sel ekstra yang muncul hidup pada iterasi pertama. Menaikkan ukuran kisi menjadi 56 karena rutin warna hanya terlihat pada 8 bit terendah.
EDIT : Golf hingga 325 karakter. Lebar / tinggi kisi sekarang 28 karena 28 * 9 adalah yang terbesar yang dapat Anda miliki saat masih menggunakan nilai sebagai warna latar belakang. Ia juga memproses hanya satu kejadian SDL per iterasi sekarang, yang menyingkirkan loop dalam sepenuhnya. Kurasa cukup ketat!
Simulasi mulai dijeda, dengan semua sel mati. Anda dapat menekan tombol apa saja untuk beralih jeda / berhenti, dan klik sel mana saja untuk beralih antara hidup dan mati. Menjalankan iterasi setiap sepersepuluh detik.
Bungkusnya agak miring.
Terlihat seperti ini:
Tantangan yang menyenangkan! Saya menyambut setiap perbaikan yang dapat dilihat siapa pun.
sumber
Scala,
118111581128106310181003999992987 karakterTidak Disatukan:
Bagian yang lebih besar dari kode di sini adalah hal-hal Swing GUI. Permainan itu sendiri adalah dalam
actionPerformed
metode yang dipicu olehTimer
, dan fungsi pembantun
yang menghitung tetangga.Pemakaian:
Kompilasi dengan
scalac filename
dan jalankan denganscala L
.Mengklik kuadrat membaliknya dari hidup ke mati, dan opsi menu memulai dan menghentikan permainan. Jika Anda ingin mengubah ukuran kisi, ubah tiga nilai pertama dalam baris: masing
var(w,h,c,d,r)=(20,20,20,0,false)
-masing adalah lebar, tinggi dan ukuran sel (dalam piksel).sumber
import java.awt.event._
dancontents+=m("Go",true)+=m("Stop",false)}}
, mengarah ke 1093 karakter.Pure Bash, 244 byte
Bekerja pada alam semesta 36x24 yang dibungkus dengan toroid:
Karena ini adalah skrip shell, metode input ini kongruen dengan perintah shell lainnya - yaitu dari stdin:
... dll
Kami dapat mengarahkan input dari sumber teks apa pun, disalurkan melalui
tr
filter untuk mendapatkan generasi awal yang menarik, misalnyasumber
JavaScript, 130
Tidak sepenuhnya menanggapi tantangan, tetapi sebagai catatan, inilah mesin Game of Life dalam 130 byte yang dibuat oleh Subzey dan saya pada tahun 2013.
http://xem.github.io/miniGameOfLife/
sumber
@@\n@@
(2 x 2 persegi di sudut kiri atas) atau.@\n.@\n.@
. (1 oleh 3 kolom)C # - 675 karakter
Saya selalu ingin menulis versi dari program ini. Tidak pernah tahu hanya butuh waktu setengah jam untuk versi yang cepat dan kotor. (Golf tentu saja membutuhkan waktu lebih lama.)
Pemakaian
Kompromi bermain golf
sumber
GW-BASIC,
10861035 byte (di-token)Dalam bentuk token, ini adalah 1035 byte. (Formulir ASCII, tentu saja, sedikit lebih lama.) Anda mendapatkan formulir yang dilemahkan dengan menggunakan
SAVE"life
perintah tanpa menambahkan",a
dalam juru bahasa.Ini adalah versi maksimum golf, tetapi tetap fitur: saat memulai, Anda mendapatkan editor, di mana Anda dapat bergerak dengan tombol kursor; ruang mengaktifkan / menonaktifkan bakteri di bidang saat ini,
c
membersihkan layar, Kembali memulai mode permainan.Berikut ini versi yang kurang membingungkan, yang juga menetapkan papan permainan awal dengan dua struktur (benda yang berputar-putar dan peluncur):
Saya menulis ini dalam 15 menit sambil bosan dan menunggu seorang teman, yang sedang bermain golf dengan "muridnya" untuk Conway's Game of Life pada saat yang sama.
Fungsinya seperti ini: Segera menggunakan buffer layar mode teks 80x25 (ubah inisial yang
DEF SEG
digunakan&hB000
jika Anda menggunakan kartu grafis Hercules; pengaturan ini berfungsi dengan Qemu dan (lebih lambat) dosbox). Tanda bintang*
adalah bakteri.Ini berfungsi dua-jalan: pertama, tempat kelahiran ditandai dengan
+
dan kematian menandai sasarannya.
. Di pass kedua,+
dan.
diganti dengan*
dan, masing-masing.
The
TIMER
hal yang membuatnya menunggu setengah detik setelah setiap putaran, dalam kasus tuan rumah Qemu Anda sangat cepat ☺Saya tidak berharap untuk harga menang-terpendek di sini tapi untuk yang keren, terutama mengingat pengaturan papan awal. Saya juga punya versi di mana mesin game diganti dengan kode assembly, jika Anda tertarik ...
sumber
1
,2
,3
, dll) Atau apakah nomor baris tidak menghitung?Mathematica, 115 byte
Berikut ini adalah solusi mudah untuk ini:
sumber
Java (OpenJDK 8) -
400 388367 byteEdit Kedua dan (mungkin) Final: Berhasil bermain golf tambahan 21 byte setelah menemukan tambang emas (imo) ini - pasti merekomendasikan orang baru untuk membaca ini (terutama jika Anda akan mencoba beberapa tantangan ini menggunakan Java).
Kode yang dihasilkan (mungkin akan berakhir bermain golf lebih banyak lagi jika saya mencari tahu bagaimana cara memperpendek loop bersarang untuk loop ...):
Cobalah online!
(Posting asli dimulai di sini.)
Saya benar-benar berpikir sejenak bahwa saya akan dapat setidaknya menantang jawaban Python terbaik dengan pengetahuan saya tentang Java lol (yang bisa dibilang terbatas) ... Itu adalah tantangan yang saya nikmati tetapi tetap ikut (walaupun bergabung dengan partai mungkin hanya sebuah sedikit terlambat ...)
Tidak banyak yang benar-benar - penjelasan dasar sebagai berikut (ungolfed):
(informasi lebih lanjut tentang pernyataan lambda di Java 8 di sini )
Ya, ada masalah dengan pendekatan saya.
Karena sebagian besar dari Anda mungkin memperhatikan, kode golf saya seperti saat ini berdiri akan berulang selamanya. Untuk mencegah hal ini, penghitung dapat diperkenalkan di bagian atas dan digunakan dalam loop sementara untuk hanya menampilkan
n
(dalam kasus ini, 5) iterasi sebagai berikut (perhatikanb
variabel baru ditambahkan):Selain itu, beberapa poin perlu disebutkan. Program ini tidak memeriksa apakah inputnya benar dan karena itu akan gagal dengan (kemungkinan besar) suatu
ArrayOutOfBoundsException
; dengan demikian, pastikan untuk memeriksa bahwa input tersebut valid dengan sepenuhnya mengisi bagian dari array (skewered array akan membuang pengecualian yang disebutkan di atas). Juga, papan seperti saat ini terlihat 'cair' - yaitu, tidak ada pemisahan antara satu generasi dan berikutnya. Jika Anda ingin menambahkannya untuk memeriksa ulang apakah generasi yang dihasilkan memang valid, tambahanSystem.out.println();
perlu ditambahkan sebelumfor(int[]t:u)Arrays.fill(t,0);
(lihat ini Coba online! Untuk kejelasan). Dan yang terakhir, namun tidak kalah pentingnya, mengingat ini adalah golf kode pertama saya, umpan balik sangat dihargai :)Kode lama dari jawaban 388 byte sebelumnya:
Dan dari jawaban 400 byte awal:
sumber
Stensil , 6 byte
Bukan bahasa favorit saya, tetapi adalah singkat ...
4 byte kode ditambah bendera nlist
∊
danT
orus.Cobalah online!
Adalah ...
3
3∊
anggota darim
the m oore-lingkungan-hitung dengan diri ataue
tegalan e -neighbourhood-hitungan tanpa diri...?
sumber
Scala - 799 karakter
Jalankan sebagai skrip. Klik mouse pada kotak untuk mengaktifkan atau menonaktifkannya dan tombol apa pun memulai atau menghentikan pembuatan.
sumber
J, 45
Saya pikir saya akan mencobanya. Ini belum golf dengan baik, tapi saya akan mencoba lagi segera.
Contoh:
sumber
Memproses
536532Saya percaya ini memenuhi semua persyaratan.
Tidak Disatukan:
sumber
Matlab (152)
Saya belum menginstal Matlab sekarang untuk mengujinya, saya baru saja memasukkan kode yang saya tulis beberapa tahun yang lalu.
Tidak Disatukan:
sumber
Perl,
218216211202 byte(Tidak ada baris baru di akhir kode ini.)
Membaca pola awal dari input standar, sebagai file teks di mana sel-sel hidup direpresentasikan sebagai
1
, sel-sel mati direpresentasikan sebagai spasi, garis dipisahkan oleh baris baru. Input tidak boleh memiliki karakter selain ini. Garis bisa panjang variabel, dan akan diisi atau dipotong dengan lebar 79 persis. Input contoh adalah glider gun:Saat program menjalankan Game of Life, setiap negara dibuang ke output standar dalam format yang mirip dengan input, kemudian menunda 0,1 detik. Penundaan dapat disesuaikan dengan mengubah argumen keempat dari panggilan pilih.
Papan permainan memiliki kode keras untuk ukuran 79x23. Itu dibungkus dengan torus: jika Anda meninggalkan papan di bagian bawah, Anda berakhir di bagian atas; jika Anda pergi di sisi kanan, Anda berakhir di sisi kiri tetapi bergeser satu baris ke bawah.
Ini versi alternatif yang tidak membaca input apa pun dan mulai dari papan acak:
Kode ini berasal dari permainan program perl hidup yang saya buat bertahun-tahun yang lalu . Saya telah banyak mengubahnya untuk membuat papan toroidal dan kode golf.
Ini mungkin bukan metode terpendek untuk mengimplementasikan Game of Life di perl, tapi itu salah satu yang kurang dipahami.
sumber
Python, 589 byte
Tombol mouse: kiri - pasang sel, kanan - hapus sel, mulai - tengah / berhenti.
Dan di sini adalah versi di mana Anda dapat menarik mouse untuk menggambar. Grafik sedikit lebih menyenangkan.
sumber
if 1<n<4:
harus indentasi pada tingkat yang sama denganfor j in z(-1,2):
Python 2, 456 byte
Meskipun saya tahu ini adalah posting lama, saya tidak dapat menahan diri untuk mencobanya. Papan awal dapat berukuran berapa saja asalkan Anda menggambar batas di sekitarnya dan memiliki ruang tambahan di baris terakhir.
Golf.py
Input.txt (perhatikan ruang ekstra di baris terakhir)
Cara Menjalankan
sumber
time.sleep(0.1)==None
=>not time.sleep(.1)
,(f=='@'and(x==3 or x==2
)) atau (f == '' dan x == 3) =>x==3or f=='@'and x==2
1 if
=>1if
.Pengolahan
270.261249 byteGrid adalah 100 * 100 piksel layar, input datang dalam bentuk gambar png
Tidak disatukan
sumber
Lua + LÖVE / Love2D , 653 byte
atau ditempatkan:
Klik pada bidang untuk menambahkan sel hidup. Klik di luar bidang untuk menjalankannya.
Cobalah online!
sumber
Nota bene
529515Dimulai dengan contoh dari Rosetta Code . Diminta dengan argumen nama file (
gs -- gol.ps pulsar
), file yang berisi 20 * 20 angka biner (dipisahkan oleh spasi). Infinite loop: papan gambar, tunggu masuk, hitung generasi berikutnya.Spasi, dengan beberapa tumpukan komentar (hanya yang saya butuhkan).
file data pulsar:
sumber
JavaScript 676
Maaf Griffin, saya hanya tidak bisa melihat kode Anda dan tidak menulis ulang sedikit ... harus mencukur dua karakter tetapi itu sangat berharga!
b=[];r=c=s=20;U=document;onload=function(){for(z=E=0;z<c;++z)for(b.push(t=[]),j=0;j<r;j++)with(U.body.appendChild(U.createElement("button")))t.push(0),id=z+"_"+j,style.position="absolute",style.left=s*j+"px",style.top=s*z+"px",onclick=a}; ondblclick=function(){A=E=E?clearInterval(A):setInterval(function(){Q=[];for(z=0;z<c;++z){R=[];for(j=0;j<r;)W=(c+z-1)%c,X=(c+z+1)%c,Y=(r+j-1)%r,Z=(r+j+1)%r,n=b[W][Y]+b[z][Y]+b[X][Y]+b[W][j]+b[X][j]+b[W][Z]+b[z][Z]+b[X][Z],R.push(b[z][j++]?4>n&&1<n:3==n);Q.push(R)}b=Q.slice();d()})};function a(e){E?0:P=e.target.id.split("_");b[P[0]][P[1]]^=1;d()}function d(){for(z=0;z<c;++z)for(j=0;j<r;)U.getElementById(z+"_"+j).innerHTML=b[z][j++]-0}
Tetapi seperti yang mereka katakan, lebih mudah untuk meminta pengampunan daripada izin ...;)
sumber
Oktaf (153)
sama seperti Matlab oleh DenDenDo di Game Terpendek Kehidupan , tetapi harus mengubah imshow ke imagesc:
sumber
Python 2: 334 Bytes
Hanya terlambat 6 tahun.
Anda dapat menjalankannya seperti:
Di mana 0s dan 1s mewakili sel-sel mati dan hidup, baris baru tambahan pada akhir memulai eksekusi.
Kisi-kisi harus persegi.
Lebih mudah dijalankan daripada python terpendek, mendukung ukuran grid apa pun, dan terlihat cantik saat dijalankan.
Ini juga 100 byte lebih, jadi begitulah.
sumber
PHP, 201 byte (tidak diuji)
Jalankan dengan
-nr
.kerusakan
sumber