Setiap kata dari babab hingga zyzyz


38

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.


7
Saya melihat dua hal di sini. Pertama, ada sejumlah kata-kata konyol seperti ini. Bagaimana Anda berharap untuk menguji entri? Juga, ada banyak nama yang sesuai dengan batasan itu. Yang pertama terlintas dalam pikiran adalah Jacob , meskipun yang lain seperti Lucas juga cocok
TrojanByAccident

9
@TrojanByAccident Saya percaya tantangan ini membutuhkan semua kombinasi huruf yang cocok, terlepas dari apakah itu nama / kata bahasa Inggris. "Kata-kata tidak harus berupa kata-kata kamus yang sebenarnya."
trichoplax

3
@wilks Postingan yang relevan - Format i / o yang ketat tidak dihargai di komunitas SE ini. Tantangan ini berfokus pada menghasilkan kata-kata cvcvc, tidak memasukkan baris baru di antara kata-kata, bukan?
JungHwan Min

1
@JungHwanMin Terima kasih atas tautannya, pertama kali di sini dan saya tidak tahu tentang ini. Saya melihatnya sebagai daftar yang dapat dibaca dan alfabet dari semua kata cvcvc. Jadi saya setuju bahwa huruf besar atau kecil benar-benar tidak masalah, tetapi saya juga berpikir bahwa satu string yang sangat panjang atau, katakan beberapa array bersarang, sementara secara teknis valid tidak akan menjadi jawaban yang bagus.
wilks

2
Setelah menjalankan beberapa jawaban tervvotifikasi untuk pertanyaan ini, mereka jelas tidak mematuhi "Outputnya harus bertahap dengan setiap kata pada barisnya sendiri". Apakah persyaratan ini telah dilonggarkan dan jika demikian dapatkah Anda mengedit pertanyaan untuk mencerminkan hal ini? Saya rasa saya bisa kehilangan beberapa byte jika jawaban saya tidak dibatasi oleh format.
ElPedro

Jawaban:


28

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 Tuplesuntuk 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 Alphabetbuilt-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 Characterssemuanya 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 adan 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 Tuplessekali 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 Listbukan f. Jadi kita benar-benar dapat melewatkan produk-produk itu langsung ke Tuplesdan 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, #21dan #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.


11
Membaca penjelasan. Jadi ... pada dasarnya sihir.
Tally

Saya terkejut dan terkesan dengan Tuplestrik Anda . Itu sepenuhnya tidak berdokumen, kan? Dan tak terduga mengingat bagaimana bentuk dua input Tuples[list,n]berurusan dengan listtidak memiliki Listkepala (setidaknya untuk saya)!
A Simmons


1
@ngenisis Saya menemukan kata-kata itu sangat membingungkan. Karena tidak jelas bahwa ini merujuk ke daftar luar ketika menggunakan banyak daftar. Memang 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.
Martin Ender

@ASimon cc. ^
Martin Ender

16

Perl, 47 byte

#!perl -l
/((^|[aeiouy])[^aeiouy]){3}/&&print for a..1x5

Menghitung shebang sebagai satu.

Cobalah online!


2
Ini bagus, bagus sekali! Adakah alasan Anda tidak menggunakan say?
Dada

Terima kasih. Saya tidak setuju bahwa itu -M5.01harus 'gratis'.
Primo

1
Saya suka pendapat Anda -M5.010. Dan bagian yang menarik dalam bermain golf bukan untuk menggantikan printdengan say...
Dada

Bukankah -E(dan selanjutnya say) freebie?
Zaid

@Zaid See Komentar
Dada

11

Python 3 - 110 byte

a,b="bcdfghjklmnpqrstvwxz","aeiouy";print(*(c+d+e+f+g for c in a for d in b for e in a for f in b for g in a))

Langsung menyenangkan :)


Pikirkan ide-ide kami sama tetapi Anda mengalahkan saya dengan 10 dengan Python 3!
ElPedro

Saya baru saja akan mengirim setara python2 menggunakan pendekatan ini. Terlalu lambat, sebagai gantinya Anda memilih.
Chris H

8

Ruby, 72 71 52 byte

puts (?z..?z*5).grep /#{["[^aeiouy]"]*3*"[aeiouy]"}/

Berkat Value Ink untuk ide dasarnya, yang membawanya ke 60 byte.


1
Lebih pendek untuk membuat daftar kata dan menggunakan 5 huruf 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 byte
Nilai Tinta

