Mathematica, 72 65 61 byte
Print@@@Tuples@{a=##/(b=#5#9#15#21#25#)&@@Alphabet[],b,a,b,a}
Untuk pengujian, saya sarankan mengganti Print@@@
dengan ""<>#&/@
. Mathematica kemudian akan menampilkan formulir terpotong yang menunjukkan beberapa kata pertama dan terakhir, daripada mengambil selamanya untuk mencetak 288.000 baris.
Penjelasan
Saya akhirnya menemukan kegunaan untuk membagi string. :)
Saya telah tertarik dengan kemungkinan menambahkan atau mengalikan string untuk sementara waktu, tetapi kasus penggunaan sebenarnya cukup terbatas. Poin utamanya adalah sesuatu seperti "foo"+"bar"
atau "foo"*"bar"
(dan akibatnya, bentuk pendek "foo""bar"
) benar-benar valid dalam Mathematica. Namun, itu tidak benar-benar tahu apa yang harus dilakukan dengan string dalam ekspresi aritmatika, sehingga hal-hal ini tetap tidak dievaluasi. Mathematica memang menerapkan penyederhanaan yang berlaku secara umum. Secara khusus, string akan diurutkan ke dalam urutan kanonik (yang cukup kacau di Mathematica, setelah Anda mulai menyortir string yang berisi huruf dari berbagai kasus, digit dan non-huruf), yang sering kali merupakan dealbreaker, tetapi tidak masalah di sini . Selanjutnya, "abc""abc"
akan disederhanakan menjadi"abc"^2
(yang merupakan masalah ketika Anda mengulangi string, tapi kami juga tidak memilikinya), dan sesuatu seperti itu "abc"/"abc"
akan benar-benar dibatalkan (yang bahkan akan kami manfaatkan).
Jadi apa yang kita coba golf di sini. Kami membutuhkan daftar vokal dan daftar konsonan, sehingga kami dapat memberi mereka makan Tuples
untuk menghasilkan semua kombinasi yang mungkin. Pendekatan pertama saya adalah solusi naif:
Characters@{a="bcdfghjklmnpqrstvwxz",b="aeiouy",a,b,a}
Daftar konsonan hardcoded itu sedikit sakit. Mathematica memang memiliki Alphabet
built-in yang memungkinkan saya untuk menghindarinya, jika saya bisa menghapus vokal dengan cara yang murah. Di sinilah sulitnya. Cara paling sederhana untuk menghapus elemen adalah Complement
, tetapi itu berakhir lebih lama, menggunakan salah satu opsi berikut:
{a=Complement[Alphabet[],b=Characters@"aeiouy"],b,a,b,a}
{a=Complement[x=Alphabet[],b=x[[{1,5,9,15,21,25}]]],b,a,b,a}
(Perhatikan bahwa kita tidak perlu menerapkan Characters
semuanya lagi, karena Alphabet[]
memberikan daftar surat, bukan string.)
Jadi mari kita coba bisnis aritmatika itu. Jika kami mewakili seluruh alfabet sebagai produk surat dan bukan daftar, maka kami dapat menghapus huruf dengan pembagian sederhana, karena aturan pembatalan. Itu menghemat banyak byte karena kita tidak perlu Complement
. Selanjutnya, "a""e""i""o""u""y"
sebenarnya satu byte lebih pendek dari Characters@"aeiouy"
. Jadi kami melakukan ini dengan:
a=##/(b="a""e""i""o""u""y")&@@Alphabet[]
Di mana kami menyimpan produk konsonan dan vokal masing-masing dalam a
dan b
. Ini bekerja dengan menulis fungsi yang melipatgandakan semua argumennya ##
dan membaginya dengan produk vokal. Fungsi ini diterapkan ke daftar alfabet, yang meneruskan setiap huruf sebagai argumen terpisah.
Sejauh ini bagus, tapi sekarang sudah
{a=##/(b="a""e""i""o""u""y")&@@Alphabet[],b,a,b,a}
sebagai argumen Tuples
, dan hal-hal itu masih berupa produk, bukan daftar. Biasanya, cara terpendek untuk memperbaikinya adalah dengan meletakkan List@@@
di bagian depan, yang mengubah produk menjadi daftar lagi. Sayangnya, menambahkan 7 byte itu membuatnya lebih lama dari pendekatan naif.
Namun, ternyata sama Tuples
sekali tidak peduli dengan kepala daftar batin. Jika kamu melakukan
Tuples[{f[1, 2], f[3, 4]}]
(Ya, untuk yang tidak ditentukan f
.) Anda akan mendapatkan:
{{1, 3}, {1, 4}, {2, 3}, {2, 4}}
Sama seperti jika Anda telah menggunakan List
bukan f
. Jadi kita benar-benar dapat melewatkan produk-produk itu langsung ke Tuples
dan masih mendapatkan hasil yang tepat. Ini menghemat 5 byte dari pendekatan naif menggunakan dua string hardcoded.
Sekarang "a""e""i""o""u""y"
masih cukup mengganggu. Tapi tunggu, kita juga bisa menyimpan beberapa byte di sini! Argumen fungsi kami adalah huruf individual. Jadi jika kita hanya memilih argumen yang tepat, kita dapat menggunakan kembali argumen string, yang lebih pendek untuk mereka bertiga. Kami ingin argumen #
(singkatan #1
), #5
, #9
, #15
, #21
dan #25
. Jika kita meletakkan #
di bagian akhir, maka kita juga tidak perlu menambahkan apa pun *
untuk melipatgandakannya bersama-sama, karena (regex) #\d+
adalah token yang lengkap yang tidak dapat ditambahkan non-digit padanya. Karena itu kita berakhir dengan #5#9#15#21#25#
, menyimpan 4 byte lagi.