The 9 Billion Names of God adalah cerita pendek oleh Arthur C. Clarke. Ini tentang sekelompok bhikkhu Tibet yang perintahnya ditujukan untuk menuliskan semua kemungkinan nama Tuhan, ditulis dalam alfabet mereka sendiri. Pada dasarnya, mereka dikhususkan untuk menulis setiap permutasi yang mungkin dari alfabet mereka, dibatasi oleh beberapa aturan. Dalam cerita itu, biara mempekerjakan beberapa insinyur untuk menulis sebuah program untuk melakukan semua pekerjaan untuk mereka. Tujuan Anda adalah menulis program itu.
Aturan:
Alfabet biarawan menggunakan 13 karakter (menurut perkiraan saya). Anda dapat menggunakan
ABCDEFGHIJKLM
atau set 13 karakter lainnya.Panjang minimum nama yang mungkin adalah 1 karakter. Panjang maksimal adalah 9 karakter.
Tidak ada karakter yang dapat diulang lebih dari 3 kali berturut-turut.
AAABA
adalah nama yang valid, tetapiAAAAB
tidak.Program Anda harus mencetak (untuk file) setiap nama yang mungkin secara berurutan dari
A
keMMMLMMMLM
, dipisahkan oleh karakter apapun tidak dalam abjad (baris baru, semi-titik dua, apa pun).Ini adalah kode-golf, dan Anda dapat menggunakan bahasa apa pun. Solusi terpendek pada 1 Juni 2014 menang.
Sunting: Nama-nama harus dimulai dengan A
dan diakhiri dengan MMMLMMMLM
, berlanjut melalui semua miliaran nama secara berurutan. Tetapi urutan tertentu terserah Anda. Anda dapat mencetak semua nama 1-huruf terlebih dahulu, lalu semua nama 2-huruf, dll. Atau Anda dapat mencetak semua nama yang dimulai dengan A
, kemudian semua yang dimulai dengan B
, atau beberapa pola lainnya. Tetapi manusia harus dapat membaca file dan mengkonfirmasi mereka semua ada di sana dan dalam urutan logis apa pun yang Anda pilih, dengan asumsi mereka punya waktu.
sumber
f(k) = k^9 + k^8 + k^7 - 5*k^6 + k^5 + k^4 + 4*k^3 - 2*k^2 + k
. Implementasi bijak: goo.gl/0srwhq105.8GB
semuanya dikatakan dan dilakukan! Saya senang bintang-bintang tidak keluar ... atau mungkin Anda harus mencetak daftar untuk itu terjadi ...?Jawaban:
Ruby, 46
Solusi orisinal saya, yang serupa lebih panjang dan salah (menghasilkan angka base13, yang tidak semuanya karena angka nol), tapi saya akan meninggalkannya di sini karena tetap mendapat suara.
sumber
k=*?A..?M*9;puts k-k.grep(/(.)\1{3}|[N-Z]/)
C 140
177 235Gaya prosedural lama yang bagus, tidak ada kemewahan.
Itu menghitung (tanpa menulis) 11.459.252.883 nama dalam 8 menit.
Sunting selanjutnya dengan runtime dan ukuran file nama. Saksikan langit ...
Runtime 57 menit, ukuran file 126.051.781.713 (9 karakter + crlf per baris). Tolong beritahu saya alamat email para biarawan, sehingga saya dapat mengirim mereka file zip, untuk pemeriksaan manual ...
Sunting Golf sedikit lagi, ulang cek untuk surat berulang.
Masih bukan yang terpendek, tapi setidaknya yang ini mengakhiri dan menghasilkan output yang diperlukan.
Runtime 51 mnt, ukuran file 113.637.155.697 (kali ini tidak ada yang kosong)
Catatan tambahan: jelas file outputnya sangat kompresibel, masih saya harus mematikan 7zip, setelah bekerja 36 jam ternyata sudah di 70%. Aneh.
Tidak disatukan
sumber
#include
?Golfscript,
5847 karakterTerima kasih kepada Peter Taylor, saya terhindar dari seppuku karena tidak mengalahkan solusi Ruby! Jalankan kode hingga 10 sendiri , dan ini buktinya melompati angka empat-dalam-baris .
sumber
n+
sebagai ganti''+n
. Saya pikir itu dalam aturan untuk menggunakan alfabet dengan karakter kontrol, jadi Anda juga bisa mengganti65+
dengan13+
dan menyimpan karakter lain dengan penamaan13:^
. Dan saya pikir itu13,{ stuff [...]
bisa terjadi13,1/{ stuff 4*
.13,
pada dapat diganti dengan{65+}%n+}%{ backtick {\4*/,}+78,1/%1-!},
untuk penghematan total 8, menyelamatkan hidup Anda.AAAM
itu harusAAABA
, dan tidakBAAAB
, kan?Utilitas baris perintah Bash + Linux, 43 byte
Ini menggunakan teknik yang mirip dengan jawaban saya di bawah ini, tetapi hanya menghitung di basis 16, dan menghapus semua "nama" yang mengandung
0
,e
atauf
juga yang memiliki lebih dari 3 digit berturut-turut yang sama.Konversikan ke alfabet biarawan sebagai berikut:
Bash + coreutils (dc dan egrep), 46 byte
Edit - versi yang diperbaiki
Ini akan membutuhkan waktu untuk berjalan tetapi saya pikir itu benar.
dc
menghitung mundur dari 14 ^ 9 ke 1 dan output di basis 14. egrep menyaring angka-angka dengan lebih dari 3 digit yang sama berturut-turut. Kami juga memfilter nama apa pun dengan angka "0", jadi kami mendapatkan set huruf yang benar dalam nama tersebut.Pertanyaan menentukan bahwa alfabet apa pun dapat digunakan, jadi saya menggunakan [1-9] [AD]. Tetapi untuk pengujian, ini dapat diubah menjadi [AM] menggunakan tr:
Ini menghasilkan urutan:
Perhatikan
dc
perintah ini membutuhkan rekursi ekor untuk bekerja. Ini berfungsi pada dc versi 1.3.95 (Ubuntu 12.04) tetapi tidak 1.3 (OSX Mavericks).sumber
APL (59)
Ditulis dalam alfabet sendiri :) Agak panjang. Ini juga membutuhkan waktu lama untuk dijalankan
9
, coba dengan angka yang lebih rendah untuk menguji jika Anda mau.Penjelasan:
{
...}¨⍳9
: untuk setiap nomor⍵
dari 1 hingga 9:⍳13*⍵
: dapatkan semua angka dari 1 hingga13^⍵
¯1⌽
: Memutar daftar ke kiri oleh 1 (jadi kita harus13^⍵
,1
,2
, ...,13^⍵-1
, yang berubah menjadi0, 1, 2 ...
modulo13^⍵
).(⍵/13)⊤
: menyandikan setiap angka dalam basis 13 menggunakan⍵
digit⎕A[1+
...]
: tambahkan satu (array berindeks 1) dan cari⎕A
(alfabet)↓⍉
: ubah matriks menjadi vektor vektor di sepanjang kolom.Z←⊃,/
: gabungkan setiap vektor vektor bagian dalam bersama-sama, berikan kami daftar nama yang mungkin (tetapi belum memenuhi aturan).{
...}¨
: untuk masing-masing nama, uji apakah itu memenuhi aturan 4-berulang-karakter:4/¨⎕A[⍳13]
: untuk setiap karakter, hasilkan string 4 dari karakter itu⍷∘⍵¨
: untuk setiap string, uji jika ada⍵
∨/,↑
: ambil yang logis atau dari semua tes ini,~
: dan balikkan, jadi itu1
berarti memenuhi aturan dan0
berarti tidak.Z/⍨
: pilih dariZ
semua elemen yang memenuhi reruntuhan↑
: tampilkan masing-masing pada baris yang terpisahsumber
Perl,
70686650 karakterPemakaian:
Yang menyenangkan adalah bahwa cetakannya buffer, sehingga Anda mendapatkan semua solusi 1-karakter dicetak terlebih dahulu, diikuti oleh kata-kata 2-karakter dan seterusnya.
sumber
Perl - 35 byte
Menghitung shebang sebagai satu byte.
Ini adalah terjemahan longgar dari jawaban histokrat .
A..1x9
sedikit aneh; ini adalah singkatan'A'..'111111111'
. Akumulator tidak akan pernah benar-benar mencapai nilai terminal (hanya berisi huruf besar), tetapi masih akan berakhir begitu panjangnya menjadi lebih dari 9 karakter. Ini dapat diuji, misalnya, dengan menggunakan1x4
sebagai gantinya.sumber
Array#-
).grep
akan melakukannya. Saya tidak sepenuhnya fasih di Ruby.Pyg (Waaay terlalu lama, untuk bahasa yang dibuat untuk golf)
berbisik : 101 ...
Meskipun ini dekat dengan bagaimana saya benar-benar akan melakukannya dengan Python:
Minus komplikasi garis panjang tentu saja;)
sumber
Pyth , 34 karakter
Penjelasan:
sumber
Python 2 - 212 byte
sumber
Japt , 21 byte
Cobalah online! (tautan hanya menghitung hingga
14**4
.)Bagaimana itu bekerja
Mengasumsikan implementasi ECMAScript 2017 standar sebagai lapisan JS (dan cukup memori untuk menyimpan array), di mana
Array
objek dapat memiliki2**53-1
panjang maksimum .sumber