7

05AB1E , 18 16 byte

05AB1E menggunakan pengkodean CP-1252 .

žP3ãžO3ãâ€øJ€¨ê»

Penjelasan

žP3ã                # push all combinations of 3 consonants
    žO3ã            # push all combinations of 3 vowels
        â           # cartesian product
         €ø         # zip each pair of [ccc,vvv] (c=consonant,v=vowel)
           J        # join to list of strings ['cvcvcv','cvcvcv' ...]
            ۬      # remove last vowel from each
              ê     # sort and remove duplicates
              »     # join on newlines

Untuk tujuan pengujian, saya sarankan mengganti žPdengan beberapa konsonan dan žOdengan beberapa vokal.

Contoh menggunakan 5 konsonan dan 3 vokal


penggunaan yang bagus dari produk Cartesian. Tidak akan memikirkan itu.
Magic Octopus Mm


7

Pure Bash, 74

v={a,e,i,o,u,y}
c={b,c,d,f,g,h,{j..n},{p..t},v,w,x,z}
eval echo $c$v$c$v$c

Ekspansi brace langsung.

Cobalah online .


Jika setiap item harus pada barisnya sendiri, maka kita memiliki:

Pure Bash, 84

v={a,e,i,o,u,y}
c={b,c,d,f,g,h,{j..n},{p..t},v,w,x,z}
eval printf '%s\\n' $c$v$c$v$c

7

PHP, 88 86 84 80 byte

kenaikan string cantik :)
6 byte disimpan oleh @Christoph

