Tugas di sini adalah untuk membaca dari file Golly .rle
atau plaintext (pilihan Anda) yang nama file disediakan (pada STDIN atau sebagai argumen baris perintah) dan mengidentifikasi dan menghitung pola umum dalam kotak yang dikodekan di dalamnya.
Atau, Anda dapat memilih untuk memiliki konten file yang disediakan secara langsung melalui STDIN sebagai gantinya.
Program Anda harus dapat mengidentifikasi dan membedakan setidaknya lima belas kehidupan diam ketat paling umum dan lima osilator paling umum , plus glider .
Semua fase osilator ini harus dikenali, sebagaimana seharusnya keempat fase glider.
Ini harus menampilkan daftar yang berisi jumlah akhir setiap pola, dengan nama dan jumlah masing-masing pola pada baris yang terpisah. Program Anda dapat memasukkan dalam daftar ouput semua pola-pola ini atau hanya pola-pola yang setidaknya ada satu yang ditemukan.
Pola yang merupakan bagian dari pola lain yang dihitung tidak boleh dihitung. (misalnya, fase 8-sel suar juga tidak boleh dihitung sebagai dua blok, dan ikatan kapal juga tidak boleh dihitung sebagai dua kapal)
Anda dapat berasumsi bahwa input sudah stabil dan tidak mengandung pola yang tidak ada dalam set yang ditentukan. Anda juga dapat mengasumsikan bahwa kisi input akan masuk dalam kotak 1024x1024.
Ini adalah kode-golf , jadi program terpendek menang.
Deskripsi format file RLE
File RLE berisi kotak hidup yang dikodekan run-length. Semua baris yang diawali dengan #
komentar dan harus diabaikan.
Baris non-kosong, non-komentar adalah dari formulir x=<width>,y=<height>,rule=<rule>
. Untuk keperluan tugas ini, aturannya akan selalu B3/S23
. Mungkin berisi spasi yang harus dilucuti sebelum memproses baris ini (tentu saja, tidak perlu memproses baris ini sama sekali.)
Baris non-komentar setelah yang pertama harus diperlakukan sebagai string tunggal. Ini harus terdiri hanya dari angka desimal, karakter $
, b
dan o
, dan jeda baris, dan tidak akan berakhir dengan digit. Jeda baris harus diabaikan, tetapi Anda dapat menganggap bahwa jeda baris tidak akan mengganggu deretan digit.
Ini dapat diakhiri oleh satu !
.
b
mewakili sel mati, o
mewakili sel hidup, dan $
mewakili akhir baris. Angka desimal apa pun menunjukkan bahwa simbol berikut ini harus diperlakukan berulang berkali-kali.
Pengkodean pola teks biasa
Pilihan lain adalah membaca pola dalam format teks plainteks lain yang dijelaskan di sini. Dalam pengkodean ini, sel-sel tidak aktif diwakili dengan tanda hubung dan sel-sel diwakili dengan huruf besar O, dengan baris baru yang memisahkan baris.
Anda dapat mengasumsikan bahwa semua baris non-komentar akan diisi dengan panjang yang sama dengan tanda hubung.
Baris yang dimulai dengan !
adalah komentar dan harus diabaikan.
Beberapa test case
RLE:
#This is a comment
x = 35, y = 16, rule = B3/S23
bo$2o$obo5$22bo$22bo$22bo2$18b3o3b3o2$22bo$22bo10b2o$22bo10b2o!
Plaintext:
!This is a comment
-O---------------------------------
OO---------------------------------
O-O--------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
----------------------O------------
----------------------O------------
----------------------O------------
-----------------------------------
------------------OOO---OOO--------
-----------------------------------
----------------------O------------
----------------------O----------OO
----------------------O----------OO
Hasil:
Glider 1
Blinker 4
Block 1
RLE:
x = 27, y = 15, rule = B3/S23
5b2o$5b2o9$11bo$o9bobo$o9bobo$o10bo12b3o!
#Here's a comment at the end
Plaintext:
-----OO--------------------
-----OO--------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
-----------O---------------
O---------O-O--------------
O---------O-O--------------
O----------O------------OOO
!Here's a comment at the end
Hasil:
Block 1
Blinker 2
Beehive 1
RLE:
#You may have multiple comments
#As shown here
x = 13, y = 11, rule = B3/S23
2o$2o2$12bo$12bo$12bo$2b2o$2b2o4b2o$7bo2bo$7bobo$8bo!
Plaintext:
!You may have multiple comments
!As shown here
OO-----------
OO-----------
-------------
------------O
------------O
------------O
--OO---------
--OO----OO---
-------O--O--
-------O-O---
--------O----
Hasil:
Block 2
Blinker 1
Loaf 1
RLE:
# Pentadecathlon
# Discovered by John Conway
# www.conwaylife.com/wiki/index.php?title=Pentadecathlon
x = 10, y = 3, rule = B3/S23
2bo4bo2b$2ob4ob2o$2bo4bo!
Plaintext:
! Pentadecathlon
! Discovered by John Conway
! www.conwaylife.com/wiki/index.php?title=Pentadecathlon
--O----O--
OO-OOOO-OO
--O----O--
Hasil:
Pentadecathlon 1
Bonus
Jika Anda mendukung kedua format input (menggunakan ekstensi file [ .rle
untuk file rle dan .cells
untuk plaintext- bagaimana ekstensi lain dibaca tidak terdefinisi] atau bendera baris perintah untuk membedakannya) Anda dapat mengurangi 5% dari skor Anda.
sumber
OOO.OO\n....OO
Jawaban:
Haskell, 2417 byte
Ini memakan waktu cukup lama dan masih ada beberapa bug, tapi saya punya beberapa trik yang bekerja sehingga itu sangat berharga.
Catatan:
Ini menggabungkan beberapa ide kunci:
Ini kodenya:
Berikut adalah kode Mathematica yang digunakan untuk mengemas array 0,1 ke dalam format yang kemudian dibongkar oleh program haskell:
Berikut ungolfing kode yang jauh lebih lengkap:
sumber