Bangun jam digital di Conway's Game of Life

479

Tugas Anda adalah membuat simulasi Game of Life yang mewakili jam digital, yang memenuhi properti berikut:

  1. Jam menampilkan jam dan menit dalam desimal (misalnya 12:00, 3:59, 7:24) dengan negara yang berbeda untuk masing-masing 1.440 menit dari hari - baik jam akan pergi dari 0 hingga 23 atau dari 1 sampai 12 dengan indikator PM.

  2. Polanya periodik, dan negara berputar-putar tanpa ada interaksi dari luar.

  3. Pembaruan menit secara berkala - dari satu perubahan menit ke yang berikutnya membutuhkan jumlah generasi yang sama.

  4. Pengamat anonim dapat mengetahui secara sekilas bahwa tampilan seharusnya adalah jam digital. Secara khusus, ini mensyaratkan:

    • Digitnya terlihat dan dapat dibedakan dengan jelas. Anda harus bisa tahu dengan pasti kapan waktu yang ditampilkan.

    • Digit pembaruan di tempat. Setiap nomor baru muncul di tempat yang sama dengan nomor sebelumnya, dan ada sedikit atau tidak ada pergerakan kotak pembatas dari angka. (Khususnya, digit tidak mengandung 10 digit berbeda di tempat berbeda yang terungkap setiap kali digit berubah.)

    • Angka-angka tersebut muncul di samping satu sama lain, tanpa jumlah ruang yang berlebihan di antara mereka.


Program Anda akan dinilai berdasarkan hal-hal berikut, secara berurutan (dengan kriteria yang lebih rendah bertindak sebagai tiebreak untuk kriteria yang lebih tinggi):

  • Bounding box size - kotak persegi panjang dengan area terkecil yang sepenuhnya berisi solusi yang menang.

  • Eksekusi tercepat - generasi paling sedikit untuk maju satu menit menang.

  • Hitungan sel hidup awal - jumlah kemenangan yang lebih kecil.

  • Pertama ke posting - posting sebelumnya menang.

Joe Z.
sumber
5
@tuskiomi Tidak, tampilan harus berupa desimal.
Joe Z.
2
Saya cukup yakin ini B3 / S23, tetapi bisakah Anda mengkonfirmasi atau menolak?
Conor O'Brien
2
"Mereka juga harus memperbarui di tempat - setiap nomor baru harus muncul di tempat yang sama dengan nomor sebelumnya." Bagaimana Anda mendefinisikan "di tempat yang sama", karena digit tidak harus persegi panjang.
Martin Ender
4
seberapa jelas angka desimal kita? adalah "jika Anda tahu apa itu dan Anda menyipitkan mata maka Anda dapat mengatakan perbedaan antara 0 dan 8" cukup, atau apakah itu perlu melewati tes "pengamat anonim dapat mengetahui apa itu tanpa tes"?
Sparr
3
ini juga diposting di blog Hackaday
Anool Mahidharia

Jawaban:

1014

11.520 generasi per hitungan jam / 10.016 x 6.796 kotak / 244.596 hitungan pop

Ini dia ... Menyenangkan.

Nah, desainnya tentu tidak optimal. Baik dari sudut pandang kotak pembatas (angka 7-segmen itu besar ), maupun dari jumlah populasi awal (ada beberapa hal yang tidak berguna, dan beberapa hal yang pasti bisa dibuat lebih sederhana), dan kecepatan eksekusi - yah ... saya Saya tidak yakin.

Tapi, hei, ini indah. Melihat:

masukkan deskripsi gambar di sini

Menjalankannya!

Dapatkan desain dari intisari ini . Salin seluruh file teks ke clipboard.

Baru : ini adalah versi dengan indikator AM dan PM untuk yang menuntut

Buka simulator hidup JavaScript Conway online . Klik impor , tempel teks desain. Anda harus melihat desainnya. Kemudian, buka pengaturan dan atur langkah pembuatan ke 512, atau sesuatu di sekitar garis itu, atau Anda harus menunggu selamanya untuk melihat pembaruan tampilan jam.

Klik jalankan , tunggu sebentar dan kagum!

Tautan langsung ke versi dalam browser.

Perhatikan bahwa satu-satunya algoritma yang membuat desain besar ini dapat digunakan adalah hashlife. Tetapi dengan ini, Anda dapat mencapai seluruh jam dalam hitungan detik. Dengan algoritma lain, bahkan tidak praktis untuk melihat jamnya berubah.

Bagaimana itu bekerja