for($s=$v=aeiouy;++$s<zyzza;preg_match("#[^$v]([$v][^$v]){2}#",$s)&&print"$s
");

loop melalui semua string dari bababake zyzyzdan menguji apakah mereka cocok dengan pola. Jalankan dengan -nr.


Lol, bermain golf dengan spek bahasa buggy, saya suka
Patrick Roberts

1
@ PatrickRoberts Ini bukan bug. Ini fitur. : Saya sedih mereka menempelkan pemeran implisit untuk integer ke $a="001";$a++;suatu hari. Itu adalah perubahan yang sangat tidak nyaman.
Titus

1
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 \ndengan jeda baris nyata menyimpan yang lain.
Christoph

1
Anda mungkin menyimpan beberapa karakter menggunakan "#([^$v][$v]){2}​[^$v]#"tetapi saya belum mengujinya.
Christoph

1
@Christoph: Idk mengapa, tetapi ([^$v][$v]​){2}[^$v]tidak bekerja di loop, sementara [^$v]([$v]​[^$v]){2}tidak. Keduanya bekerja mandiri (bahkan dengan variabel) sekalipun.
Titus

6

MATL , 21 byte

11Y2'y'h2Y2X~6Myyy&Z*

Cobalah online! (tapi output terpotong).

11Y2   % Push 'aeiou' (predefined literal)
'y'    % Push 'y'
h      % Concatenate: gives 'aeiouy'
2Y2    % Push 'abcdefghijklmnopqrstuvwxyz' (predefined literal)
X~     % Set symmetric difference: gives 'bcdfghjklmnpqrstvwxz'
6M     % Push 'aeiouy' again
yyy    % Duplicate the second-top element three times onto the top. The stack now
       % contains 'bcdfghjklmnpqrstvwxz', 'aeiouy', 'bcdfghjklmnpqrstvwxz',
       % 'aeiouy', 'bcdfghjklmnpqrstvwxz'
&Z*    % Cartesian product of all arrays present in the stack. Implicity display

Saya pikir ini harus berhasil, dengan mencukur byte: 11Y2'y'h2Y2yX~yyy&Z*( Coba online! )
Conor O'Brien

@ ConorO'Brien Sayangnya, itu menciptakan vcvcvpola, tidak cvcvcseperti yang disyaratkan. Terimakasih Meskipun!
Luis Mendo

6

Python, 92 byte

f=lambda i=-4,s='':i*[s]or sum([f(i+1,s+c)for c in i%2*'AEIOUY'or'BCDFGHJKLMNPQRSTVWXZ'],[])

Tidak bisa membiarkan itertoolsmenang Iteratif adalah 1 byte lebih lama di Python 2.

W='',
for s in(['AEIOUY','BCDFGHJKLMNPQRSTVWXZ']*3)[1:]:W=[w+c for w in W for c in s]
print W

Ini luar biasa ^ _ ^
ABcDexter

6

Haskell, 54 51 byte

l="bcdfghjklmnpqrstvwxz":"aeiouy":l
mapM(l!!)[0..4]

mapM func listmembangun semua kata dengan mengambil karakter yang memungkinkan untuk indeks i dari daftar yang dikembalikan oleh func (list!!i).

Sunting: @xnor menemukan 2 byte untuk disimpan dan dilihat solusinya, saya menemukan yang lain.


mapM id$take 5$cycle["bcdfghjklmnpqrstvwxz","aeiouy"]menghemat satu byte.
xnor

Lebih baik lagi, mapM(cycle["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0..4]atau mapM(["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0,1,0,1,0]. Akan lebih baik untuk tidak membuat hardcode vokal dan konsonan, tetapi mapM(\n->[x|x<-['a'..'z'],elem x"aeiou"==odd n])[0..4]tidak cukup membuatnya.
xnor

@ xnor: Terima kasih! Mengganti cycledari varian pertama Anda dengan rekursi eksplisit menghemat byte tambahan.
nimi

5

Brachylog , 18 byte

@W:@Dg:2jcb:eac@w\

Cobalah online!

Penjelasan

@W:@D                 The list ["aeiouy", "bcdfghjklmnpqrstvwxz"]
     g:2jcb           The list ["bcdfghjklmnpqrstvwxz", "aeiouy", "bcdfghjklmnpqrstvwxz", "aeiouy", "bcdfghjklmnpqrstvwxz"]
           :ea        Take one character of each string
              c       Concatenate into a single string
               @w     Write to STDOUT followed by a newline
                 \    Backtrack: try other characters of the string

Saya terkejut pada kebutuhan untuk gdan b, tetapi mengujinya, ini karena jtampaknya menolak untuk mengambil daftar string sebagai input? :eabenar-benar menunjukkan kekuatan Prolog / Brachylog, dan merupakan langkah yang menurut kebanyakan bahasa lain jauh lebih sulit.

@ ais523 Ya, saya juga terkejut bahwa gdan bdiperlukan. jtampaknya 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.
Fatalkan

5

JavaScript (ES6), 91 90 byte

f=(s='',i=4)=>{for(c of i%2?'aeiouy':'bcdfghjklmnpqrstvwxz')i?f(s+c,i-1):console.log(s+c)}

Suntingan

  • ETHproduksi: -1 byte dengan menghapus grup asing di sekitar operator ternary dalam forpernyataan

Penjelasan

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:

f=(s='',i=4)=>{for(c of i%2?'aeiouy':btoa`mÇ_äi骻-¿s`)i?f(s+c,i-1):console.log(s+c)}

Solusi 96 byte alternatif yang mengembalikan seluruh output sebagai string tunggal:

f=(s='',i=4,o='')=>eval("for(c of i%2?'aeiouy':'bcdfghjklmnpqrstvwxz')o+=i?f(s+c,i-1):s+c+`\n`")

Jalankan dengan risiko Anda sendiri. Untuk solusi 91 byte, cukup gunakan f()dan untuk alternatif 97 byte, gunakan console.log(f()).


Saya mencoba mengubah solusi menjadi generator dengan dua cara berbeda. Menggunakan formulir steno yang hanya didukung oleh Firefox memiliki panjang yang sama: 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 ...
ETHproduk

1
btw, Anda dapat menghapus parens dalam for...ofpernyataan untuk menyimpan byte
ETHproduk

5

C, 201 199 186 184 183 169 163 byte

Melakukannya sedikit berbeda dibandingkan dengan metode penghitungan dasar sebelumnya:

f(){for(char*c="bcdfghjklmnpqrstvwxz",*v="aeiouy",i[5]={0},*s[]={c,v,c,v,c},j=0;j<5;puts("")){for(j=5;j--;putchar(s[j][i[j]]));for(;j++<5&&!s[j][++i[j]];i[j]=0);}}

Tidak Disatukan:

f() {
    for(char *c="bcdfghjklmnpqrstvwxz", *v="aeiouy", i[5]={0}, *s[]={c,v,c,v,c}, j=0; j<5; puts("")) {
        for (j=5; j--; putchar(s[j][i[j]])) ;
        for (; j++ < 5 && !s[j][++i[j]]; i[j]=0) ;
    }
}

Dan ditulis dengan cara yang lebih konvensional:

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]]); // output the word
        while (--j>=0 && !s[j][++i[j]]) i[j]=0; // increment the counters
        puts("");
    }
}

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!


