Tugas Anda adalah menulis sebuah program yang akan menampilkan daftar yang dapat dibaca dari setiap lima huruf kata dengan struktur:
konsonan - vokal - konsonan - vokal - konsonan
Outputnya harus disortir berdasarkan abjad dengan satu kata per baris dan tidak ada kata yang diulang dua kali. Ini bisa huruf kecil atau huruf besar tetapi tidak dicampur. Jadi daftar dapat dimulai dan diakhiri seperti ini:
babab
babac
babad
...
zyzyw
zyzyx
zyzyz
Vokal adalah sebuah - e - i - o - u - y , 20 huruf Inggris-abjad lainnya adalah konsonan.
Kata-kata tidak harus berupa kata-kata kamus yang sebenarnya.
Kode terpendek menang.
Catatan: Beberapa tahun yang lalu saya menemukan sebuah program di situs web universitas yang melakukan hal itu. Ternyata nama depan dan belakang saya sesuai dengan batasan cvcvc, dan saya sudah googling sendiri.
Jawaban:
Mathematica,
726561 byteUntuk 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: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 adalahComplement
, tetapi itu berakhir lebih lama, menggunakan salah satu opsi berikut:(Perhatikan bahwa kita tidak perlu menerapkan
Characters
semuanya lagi, karenaAlphabet[]
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 dariCharacters@"aeiouy"
. Jadi kami melakukan ini dengan:Di mana kami menyimpan produk konsonan dan vokal masing-masing dalam
a
danb
. 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
sebagai argumen
Tuples
, dan hal-hal itu masih berupa produk, bukan daftar. Biasanya, cara terpendek untuk memperbaikinya adalah dengan meletakkanList@@@
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(Ya, untuk yang tidak ditentukan
f
.) Anda akan mendapatkan:Sama seperti jika Anda telah menggunakan
List
bukanf
. Jadi kita benar-benar dapat melewatkan produk-produk itu langsung keTuples
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.sumber
Tuples
trik Anda . Itu sepenuhnya tidak berdokumen, kan? Dan tak terduga mengingat bagaimana bentuk dua inputTuples[list,n]
berurusan denganlist
tidak memilikiList
kepala (setidaknya untuk saya)!List
. Kepala pada setiap level dalam array yang dihasilkan olehTuples
akan sama dengan kepala daftar .Tuples[f[{1,2}, {3,4}]]
memberi{f[1, 3], f[1, 4], f[2, 3], f[2, 4]}
sebagai gantinya. Tidak didokumentasikan bahwa kepala bagian dalam benar-benar diabaikan.Perl, 47 byte
Menghitung shebang sebagai satu.
Cobalah online!
sumber
say
?-M5.01
harus 'gratis'.-M5.010
. Dan bagian yang menarik dalam bermain golf bukan untuk menggantikanprint
dengansay
...-E
(dan selanjutnyasay
) freebie?Python 3 - 110 byte
Langsung menyenangkan :)
sumber
Ruby,
72 7152 byteBerkat Value Ink untuk ide dasarnya, yang membawanya ke 60 byte.
sumber
grep
. Jika Anda menghasilkan rentang yang menggunakan string huruf kecil, Anda mendapatkan urutan kata-kata huruf kecil saja.puts ("babab".."zyzyz").grep /#{["[^aeiouy]"]*3*"[aeiouy]"}/
untuk 60 byte05AB1E ,
1816 byte05AB1E menggunakan pengkodean CP-1252 .
Penjelasan
Untuk tujuan pengujian, saya sarankan mengganti
žP
dengan beberapa konsonan danžO
dengan beberapa vokal.Contoh menggunakan 5 konsonan dan 3 vokal
sumber
Python 2 ,
12010294 byteCobalah online!
sumber
Pure Bash, 74
Ekspansi brace langsung.
Cobalah online .
Jika setiap item harus pada barisnya sendiri, maka kita memiliki:
Pure Bash, 84
sumber
PHP,
88868480 bytekenaikan string cantik :)
6 byte disimpan oleh @Christoph
loop melalui semua string dari
bababa
kezyzyz
dan menguji apakah mereka cocok dengan pola. Jalankan dengan-nr
.sumber
$a="001";$a++;
suatu hari. Itu adalah perubahan yang sangat tidak nyaman.for($s=$v=aeiouy;++$s<zyzza;)preg_match("#[^$v][$v][^$v][$v][^$v]#",$s)&&print"$s\n";
menghemat 1 char. Sayangnya Anda harus mengubah gema untuk dicetak untuk digunakan&&
. Mengganti\n
dengan jeda baris nyata menyimpan yang lain."#([^$v][$v]){2}[^$v]#"
tetapi saya belum mengujinya.([^$v][$v]){2}[^$v]
tidak bekerja di loop, sementara[^$v]([$v][^$v]){2}
tidak. Keduanya bekerja mandiri (bahkan dengan variabel) sekalipun.MATL , 21 byte
Cobalah online! (tapi output terpotong).
sumber
11Y2'y'h2Y2yX~yyy&Z*
( Coba online! )vcvcv
pola, tidakcvcvc
seperti yang disyaratkan. Terimakasih Meskipun!Python, 92 byte
Tidak bisa membiarkan
itertools
menang Iteratif adalah 1 byte lebih lama di Python 2.sumber
Haskell,
5451 bytemapM func list
membangun semua kata dengan mengambil karakter yang memungkinkan untuk indeks i dari daftar yang dikembalikan olehfunc (list!!i)
.Sunting: @xnor menemukan 2 byte untuk disimpan dan dilihat solusinya, saya menemukan yang lain.
sumber
mapM id$take 5$cycle["bcdfghjklmnpqrstvwxz","aeiouy"]
menghemat satu byte.mapM(cycle["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0..4]
ataumapM(["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0,1,0,1,0]
. Akan lebih baik untuk tidak membuat hardcode vokal dan konsonan, tetapimapM(\n->[x|x<-['a'..'z'],elem x"aeiou"==odd n])[0..4]
tidak cukup membuatnya.cycle
dari varian pertama Anda dengan rekursi eksplisit menghemat byte tambahan.Brachylog , 18 byte
Cobalah online!
Penjelasan
sumber
g
danb
, tetapi mengujinya, ini karenaj
tampaknya menolak untuk mengambil daftar string sebagai input?:ea
benar-benar menunjukkan kekuatan Prolog / Brachylog, dan merupakan langkah yang menurut kebanyakan bahasa lain jauh lebih sulit.g
danb
diperlukan.j
tampaknya disadap dan sekali lagi ini disebabkan oleh sulitnya membedakan daftar argumen dari hanya daftar. Saya mungkin memperbaiki ini meskipun ini sekali lagi akan memperumit implementasi. Saya mungkin juga tidak memperbaikinya dan menginvestasikan waktu saya untuk memperbaiki masalah inti dalam versi baru Brachylog.JavaScript (ES6),
9190 byteSuntingan
for
pernyataanPenjelasan
Ini mendefinisikan fungsi rekursif 5-dalam yang menggunakan paritas kedalaman panggilan untuk menentukan apakah akan mengulangi vokal atau konsonan. Pada setiap iterasi, ia memeriksa untuk melihat apakah akan muncul kembali atau dicetak dengan memeriksa jumlah rekursi yang tersisa, dan menggabungkan huruf iterasi saat ini ke akhir string 5 karakter yang saat ini sedang dibangun kedalaman-pertama.
Alternatif solusi 89 byte dengan asumsi pengkodean ISO8859-1:
Solusi 96 byte alternatif yang mengembalikan seluruh output sebagai string tunggal:
Jalankan dengan risiko Anda sendiri. Untuk solusi 91 byte, cukup gunakan
f()
dan untuk alternatif 97 byte, gunakanconsole.log(f())
.sumber
f=(s='',i=2)=>(for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))for(q of i?f(s+c,i-1):[s+c])q)
Menggunakan formulir standar sayangnya satu byte lebih lama:function*f(s='',i=2){for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))yield*i?f(s+c,i-1):[s+c]}
Masih menunggu hari ketika generator adalah pilihan terpendek ...for...of
pernyataan untuk menyimpan byteC,
201199186184183169163 byteMelakukannya sedikit berbeda dibandingkan dengan metode penghitungan dasar sebelumnya:
Tidak Disatukan:
Dan ditulis dengan cara yang lebih konvensional:
Pada dasarnya, saya adalah counter, dan s array string yang berisi semua karakter di mana kita harus iterate, untuk setiap counter. Triknya adalah loop sementara bagian dalam : ia digunakan untuk menambah penghitung, mulai dari yang paling kanan. Jika kita melihat bahwa karakter berikutnya yang harus kita tampilkan adalah char null yang diakhiri, kita me-restart penghitung ke nol dan "carry" akan disebarkan ke penghitung berikutnya.
Cristoph terima kasih!
sumber
char *c
Saya pikir ruang tidak perlu.f(){char*c="bcdfghjklmnpqrstvwxz",*v="aeiouy",i[]={0,0,0,0,0},*s[]={c,v,c,v,c},j=0;while(j>=0){for(j=0;j<5;++j)putchar(s[j][i[j]]);for(;--j>=0&&!s[j][++i[j]];)i[j]=0;puts("");}}
membuat Anda mencapai 177. Ayo, Anda bisa melakukan yang lebih baik;).i[5]={0}
bukannyai[]={0,0,0,0,0}
menghemat 7 byte.Perl, 71 byte
Cobalah online!
Penjelasan
Saya akan menambahkan lebih banyak penjelasan nanti.
map{push@{1+/[aeiouy]/},$_}a..z;
menciptakan dua array:@1
berisi konsonan, dan@2
berisi vokal.glob
saat memanggil dengan argumen seperti{a,b}{c,d}
mengembalikan semua permutasi dari elemen di dalam kurung kurawal.sumber
Befunge, 95 byte
Cobalah online! , meskipun perhatikan bahwa output akan terpotong.
Ini hanya sebuah loop pada rentang 0 hingga 287999, menghasilkan indeks sebagai angka berbasis campuran 20-6-20-6-20, dengan "digit" angka yang diambil dari tabel pada dua baris terakhir.
sumber
Perl 6 , 70 byte
Penjelasan bagian yang menarik:
Kode sebelumnya hanya menghasilkan daftar vokal (
$_
) dan daftar konsonan (c
), yang sayangnya sangat bertele-tele.sumber
Python 2 ,
120117 byteTerima kasih kepada @WheatWizard untuk tip tab.
Cobalah online!
Tidak yakin ini bisa bermain golf banyak. Cobalah memotong secara online di 128KB tetapi menunjukkan cukup untuk memberikan ide. Jalankan lokal dengan kode debug untuk menghitung kata-kata memberi total 288000. Berjalan dalam sekitar 45 detik jika ada yang ingin menguji.
Versi tidak sesuai dan karenanya tidak bersaing (mencetak array bersarang alih-alih format yang ditentukan) untuk 110 byte:
sumber
Perl 6, 53 Bytes
Butuh sedikit waktu untuk mendapatkan hasil. Sangat tidak efisien. Apakah pekerjaan itu.
sumber
xeger , 49 byte
Diberikan ekspresi reguler, xeger hanya menghasilkan semua string yang cocok. Agar tidak membunuh browser, browser akan menjeda setiap 1000 output dan Anda perlu mengklik untuk melanjutkan, tetapi akhirnya akan sampai di sana.
Berikut adalah versi 23-byte dengan bug dalam perbaikan
^
:Ini adalah kelas karakter "semua konsonan ASCII huruf kecil"
[:c]
dengany
dikecualikan^y
, dan "semua huruf kecil ASCII vokal"[:v:]
dengany
menambahkan.sumber
&
.[bcdfghj-np-tvwxz]
.JavaScript (Firefox 30-57), 82 byte
Mengembalikan array string. Versi yang sangat cepat untuk
102101 (1 byte berkat @ETHproductions) byte:sumber
CJam ,
32312928 byteDisimpan 2 byte berkat Martin Ender dan 1 byte berkat kaine
Cobalah online! (Perhatikan bahwa output terputus pada TIO)
Penjelasan
sumber
'{,97>
untuk mendapatkan alfabet. Dan kemudian"aeiouy"_'{,97>^
untuk menyimpan byte lain1$
.Ditumpuk, tidak bersaing, 51 byte
Cukup mudah. Coba di sini!
sumber
Perl,
635954 byteMencoba Perl golf untuk perubahan.
EDIT: Sepertinya saya masih harus banyak belajar ... :)
sumber
/$b[^$a]/&&say for"a"x5.."z"x5
untuk menghemat beberapa byte. Edit: dan Anda dapat menjatuhkan$b
dan lakukan$a="aeiouy";/([^$a][$a]){2}[^$a]/&&say for"a"x5.."z"x5
.aeiouy
. Juga, karena regex Anda memeriksa 5 karakter, Anda dapat melakukannyaa.."z"x5
.$a
dan$b
sebagai nama variabel, karena itu tidak perlu dinyatakan bahkan dalam mode ketat ... :) Saya juga menggunakan Perl 6 hari ini, yang bahkan tidak memiliki mode non-ketat.Scala,
8786 bytesumber
f"$c$d$e$f$g"
dengan""+c+d+e+f+g
untuk menyimpan byte.R,
143132 byteIni adalah pertama saya pergi di golf kode jadi saya menyambut saran untuk memotongnya lebih jauh. Sejauh ini semuanya cukup standar R; satu-satunya hal yang mungkin rumit di sini adalah bahwa paste0 mendaur ulang argumennya dengan panjang yang terpanjang.
Sunting: menggunakan trik penugasan dari rturnbull, diganti
sapply(x,length)
denganlengths
.sumber
R,
11198 byteDitambahkan
y
sebagai vokal, dan bermain golf 13 byte, terima kasih kepada @Patrick B.Kami menggunakan
expand.grid
untuk menghasilkan semua kemungkinan kombinasiV
danC
dalam matriks, yang kami tentukan dari variabel presetletters
(alfabet). Kami membalikkan kombinasi (karena standarnya adalah variabel pertama yang memutar paling cepat) untuk memastikan urutan alfabet. Kemudian kita beralih melalui setiap baris matriks, mencetak setiap huruf ke stdout. Kami menggunakanfill
argumen untukcat
memastikan bahwa setiap kata dimulai pada baris baru.sumber
Clojure, 101 byte
Tidak terlalu menarik ...
sumber
Ruby,
6561 bytePendekatan yang sama sekali berbeda:
Hal-hal baru yang saya pelajari hari ini: fungsi produk # array
sumber
C 361 byte
Versi tidak disatukan:
Pasti ada cara untuk mempersingkat ini.
Penjelasan
sumber