Code golf selalu melibatkan beberapa jawaban yang sedikit banyak membengkokkan aturan dengan melanggar batasan yang diterima oleh penantang atau hanya belum memikirkan dan tidak tercantum dalam aturan. Salah satu celah yang menarik ini adalah kemungkinan untuk menghasilkan lebih dari tantangan yang diminta untuk mendapatkan hasil yang lebih baik.
Mengambil ini ke ekstrem, kita dapat menulis pemecah kode golf universal yang mencetak output yang diinginkan - jika Anda tidak peduli itu mungkin butuh waktu lama dan menghasilkan banyak hal lain sebelum dan sesudahnya.
Yang kita butuhkan untuk output adalah urutan yang dijamin mengandung setiap kemungkinan berikutnya. Untuk golf kode ini, ini akan menjadi urutan Ehrenfeucht-Mycielski :
Urutan dimulai dengan tiga bit 010; setiap digit berurutan dibentuk dengan mencari sufiks terpanjang dari urutan yang juga muncul sebelumnya dalam urutan, dan melengkapi bit mengikuti penampilan sufiks sebelumnya yang paling baru.
Setiap akhir bit yang terbatas terjadi secara bersebelahan, tak terhingga sering dalam urutan
Beberapa digit pertama dari urutan tersebut adalah:
010011010111000100001111 ... (urutan A038219 dalam OEIS ).
Menggabungkan 8 bit dari urutan ke byte, kita akan mendapatkan output ASCII yang bisa kita output ke layar atau ke file dan yang berisi setiap kemungkinan output hingga . Program ini akan menampilkan bagian pi, lirik “Never will give up up” , beberapa seni ASCII yang bagus, kode sumbernya sendiri, dan semua yang Anda inginkan untuk ditampilkan.
Untuk menguji kebenaran, berikut adalah hash untuk 256 byte pertama dari urutan:
MD5: 5dc589a06e5ca0cd9280a364a456d7a4
SHA-1: 657722ceef206ad22881ceba370d32c0960e267f
8 byte pertama dari urutan dalam notasi heksadesimal adalah:
4D 71 0F 65 27 46 0B 7C
Aturan:
Program Anda harus menampilkan urutan Ehrenfeucht-Mycielski (tidak ada yang lain), menggabungkan 8 bit ke karakter byte / ASCII.
Program terpendek (jumlah karakter) menang. Kurangi 512 dari jumlah karakter Anda jika Anda berhasil membuat urutan dalam waktu linier per byte yang dihasilkan .
Jawaban:
C, –110 karakter
Versi program ini menggunakan algoritma linear-runtime untuk menghasilkan urutan. Mengurangi 512 dari 402 karakter dalam program memberikan total 110 negatif.
Sesuai masalahnya, program berjalan dalam loop tak terbatas, yang mengharuskan banyak alokasi memori, dan menggunakan
realloc()
untuk menjaga urutan yang berdekatan dapat berkontribusi untuk tumpukan fragmentasi. Anda dapat meningkatkan penggunaan memori program dengan mengganticalloc(7,8)
pada baris pertama dengancalloc(1,sizeof*v)
. Ini akan membantu terutama pada mesin 32-bit, di mana 56 kemungkinan terlalu besar dengan faktor dua.Kode semacam ini tidak dapat dibaca, dan tidak dengan cara yang menarik; untuk itu saya minta maaf. Terus terang, bahkan versi yang tidak diserang tidak terlalu jelas:
(Kode yang tidak diubah di atas berdasarkan pada kode yang ditulis oleh Grzegorz Herman dan Michael Soltys, sebagaimana dirujuk dalam deskripsi masalah, dan dari halaman utama Soltys .)
Terima kasih kepada @schnaader dan @res karena melaporkan bug dalam versi awal.
sumber
malloc
versi golf, ungolfed dan modifikasi menghentikan output setelah sekitar 10.000 byte dan terus mengalokasikan memori,prog > out.dat
memberikan crash instan dengan hanya ~ 700 KB penggunaan memori. Jika saya menyisipkanprintf("\n%i\n", size);
setelahrealloc
, output terbesar adalah4
. Sistem: Windows 7 Prof. 64-Bit, 4 GB RAM, GCC 4.6.1Ruby,
10910410194 karakterImplementasi di Ruby menggunakan ekspresi reguler untuk pencarian suffix. Karena ini membutuhkan waktu yang cukup lama hingga kehabisan memori, program harus diakhiri oleh pengguna.
Sunting: Saya baru memperhatikan bahwa itu sudah cukup untuk memulai dengan urutan
0
.Sunting 2: Proposal res menyimpan 2 karakter, beberapa lainnya karena kami tidak harus memotong satu byte sebelumnya
pack
.sumber
s=(s[/(.*).*\1/][/.#{$1}/]<?1??1:?0)+s
akan menyimpan dua karakter lain.?C
?Perl, 95 karakter
Saya sebenarnya memiliki versi setengah jalan yang layak pada awalnya. Kemudian saat saya bermain golf, setiap versi menjadi lebih lambat. Semakin lambat.
Tiga karakter pertama (
$|=
) tidak perlu, secara tegas ... tetapi tanpa itu, Anda biasanya harus menunggu skrip untuk menyelesaikan menghasilkan 4096 byte penuh sebelum Anda akan melihat salah satu output. Dan itu akan memakan waktu berjam-jam. Mungkin berabad-abad; Saya tidak yakin. Apakah saya menyebutkan bahwa kinerja program ini agak memburuk dari waktu ke waktu? Jadi karena itu saya merasa harus memasukkan mereka ke dalam penghitungan.Di sisi lain, skrip ini memiliki salah satu regeks terburuk yang pernah saya buat, jadi saya pikir saya bangga karenanya.
sumber