Selamat datang di PPCG!
Martin Ender

1
char *cSaya pikir ruang tidak perlu.
Christoph

1
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;).
Christoph

2
Menggunakan i[5]={0}bukannya i[]={0,0,0,0,0}menghemat 7 byte.
Falken

1
@Christoph Aha, terima kasih. Kerja bagus. Tapi Anda sepertinya menikmatinya, itu sebabnya saya mendorong tantangan (tidak, saya bercanda: Saya melakukannya hanya karena saya sakit di pantat). Serius, terima kasih atas pencerahan.
redup

4

Perl, 71 byte

map{push@{1+/[aeiouy]/},$_}a..z;$"=",";say for glob"{@1}{@2}"x2 ."{@1}"

Cobalah online!

Penjelasan

Saya akan menambahkan lebih banyak penjelasan nanti.

map{push@{1+/[aeiouy]/},$_}a..z;menciptakan dua array: @1berisi konsonan, dan @2berisi vokal.
globsaat memanggil dengan argumen seperti {a,b}{c,d}mengembalikan semua permutasi dari elemen di dalam kurung kurawal.


4

Befunge, 95 byte

::45*%\45*/:6%\6/:45*%\45*/:6%\6/1g,2g,1g,2g,1g,55+,1+:"}0":**-!#@_
bcdfghjklmnpqrstvwxz
aeiouy

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.


4

Perl 6 , 70 byte

$_=<a e i o u y>;my \c=[grep .none,"a".."z"];.say for [X~] c,$_,c,$_,c

Penjelasan bagian yang menarik:

.say for [X~] c, $_, c, $_, c

              c, $_, c, $_, c  # list of five lists
         [X ]                  # lazily generate their Cartesian product
           ~                   # and string-concatenate each result
.say for                       # iterate to print each result

Kode sebelumnya hanya menghasilkan daftar vokal ( $_) dan daftar konsonan ( c), yang sayangnya sangat bertele-tele.


4

Python 2 , 120 117 byte

Terima kasih kepada @WheatWizard untuk tip tab.

x,y='aeiouy','bcdfghjklmnpqrstvwxz'
for a in x:
 for e in x:
	for b in y:
		for c in y:
			for d in y:print b+a+c+e+d

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.

zyzyv
zyzyw
zyzyx
zyzyz
Total word count: 288000

Versi tidak sesuai dan karenanya tidak bersaing (mencetak array bersarang alih-alih format yang ditentukan) untuk 110 byte:

x,y='aeiouy','bcdfghjklmnpqrstvwxz'
print[[[[c+a+d+b+e for e in y]for d in y]for c in y]for b in x]for a in x]

1
Adalah implementasi pertama saya :)
Carra

Alih-alih menggunakan spasi untuk semua indentasi Anda, Anda dapat menggunakan spasi untuk indentasi tunggal dan tab untuk double.
Wheat Wizard

4

Perl 6, 53 Bytes

/<-[aeiouy]>**3%<[aeiouy]>/&&.say for [...] <a z>Xx 5

Butuh sedikit waktu untuk mendapatkan hasil. Sangat tidak efisien. Apakah pekerjaan itu.


Selamat datang di PPCG!
Martin Ender

4

xeger , 49 byte

([bcdfghj-np-tvwxz][aeiouy]){2}[bcdfghj-np-tvwxz]

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 ^:

([:c^y][:v:y]){2}[:c^y]

Ini adalah kelas karakter "semua konsonan ASCII huruf kecil" [:c]dengan ydikecualikan ^y, dan "semua huruf kecil ASCII vokal" [:v:]dengan ymenambahkan.


Berdasarkan rasa apa regex ini? (Atau jika Anda memutar sendiri, fitur apa yang didukungnya? Apakah ada dokumentasi tentang ini?)
Martin Ender

@ MartinEnder Ini adalah roll Anda sendiri dari DFA traversal (tumbuh dari visualiser DFA / NFA yang saya buat untuk siswa , yang memiliki beberapa dokumentasi terbatas) - tanpa referensi, tidak ada referensi, tidak ada yang tidak biasa. Sangat lambat untuk string yang lebih panjang. Satu-satunya fitur yang menarik dari ekspresi itu sendiri adalah hubungannya dengan &.
Michael Homer

Saya menambahkan dokumentasi sisanya ke halaman, dan beberapa sampel.
Michael Homer