Ini menggunakan teknologi p30. Hanya hal-hal dasar, pesawat layang dan pesawat ruang angkasa ringan. Pada dasarnya, desainnya top-down:

  • Di bagian paling atas, ada jam. Ini adalah jam periode 11520. Perhatikan bahwa Anda memerlukan sekitar 10.000 generasi untuk memastikan tampilan diperbarui dengan tepat, tetapi desainnya harus tetap stabil dengan jam dengan periode yang lebih kecil (sekitar 5.000 atau lebih - jam harus kelipatan 60).
  • Lalu, ada tahap distribusi jam. Clock glider disalin dalam pohon seimbang, jadi pada akhirnya, ada 32 glider yang tiba pada saat yang sama persis dengan tahap penghitung.
  • Tahap penghitung dibuat menggunakan kait RS untuk setiap negara bagian, dan untuk setiap digit (kami menghitung dalam desimal). Jadi ada 10 negara bagian untuk digit kanan menit, 6 negara bagian untuk digit kiri minuts, dan 12 negara bagian untuk jam (kedua digit jam digabung di sini). Untuk masing-masing kelompok ini, penghitung berperilaku seperti register geser.
  • Setelah tahap penghitungan, ada tabel pencarian. Mereka mengkonversi pulsa negara untuk menampilkan segmen ON / OFF tindakan.
  • Lalu, tampilan itu sendiri. Segmen dibuat dengan beberapa string LWSS. Setiap segmen memiliki kaitnya sendiri untuk mempertahankan negaranya. Saya bisa membuat logika-ATAU sederhana dari status digit untuk mengetahui apakah segmen harus AKTIF atau MATI, dan singkirkan kait ini, tetapi akan ada gangguan untuk segmen yang tidak berubah, ketika digitnya berubah (karena keterlambatan sinyal). Dan akan ada aliran panjang glider yang datang dari tabel pencarian ke segmen digit. Jadi itu tidak akan terlihat bagus. Dan itu perlu. Iya.

Lagi pula, sebenarnya tidak ada yang luar biasa dalam desain ini. Tidak ada reaksi luar biasa yang telah ditemukan dalam proses ini, dan tidak ada kombinasi yang benar-benar pintar yang tidak pernah dipikirkan sebelumnya. Hanya bit diambil di sana-sini dan disatukan (dan saya bahkan tidak yakin saya melakukannya dengan cara yang "benar" - saya benar-benar benar-benar baru dalam hal ini). Namun, itu membutuhkan banyak kesabaran. Membuat semua peluncur itu muncul pada waktu yang tepat di posisi yang tepat adalah menggaruk-garuk kepala.

Kemungkinan pengoptimalan:

  • Alih-alih menyalin dan mendistribusikan jam root yang sama ke sel n counter, saya bisa saja menempatkan blok jam yang sama n kali (satu kali untuk setiap sel counter). Ini sebenarnya akan jauh lebih sederhana. Tapi kemudian saya tidak akan dapat menyesuaikannya dengan mudah dengan mengubah jam pada satu titik ... Dan saya memiliki latar belakang elektronik, dan di sirkuit nyata, itu akan sangat salah.
  • Setiap segmen memiliki kait RS sendiri. Ini membutuhkan tabel pencarian untuk menghasilkan pulsa R dan S. Jika kami memiliki kait yang hanya akan beralih statusnya dari pulsa input umum, kami bisa membuat tabel pencarian setengah besar. Ada kait untuk titik PM, tetapi itu sangat besar, dan saya tidak dapat menemukan sesuatu yang lebih praktis.
  • Buat tampilan lebih kecil. Tapi itu tidak akan terlihat bagus. Dan itu perlu. Iya.
redup
sumber
26
Cantik. Jawaban bagus.
Pavel
33
@ Aduk ayolah, Anda bisa mencoba untuk menambahkan ini sendiri ... Pokoknya, saya telah mengedit posting dengan versi dengan AM + PM, untuk kesenangan Anda.
redup
48
Asal tahu saja, jawaban ini telah ditampilkan di Microsiervos , salah satu blog paling penting tentang teknologi dalam bahasa Spanyol, dengan lebih dari 800 ribu pengikut di Twitter
Luis Mendo
26
@Rory Anda mengambil kepala Anda, menghancurkannya di dinding selusin kali sekuat yang Anda bisa. Anda kemudian siap untuk memulai.
redup
34
Jadi proses desainnya adalah: "Ok, saya harus menabraknya, dan glider saya berasal dari sana pada posisi ini saat ini. Mari kita lihat membawanya ke sana menggunakan dua reflektor. Sial, hal yang diperlukan untuk bertabrakan hanyalah dua langkah generasi terlalu cepat, di sana. Jika saya memindahkan reflektor sedikit, mari kita lihat ... Sial, sudah terlambat Ok, mari kita bertabrakan dengan mereka di tempat lain Sial, saya tidak punya ruang untuk membuat glider saya pergi ke sana. mari kita tambahkan dua reflektor tidak berguna lainnya hanya untuk membuatnya tiba di sana. Sial, reflektor bertabrakan dengan aliran glider yang lain ... Sial, mari kita tidur. "
redup