1
Sepertinya Anda telah menerapkan rentang di kelas karakter. Maka Anda bisa melakukannya [bcdfghj-np-tvwxz].
Martin Ender

4

JavaScript (Firefox 30-57), 82 byte

f=(i=5)=>i?[for(s of f(i-1))for(c of i%2?'bcdfghjklmnpqrstvwxz':'aeiouy')s+c]:['']

Mengembalikan array string. Versi yang sangat cepat untuk 102 101 (1 byte berkat @ETHproductions) byte:

_=>[for(i of c='bcdfghjklmnpqrstvwxz')for(j of v='aeiouy')for(k of c)for(l of v)for(m of c)i+j+k+l+m]

Bagus. Ada ruang asing dalam versi cepat yang dapat dihapus untuk 101 byte
ETHproduk

3

CJam , 32 31 29 28 byte

Disimpan 2 byte berkat Martin Ender dan 1 byte berkat kaine

"aeiouy"_'{,97>^\1$1$1$N]:m*

Cobalah online! (Perhatikan bahwa output terputus pada TIO)

Penjelasan

"aeiouy"_ e# Push the six vowels and duplicate
'{,97>    e# Push the whole alphabet
^         e# Symmetric set difference of the alphabet with the vowels, yields the consonants only
\         e# Swap top two elements
1$1$1$    e# Copy the second-from-the-top string to the top three times
          e# This results in the array being consonants-vowels-consonants-vowels-consonants
N         e# Add a newline character to the end of the list
]         e# End an array. Puts everything done so far in an array
          e# since there was no explicit start of the array.
:m*       e# Reduce the array using Cartesian products

'{,97>untuk mendapatkan alfabet. Dan kemudian "aeiouy"_'{,97>^untuk menyimpan byte lain 1$.
Martin Ender

Anda tidak perlu karakter pertama. Diasumsikan jika dapat memulai stack.
kaine

@aine Menarik, tidak tahu itu. Terima kasih.
Kucing Bisnis

$ "aeiouy" _ '{, 97> ^] 3 * (;: m * N * $ abaikan tanda-tanda $. Idk bagaimana memasukkan kode ke dalam komentar.
kaine

@kaine Gunakan backticks, seperti "` ".
Conor O'Brien


3

Perl, 63 59 54 byte

$a="aeiouy";$b="[^$a][$a]"x2;for("a"x5.."z"x5){say if/$b[^$a]/}
$a="aeiouy";$b="[^$a][$a]"x2;/$b[^$a]/&&say for"a"x5.."z"x5

$a=aeiouy;$b="[^$a][$a]"x2;/$b[^$a]/&&say for a.."z"x5

Mencoba Perl golf untuk perubahan.
EDIT: Sepertinya saya masih harus banyak belajar ... :)


Bagus sekali (walaupun jawaban Primo lebih pendek). Anda dapat menulis akhir /$b[^$a]/&&say for"a"x5.."z"x5untuk menghemat beberapa byte. Edit: dan Anda dapat menjatuhkan $bdan lakukan $a="aeiouy";/([^$a][$a]){2}[^$a]/&&say for"a"x5.."z"x5.
Dada

Juga, Anda tidak perlu mengutip aeiouy. Juga, karena regex Anda memeriksa 5 karakter, Anda dapat melakukannya a.."z"x5.
Dada

@Dada: Terima kasih. Sebagai seseorang yang menggunakan Perl untuk pemrograman normal tetapi sampai sekarang tidak untuk bermain golf, saya bahkan tidak berpikir untuk mengeksploitasi mode non-ketat. Itu sebabnya saya memilih $adan $bsebagai 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.
smls

3

Scala, 87 86 byte

val a="aeiouy"
val b='a'to'z'diff a
for(c<-b;d<-a;e<-b;f<-a;g<-b)println(""+c+d+e+f+g)

Anda dapat mengganti f"$c$d$e$f$g"dengan ""+c+d+e+f+guntuk menyimpan byte.
corvus_192

3

R, 143 132 byte

q=letters;v=c(1,5,9,15,21,25);x=list(q[-v],q[v],q[-v],q[v],q[-v]);Reduce(paste0,mapply(function(a,b)rep(a,e=b/20),x,cumprod(sapply(x,length))))

q=letters;v=c(1,5,9,15,21,25);x=list(a<-q[-v],b<-q[v],a,b,a);Reduce(paste0,mapply(function(a,b)rep(a,e=b/20),x,cumprod(lengths(x))))

Ini 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)dengan lengths.


Selamat datang di situs ini! Ini terlihat cukup baik (saya hanya memprogram sedikit dalam R sendiri) Saya hanya akan merekomendasikan untuk tidak memasukkan kode lama dalam jawaban Anda. Sunting riwayat selalu tersedia sehingga siapa pun yang ingin selalu dapat melihatnya. Ini lebih merupakan hal gaya pribadi sehingga merasa bebas untuk mengabaikan pendapat saya.
Wheat Wizard

Anda dapat memaksanya dengan penugasan fungsi untuk 114 byte !
Punintended

3

R, 111 98 byte

Ditambahkan ysebagai vokal, dan bermain golf 13 byte, terima kasih kepada @Patrick B.

l=letters
v=c(1,5,9,15,21,25)
apply(expand.grid(C<-l[-v],V<-l[v],C,V,C)[,5:1],1,cat,fill=T,sep="")

Kami menggunakan expand.griduntuk menghasilkan semua kemungkinan kombinasi Vdan Cdalam matriks, yang kami tentukan dari variabel preset letters(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 menggunakan fillargumen untuk catmemastikan bahwa setiap kata dimulai pada baris baru.


Bagus! Anda dapat memotong ini lebih jauh menjadi 98 karakter (menambahkan 'y' sebagai vokal, atau 95 jika tidak) dengan menggunakan beberapa opsi pada kucing dan dengan mengganti nama "huruf": l = huruf; v = c (1,5,9, 15,21,25); berlaku (expand.grid (C <-l [-v], V <- l [v], C, V, C) [, 5: 1], 1, ‌ cat , isi = T, sep = "")
Patrick B.

@ PatrickrickB. Terima kasih! Saya telah memasukkan saran Anda.
rturnbull


2

Clojure, 101 byte

(print(apply str(for[V["aeiouy"]C["bcdfghjklmnpqrstvwxz"]a C b V c C d V e C](str a b c d e "\n")))))

Tidak terlalu menarik ...


2

Ruby, 65 61 byte

Pendekatan yang sama sekali berbeda:

(b=[*?a..?z]-a="aeiouy".chars).product(a,b,a,b){|x|puts x*""}

Hal-hal baru yang saya pelajari hari ini: fungsi produk # array


2

C 361 byte

f(){i,j,k,l,m;v[6]={97,101,105,111,117,121};c[25];s=26;for(i=0;i<26;i++)c[i]=97+i;for(i=0;i<26;i++){for(j=0;j<6;j++)if(c[i]==v[j])c[i]+=1;}for(i=0;i<s;i++)for(j=i+1;j<s;){ if(c[i]==c[j]){for(k=j;k<s-1;++k)c[k]=c[k+1];--s;}else ++j;}for(i=0;i<s;i++)for(j=0;j<6;j++)for(k=0;k<s;k++)for(l=0;l<6;l++)for(m=0;m<s;m++)printf("%c%c%c%c%c\n",c[i],v[j],c[k],v[l],c[m]);}

Versi tidak disatukan:

void f()
{   
int i,j, k,l,m;
int s=26;
int v[6]={97,101,105,111,117,121};
int c[s];

for(i=0;i<s;i++)
 c[i]=97+i;
for(i=0;i<s;i++)
{     
  for(j=0;j<6;j++)
    if(c[i]==v[j])
      c[i]+=1;
     }
for(i=0;i<s;i++)
 for(j=i+1;j<s;)
 { if(c[i]==c[j])
  {
    for(k=j;k<s-1;++k)
      c[k]=c[k+1];
      --s;  
  }else
   ++j;  
  }
for(i=0;i<s;i++)
  for(j=0;j<6;j++)
       for(k=0;k<s;k++)
        for(l=0;l<6;l++)
         for(m=0;m<s;m++)       
      printf("%c%c%c%c%c\n",c[i],v[j],c[k],v[l],c[m]);
}

Pasti ada cara untuk mempersingkat ini.

Penjelasan

  • Menyimpan nilai integer dari a, e, i, o, u, y dalam array numerik,
  • Menyimpan semua huruf dalam array, jika itu vokal, menggantinya dengan konsonan, jadi ada nilai duplikat konsonan dalam array,
  • Nilai konsonan rangkap yang dihapus,
  • Dicetak semua kombinasi cvcvc.

Jika Anda dapat menempatkan versi tanpa ungolfed yang akan sangat membantu.
SIGSTACKFAULT
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.