ทุกคำจาก babab ถึง zyzyz


38

งานของคุณคือการเขียนโปรแกรมที่จะส่งออกรายการที่สามารถอ่านได้ของทุกคำห้าตัวอักษรด้วยโครงสร้าง

พยัญชนะ - สระ - พยัญชนะ - สระ - พยัญชนะ

เอาต์พุตควรเรียงลำดับตามตัวอักษรด้วยหนึ่งคำต่อบรรทัดและไม่มีคำซ้ำสองครั้ง สามารถเป็นตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ แต่ไม่ผสม ดังนั้นรายการสามารถเริ่มต้นและสิ้นสุดเช่นนี้:

babab  
babac  
babad  
...  
zyzyw  
zyzyx  
zyzyz 

เสียงสระคือa - e - i - o - u - yส่วนอีก 20 ตัวอักษรเป็นพยัญชนะ
คำไม่จำเป็นต้องเป็นคำในพจนานุกรมที่แท้จริง
รหัสที่สั้นที่สุดชนะ

หมายเหตุ: ไม่กี่ปีที่ผ่านมาฉันสะดุดโปรแกรมในเว็บไซต์มหาวิทยาลัยที่ทำอย่างนั้น เปลี่ยนชื่อและนามสกุลของฉันให้พอดีกับข้อ จำกัด ของ cvcvc และฉันจะไปทำตัวเอง


7
ฉันเห็นสองสิ่งที่นี่ อันดับแรกมีคำพูดที่ไร้สาระจำนวนนี้ คุณคาดหวังว่าจะทดสอบรายการอย่างไร นอกจากนี้ยังมีชื่อมากมายที่ตรงกับข้อ จำกัด นั้น คนแรกที่นึกถึงคือJacobถึงแม้ว่าคนอื่น ๆ เช่นLucas จะพอดี
TrojanByAccident

9
@TrojanByAccident ฉันเชื่อว่าความท้าทายต้องใช้ตัวอักษรที่ตรงกันทั้งหมดที่เป็นไปได้ไม่ว่าจะเป็นชื่อ / คำภาษาอังกฤษ "คำไม่จำเป็นต้องเป็นคำในพจนานุกรมที่แท้จริง"
trichoplax

3
@wilks เมตาโพสต์ที่เกี่ยวข้อง - รูปแบบ i / o ที่เข้มงวดไม่ได้รับการยอมรับในชุมชน SE นี้ ความท้าทายนี้มุ่งเน้นไปที่การสร้างคำ cvcvc ไม่ใช่การแทรกบรรทัดใหม่ระหว่างคำใช่หรือไม่
JungHwan Min

1
@JungHwanMin ขอบคุณสำหรับลิงค์ครั้งแรกที่นี่และฉันไม่รู้เกี่ยวกับสิ่งนี้ ฉันเห็นว่ามันเป็นรายการที่อ่านได้และเรียงตามตัวอักษรของคำ cvcvc ทั้งหมด ดังนั้นฉันจึงเห็นด้วยว่าตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กไม่สำคัญ แต่ฉันก็คิดว่าสตริงที่ยาวมากหรือพูดอาร์เรย์ที่ซ้อนกันบางอันในขณะที่การใช้งานทางเทคนิคจะไม่เป็นคำตอบที่ดี
วิลก์ส

2
หลังจากใช้คำตอบที่ upvoted ไม่กี่ข้อสำหรับคำถามนี้พวกเขาเห็นได้ชัดว่าไม่สอดคล้องกับ "ผลลัพธ์ที่ควรเพิ่มขึ้นกับแต่ละคำในบรรทัดของตัวเอง" ข้อกำหนดนี้ผ่อนคลายและคุณสามารถแก้ไขคำถามเพื่อสะท้อนสิ่งนี้ได้หรือไม่? ฉันคิดว่าฉันจะเสียสักสองสามไบต์ถ้าคำตอบของฉันไม่ได้ถูก จำกัด โดยรูปแบบ
ElPedro

คำตอบ:


28

Mathematica, 72 65 61 ไบต์

Print@@@Tuples@{a=##/(b=#5#9#15#21#25#)&@@Alphabet[],b,a,b,a}

สำหรับการทดสอบผมขอแนะนำให้เปลี่ยนด้วยPrint@@@ ""<>#&/@Mathematica จะแสดงรูปแบบที่ถูกตัดทอนโดยแสดงคำสองสามคำแรกและสองสามคำสุดท้ายแทนที่จะใช้เวลาพิมพ์ 288,000 บรรทัดตลอดไป

คำอธิบาย

ในที่สุดฉันก็พบว่ามีประโยชน์สำหรับการแบ่งสตริง :)

ฉันรู้สึกทึ่งกับความเป็นไปได้ของการเพิ่มหรือเพิ่มจำนวนสตริงในขณะที่ แต่กรณีการใช้งานจริงนั้นค่อนข้าง จำกัด ประเด็นหลักคือสิ่งที่ชอบ"foo"+"bar"หรือ"foo"*"bar"(และดังนั้นรูปแบบสั้น ๆ"foo""bar") มีผลสมบูรณ์ใน Mathematica อย่างไรก็ตามมันไม่รู้จริง ๆ ว่าจะทำอย่างไรกับสตริงในนิพจน์ทางคณิตศาสตร์ดังนั้นสิ่งเหล่านี้จึงไม่ได้รับการประเมิน Mathematica ไม่ใช้ simplifications ทั่วไปบังคับแม้ว่า โดยเฉพาะอย่างยิ่งสตริงจะถูกจัดเรียงตามคำสั่งแบบบัญญัติ (ซึ่งค่อนข้างสับสนใน Mathematica เมื่อคุณเริ่มเรียงลำดับสตริงที่มีตัวอักษรของกรณีต่างๆตัวเลขและไม่ใช่ตัวอักษร) ซึ่งมักจะเป็นตัวหักเห แต่ไม่สำคัญที่นี่ . นอกจากนี้"abc""abc"จะทำให้ง่ายขึ้น"abc"^2(ซึ่งเป็นปัญหาเมื่อคุณมีสตริงซ้ำ แต่เราไม่มีอย่างนั้น) และสิ่งที่ชอบ"abc"/"abc"จะยกเลิกจริง ๆ (ซึ่งเราจะได้ใช้)

ดังนั้นสิ่งที่เราพยายามจะเล่นกอล์ฟที่นี่ เราต้องการรายชื่อของสระและรายการของพยัญชนะดังนั้นเราจึงสามารถป้อนมันTuplesเพื่อสร้างชุดค่าผสมที่เป็นไปได้ทั้งหมด วิธีแรกของฉันคือการแก้ปัญหาไร้เดียงสา:

Characters@{a="bcdfghjklmnpqrstvwxz",b="aeiouy",a,b,a}

รายชื่อพยัญชนะที่ hardcoded เจ็บเล็กน้อย Mathematica มีระบบAlphabetในตัวซึ่งจะทำให้ฉันสามารถหลีกเลี่ยงได้ถ้าฉันสามารถลบเสียงสระได้อย่างถูกวิธี นี่คือสิ่งที่มันยากหาก วิธีที่ง่ายที่สุดในการลบองค์ประกอบคือComplementแต่ท้ายที่สุดจะนานขึ้นโดยใช้หนึ่งในตัวเลือกต่อไปนี้:

{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}

(โปรดทราบว่าเราไม่จำเป็นต้องนำไปใช้Charactersกับทุกสิ่งอีกต่อไปเพราะAlphabet[]ให้รายการตัวอักษรไม่ใช่สตริง)

ลองทำธุรกิจเลขคณิตกันดู หากเราเป็นตัวแทนของตัวอักษรทั้งหมดเป็นผลิตภัณฑ์ของตัวอักษรแทนที่จะเป็นรายการเราสามารถลบตัวอักษรโดยการแบ่งง่าย ๆ เนื่องจากกฎการยกเลิก Complementที่จะช่วยประหยัดมากของไบต์เพราะเราจะไม่จำเป็นต้อง นอกจากนี้เป็นจริงไบต์สั้นกว่า"a""e""i""o""u""y" Characters@"aeiouy"ดังนั้นเราจึงทำเช่นนี้กับ:

a=##/(b="a""e""i""o""u""y")&@@Alphabet[]

ที่ที่เราจัดเก็บผลิตภัณฑ์พยัญชนะและสระในaและbตามลำดับ มันทำงานได้โดยการเขียนฟังก์ชั่นซึ่งจะเพิ่มการขัดแย้งทั้งหมดด้วย##และหารด้วยผลคูณของสระ ฟังก์ชันนี้ใช้กับรายการตัวอักษรซึ่งส่งผ่านแต่ละตัวอักษรเป็นอาร์กิวเมนต์แยก

จนถึงตอนนี้ดีมาก แต่ตอนนี้เรามี

{a=##/(b="a""e""i""o""u""y")&@@Alphabet[],b,a,b,a}

เป็นข้อโต้แย้งTuplesและสิ่งเหล่านั้นยังคงเป็นผลิตภัณฑ์ไม่ได้แสดงรายการ โดยปกติวิธีที่สั้นที่สุดในการแก้ไขปัญหาคือการวางList@@@ที่ด้านหน้าซึ่งทำให้ผลิตภัณฑ์กลายเป็นรายการอีกครั้ง น่าเสียดายที่การเพิ่ม 7 ไบต์เหล่านั้นทำให้นานกว่าวิธีที่ไร้เดียงสา

อย่างไรก็ตามปรากฎว่าTuplesไม่สนใจหัวของรายการภายในเลย ถ้าคุณทำ

Tuples[{f[1, 2], f[3, 4]}]

(ใช่สำหรับสิ่งที่ไม่ได้กำหนดf) คุณจะได้รับ:

{{1, 3}, {1, 4}, {2, 3}, {2, 4}}

เช่นเดียวกับถ้าคุณใช้แทนList fดังนั้นเราจึงสามารถส่งผ่านผลิตภัณฑ์เหล่านั้นไปยังTuplesและยังได้รับผลลัพธ์ที่ถูกต้อง วิธีนี้จะช่วยประหยัด 5 ไบต์บนวิธีการที่ไร้เดียงสาโดยใช้สตริงที่เข้ารหัสสองครั้ง

ตอนนี้"a""e""i""o""u""y"ก็ยังน่ารำคาญอยู่พอสมควร แต่เดี๋ยวก่อนเราสามารถบันทึกได้ไม่กี่ไบต์ที่นี่เช่นกัน! ข้อโต้แย้งของฟังก์ชั่นของเราคือตัวอักษรแต่ละตัว ดังนั้นหากเราเลือกอาร์กิวเมนต์ที่เหมาะสมเราสามารถนำกลับมาใช้ใหม่แทนที่จะใช้ตัวอักษรสตริงซึ่งสั้นกว่าสำหรับสามตัว เราต้องการให้การขัดแย้ง#(สั้น#1) #5, #9, #15, และ#21 #25หากเราหมด#เวลาแล้วเราก็ไม่จำเป็นต้องเพิ่มสิ่งใด ๆ*เพื่อเพิ่มจำนวนพวกมันเข้าด้วยกันเพราะ (regex) #\d+เป็นโทเค็นที่สมบูรณ์ซึ่งไม่สามารถต่อท้ายด้วยตัวเลขที่ไม่ใช่ตัวเลขได้ ดังนั้นเราจะจบลงด้วย#5#9#15#21#25#การประหยัดอีก 4 ไบต์


11
อ่านคำอธิบาย ดังนั้น ... โดยทั่วไปเวทมนตร์
Tally

ฉันประหลาดใจและประทับใจในTuplesกลอุบายของคุณ นั่นคือไม่มีเอกสารทั้งหมดใช่มั้ย และไม่คาดคิดเนื่องจากรูปแบบสองอินพุตTuples[list,n]เกี่ยวข้องกับการlistไม่มีListหัว (สำหรับฉันอย่างน้อย)!
ซิมมอนส์


1
@ngenisis ฉันพบว่าถ้อยคำสับสนมาก เนื่องจากยังไม่ชัดเจนว่านี่หมายถึงรายการนอกเมื่อใช้หลายรายการ อันที่จริงTuples[f[{1,2}, {3,4}]]จะช่วยให้{f[1, 3], f[1, 4], f[2, 3], f[2, 4]}แทน ไม่มีการบันทึกไว้ว่าหัวภายในจะถูกมองข้ามอย่างสิ้นเชิง
Martin Ender

@ASimmons cc. ^
Martin Ender

16

Perl, 47 ไบต์

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

นับ Shebang เป็นหนึ่งเดียว

ลองออนไลน์!


2
นี่เป็นสิ่งที่ดีทำได้ดีมาก! เหตุผลใดที่คุณไม่ได้ใช้say?
Dada

ขอบคุณ ฉันไม่เห็นด้วยที่-M5.01ควรเป็น 'ฟรี'
primo

1
-M5.010ผมชอบความคิดเห็นของคุณ และส่วนที่น่าสนใจในการเล่นกอล์ฟก็ไม่สามารถแทนที่ได้printด้วยsay...
Dada

ไม่ใช่-E(และต่อมาsay) เป็น freebie หรือไม่
Zaid


11

Python 3 - 110 ไบต์

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))

ความสนุกในการวนรอบตรงไปตรงมา :)


คิดว่าความคิดของเราเหมือนกัน แต่คุณเอาชนะฉันด้วย 10 ด้วย Python 3!
ElPedro

ฉันเพิ่งจะโพสต์เทียบเท่า python2 โดยใช้วิธีนี้ ช้าเกินไปโหวตให้คุณแทน
Chris H

8

Ruby, 72 71 52 ไบต์

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

ขอบคุณ Value Ink สำหรับแนวคิดพื้นฐานซึ่งทำให้มีขนาดถึง 60 ไบต์


1
มันสั้นลงเพื่อสร้างรายการของคำ 5 grepตัวอักษรและการใช้ หากคุณสร้างช่วงที่ใช้สตริงตัวพิมพ์เล็กคุณจะได้รับลำดับของคำตัวพิมพ์เล็กเท่านั้น puts ("babab".."zyzyz").grep /#{["[^aeiouy]"]*3*"[aeiouy]"}/for 60 bytes
Ink Value

7

05AB1E , 18 16 ไบต์

05AB1Eใช้การเข้ารหัสCP-1252

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

คำอธิบาย

ž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

เพื่อจุดประสงค์ในการทดสอบฉันขอแนะนำให้แทนที่žPด้วยพยัญชนะสองสามตัวและžOด้วยสระเล็กน้อย

ตัวอย่างการใช้พยัญชนะ 5 ตัวและสระ 3 ตัว


ใช้งานที่ดีของผลิตภัณฑ์คาร์ทีเซียน คงไม่คิดอย่างนั้น
Magic Octopus Urn


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

การยืดรั้งตรงไปตรงมา

ลองมันออนไลน์


หากแต่ละรายการจะต้องอยู่ในสายของตัวเองแล้วเรามี:

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 ไบต์

การเพิ่มสตริงสวย :)
6 ไบต์บันทึกโดย @Christoph

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

วนซ้ำสตริงทั้งหมดจากbababaถึงzyzyzและทดสอบว่าตรงกับรูปแบบหรือไม่ -nrทำงานด้วย


ฮ่า ๆ เล่นกอล์ฟกับภาษา buggy ฉันชอบมัน
Patrick Roberts

1
@PatrickRoberts ไม่ใช่ข้อผิดพลาด มันเป็นคุณสมบัติ : ฉันเสียใจที่พวกเขาฝังการส่งนัยเป็นจำนวนเต็มใน$a="001";$a++;บางวัน นั่นเป็นการเปลี่ยนแปลงที่ไม่สะดวกนัก
ติตัส

1
for($s=$v=aeiouy;++$s<zyzza;)preg_match("#[^$v][$v][^$v][$v][^$v]#",$s)&&print"$s\n";ช่วยให้คุณประหยัด 1 ถ่าน &&น่าเศร้าที่คุณมีการเปลี่ยนแปลงก้องพิมพ์ไปใช้ การแทนที่\nด้วยตัวแบ่งบรรทัดจริงจะบันทึกอีกอันหนึ่ง
Christoph

1
คุณอาจบันทึกตัวอักษรบางตัวโดยใช้"#([^$v][$v]){2}​[^$v]#"แต่ฉันยังไม่ได้ทดสอบ
Christoph

1
@Christoph: Idk ทำไม แต่([^$v][$v]​){2}[^$v]ไม่ได้ทำงานในวงในขณะที่[^$v]([$v]​[^$v]){2}ไม่ ทั้งสองทำงานแบบสแตนด์อโลน (แม้จะมีตัวแปร) แม้ว่า
Titus

6

MATL , 21 ไบต์

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

ลองออนไลน์! (แต่เอาต์พุตถูกตัดทอน)

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

ฉันคิดว่ามันน่าจะใช้ได้แล้วโกนหนวด: 11Y2'y'h2Y2yX~yyy&Z*( ลองออนไลน์! )
Conor O'Brien

@ ConorO'Brien น่าเสียดายที่สร้างvcvcvรูปแบบcvcvcตามที่ต้องการ ขอบคุณนะ!
Luis Mendo

6

Python ขนาด 92 ไบต์

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

ไม่สามารถปล่อยให้itertoolsชนะ ซ้ำได้อีก 1 ไบต์ใน Python 2

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

นี่มันสุดยอดมาก ^ _ ^
ABcDexter

6

Haskell, 54 51 ไบต์

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

mapM func listfunc (list!!i)สร้างคำทั้งหมดโดยการใช้ตัวละครที่เป็นไปได้สำหรับดัชนีฉันจากรายชื่อที่ส่งกลับโดย

แก้ไข: @xnor พบ 2 ไบต์เพื่อบันทึกและดูวิธีแก้ปัญหาของเขาฉันพบอีกอันหนึ่ง


mapM id$take 5$cycle["bcdfghjklmnpqrstvwxz","aeiouy"]บันทึกเป็นไบต์
xnor

ยังดีกว่าหรือmapM(cycle["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0..4] mapM(["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0,1,0,1,0]มันจะเป็นการดีที่จะไม่ hardcode สระและพยัญชนะ แต่mapM(\n->[x|x<-['a'..'z'],elem x"aeiou"==odd n])[0..4]ก็ไม่ได้ทำให้มัน
xnor

@xnor: ขอบคุณ! การแทนที่cycleตัวแปรแรกของคุณด้วยการเรียกซ้ำแบบชัดแจ้งจะบันทึกไบต์เพิ่มเติม
nimi

5

Brachylogขนาด 18 ไบต์

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

ลองออนไลน์!

คำอธิบาย

@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

ฉันประหลาดใจที่ต้องการgและbแต่การทดสอบมันเป็นเพราะjดูเหมือนว่าจะปฏิเสธที่จะใช้รายการของสตริงเป็นข้อมูลเข้า? :eaแสดงให้เห็นถึงจุดแข็งของ Prolog / Brachylog จริง ๆ และเป็นขั้นตอนที่ภาษาอื่น ๆ ส่วนใหญ่หายากกว่ามาก

@ ais523 ใช่ฉันประหลาดใจด้วยว่าgและbจำเป็น jดูเหมือนว่าจะบั๊กและนี่เป็นอีกครั้งเนื่องจากความยากลำบากในการแยกความแตกต่างของรายการข้อโต้แย้งจากเพียงรายการ ฉันอาจแก้ไขปัญหานี้แม้ว่าจะทำให้การใช้งานซับซ้อนขึ้นอีกครั้ง ฉันอาจจะไม่แก้ไขและใช้เวลาของฉันในการแก้ไขปัญหาหลักใน Brachylog รุ่นใหม่
ทำให้เสียชีวิต

5

JavaScript (ES6), 91 90 ไบต์

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

การแก้ไข

  • ETHproductions: -1 ไบต์โดยการลบกลุ่มภายนอกรอบผู้ประกอบการที่สามในforงบ

คำอธิบาย

สิ่งนี้นิยามฟังก์ชั่นวนซ้ำ 5 ความลึกที่ใช้พาริตีของความลึกของการโทรเพื่อกำหนดว่าจะย้ำสระหรือพยัญชนะ ในการทำซ้ำแต่ละครั้งมันจะตรวจสอบเพื่อดูว่าจะเรียกคืนหรือพิมพ์โดยตรวจสอบจำนวนของการเรียกซ้ำที่เหลืออยู่และเชื่อมต่อตัวอักษรของการวนซ้ำปัจจุบันไปยังจุดสิ้นสุดของสตริงอักขระ 5 ตัวที่ปัจจุบัน

ทางเลือก 89 โซลูชันไบต์สมมติว่าการเข้ารหัส 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)}

โซลูชันทางเลือก 96 ไบต์ที่ส่งคืนเอาต์พุตทั้งหมดเป็นสตริงเดี่ยว:

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

ดำเนินการด้วยความเสี่ยงของคุณเอง สำหรับการแก้ปัญหา 91 ไบต์เพียงแค่ใช้f()และสำหรับ 97 console.log(f())ไบต์ทางเลือกการใช้งาน


ฉันลองเปลี่ยนวิธีแก้ปัญหาให้เป็นเครื่องกำเนิดไฟฟ้าด้วยวิธีที่ต่างกันสองวิธี การใช้รูปแบบชวเลขที่สนับสนุนโดย Firefox นั้นมีความยาวเท่ากัน: f=(s='',i=2)=>(for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))for(q of i?f(s+c,i-1):[s+c])q)การใช้แบบฟอร์มมาตรฐานนั้นน่าเสียดายที่ไบต์จะยาวขึ้น: function*f(s='',i=2){for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))yield*i?f(s+c,i-1):[s+c]}ยังคงรอวันที่ตัวกำเนิดกำเนิดเป็นตัวเลือกที่สั้นที่สุด ...
ETHproductions

1
btw คุณสามารถลบ parens ภายในในfor...ofคำสั่งเพื่อบันทึก byte
ETHproductions

5

C, 201 199 186 184 183 169 163 ไบต์

การทำแตกต่างจากวิธีการนับพื้นฐานก่อนหน้าเล็กน้อย:

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);}}

Ungolfed:

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) ;
    }
}

และเขียนด้วยวิธีทั่วไปมากกว่า:

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("");
    }
}

โดยทั่วไปฉันมีเคาน์เตอร์และsอาร์เรย์ของสตริงที่มีตัวอักษรทั้งหมดที่มากกว่าที่เราควรจะย้ำสำหรับแต่ละเคาน์เตอร์ เคล็ดลับคือวงในขณะที่ : มันถูกใช้เพื่อเพิ่มเคาน์เตอร์ที่เริ่มต้นจากขวาสุด หากเราเห็นว่าตัวละครตัวต่อไปที่เราควรแสดงคือตัวละครที่เป็นโมฆะตอนจบเรารีสตาร์ทตัวนับเป็นศูนย์และ "ตัวดำเนินการ" จะถูกแพร่กระจายไปยังตัวนับถัดไป

ขอบคุณ Cristoph!


ยินดีต้อนรับสู่ PPCG!
Martin Ender

1
char *cฉันคิดว่าพื้นที่ไม่จำเป็น
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("");}}ได้รับคุณที่ 177 มาที่คุณสามารถทำได้ดีกว่า;)
Christoph

2
การใช้i[5]={0}แทนการi[]={0,0,0,0,0}บันทึก 7 ไบต์
Falken

1
@Christoph Aha ขอบคุณ ทำได้ดีมาก แต่คุณดูเหมือนจะสนุกกับมันนั่นเป็นเหตุผลที่ฉันผลักดันความท้าทาย (ไม่ฉันล้อเล่น: ฉันทำอย่างนั้นเพราะฉันเจ็บปวดในตูด) อย่างจริงจังขอบคุณสำหรับการตรัสรู้
สลัว

4

Perl, 71 ไบต์

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

ลองออนไลน์!

คำอธิบาย

ฉันจะเพิ่มคำอธิบายเพิ่มเติมในภายหลัง

map{push@{1+/[aeiouy]/},$_}a..z;สร้างสองอาร์เรย์: @1ประกอบด้วยพยัญชนะและ@2ประกอบด้วยเสียงสระ
globเมื่อเรียกด้วยอาร์กิวเมนต์เช่น{a,b}{c,d}ส่งคืนการเรียงสับเปลี่ยนทั้งหมดขององค์ประกอบในวงเล็บปีกกา


4

Befunge, 95 ไบต์

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

ลองออนไลน์! แม้ว่าโปรดทราบว่าผลลัพธ์จะถูกตัดทอน

นี่เป็นเพียงการวนซ้ำในช่วง 0 ถึง 287999 โดยแสดงดัชนีเป็นตัวเลขผสม 20-6-20-6-20 โดยมี "ตัวเลข" ของตัวเลขที่ดึงมาจากตารางในสองบรรทัดสุดท้าย


4

Perl 6 , 70 ไบต์

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

คำอธิบายของส่วนที่น่าสนใจ:

.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

รหัสก่อนหน้านั้นเพิ่งสร้างรายการของสระ ( $_) และรายการของพยัญชนะ ( c) ซึ่ง verbose อย่างน่าเศร้า


4

Python 2 , 120 117 bytes

ขอบคุณ @WheatWizard สำหรับเคล็ดลับแท็บ

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

ลองออนไลน์!

ไม่แน่ใจว่าสามารถเล่นกอล์ฟได้มากแค่ไหน ลองตัดทอนออนไลน์ที่ 128KB แต่แสดงให้เห็นพอที่จะให้ความคิดได้ การรันแบบโลคัลด้วยรหัสการดีบักเพื่อนับจำนวนคำที่ให้รวมทั้งสิ้น 288000 ทำงานในเวลาประมาณ 45 วินาทีหากใครต้องการทดสอบ

zyzyv
zyzyw
zyzyx
zyzyz
Total word count: 288000

ไม่ตรงและไม่ใช่รุ่นแข่งขัน (พิมพ์อาร์เรย์ที่ซ้อนกันแทนรูปแบบที่ระบุ) สำหรับ 110 ไบต์:

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
เป็น implemenation ครั้งแรกของฉัน :)
Carra

แทนที่จะใช้ช่องว่างสำหรับการเยื้องทั้งหมดของคุณคุณสามารถใช้ช่องว่างสำหรับการเยื้องเดียวและแท็บสำหรับสองครั้ง
ข้าวสาลีตัวช่วยสร้าง

4

Perl 6, 53 Bytes

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

ใช้เวลาเล็กน้อยในการส่งออกใด ๆ ไม่มีประสิทธิภาพมาก ทำงานหรือไม่


ยินดีต้อนรับสู่ PPCG!
Martin Ender

4

xeger , 49 ไบต์

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

รับนิพจน์ปกติ, xeger เพียงแค่สร้างสตริงที่ตรงกันทั้งหมด เพื่อที่จะไม่ฆ่าเบราว์เซอร์มันจะหยุดทุก ๆ 1,000 ผลลัพธ์และคุณต้องคลิกเพื่อดำเนินการต่อ แต่มันจะไปถึงที่นั่นในที่สุด


นี่คือรุ่น 23- ไบต์ที่มีจุดบกพร่องในการ^แก้ไข:

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

เหล่านี้เป็นตัวละครคลาส "ทุกกรณีที่ต่ำกว่าพยัญชนะ ASCII" [:c]ด้วยyการยกเว้น^yและ "ทุกกรณีที่ต่ำกว่าสระ ASCII" [:v:]กับyเพิ่ม


สิ่งนี้ขึ้นอยู่กับรสชาติของ regex? (หรือถ้าคุณรีดของคุณเองมันรองรับคุณสมบัติอะไรบ้างมีเอกสารอะไรบ้าง?)
Martin Ender

@MartinEnder มันเป็นของคุณเองจากการสำรวจเส้นทาง DFA (เติบโตจากโปรแกรมสร้างภาพDFA / NFA ที่ฉันสร้างขึ้นสำหรับนักเรียนซึ่งมีเอกสารที่ จำกัด บางอย่าง) - ไม่มีการตอบกลับใด ๆ มันช้ามากสำหรับสตริงที่ยาวกว่า &คุณสมบัติที่น่าสนใจเฉพาะของการแสดงออกของตัวเองคือการร่วมกับ
Michael Homer

ฉันเพิ่มเอกสารที่เหลือลงในเพจและตัวอย่างบางส่วน
Michael Homer

1
ดูเหมือนว่าคุณจะใช้ช่วงในคลาสตัวละคร [bcdfghj-np-tvwxz]แล้วคุณจะทำ
Martin Ender

4

JavaScript (Firefox 30-57), 82 ไบต์

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

ส่งคืนอาร์เรย์ของสตริง เวอร์ชันที่เร็วมากสำหรับ102 101 (1 ไบต์ต้องขอบคุณ @ETHproductions) ไบต์:

_=>[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]

ดี มีพื้นที่ห่างไกลในรุ่นเร็วซึ่งสามารถลบได้ 101 ไบต์
ETHproductions

3

CJam , 32 31 29 28 bytes

บันทึก 2 ไบต์ขอบคุณ Martin Ender และ 1 ไบต์ขอบคุณ kaine

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

ลองออนไลน์! (โปรดทราบว่าเอาต์พุตจะถูกตัดบน TIO)

คำอธิบาย

"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>เพื่อให้ได้ตัวอักษร และจากนั้นจะบันทึกไบต์อื่นบน"aeiouy"_'{,97>^ 1$
Martin Ender

คุณไม่ต้องการตัวอักษรตัวแรก มันจะถือว่าถ้ามันจะเริ่มต้นของสแต็ค
เคน

@ kaine น่าสนใจไม่รู้ว่า ขอบคุณ
ธุรกิจ Cat

$ "aeiouy" _ '{, 97> ^] 3 * (;: m * N * $ ไม่สนใจเครื่องหมาย $ Idk วิธีใส่รหัสในความคิดเห็น
kaine

@kaine ใช้ backticks เช่น "` "
Conor O'Brien


3

Perl, 63 59 54 ไบต์

$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

พยายาม Perl กอล์ฟสำหรับการเปลี่ยนแปลง
แก้ไข: ดูเหมือนว่าฉันยังมีอะไรอีกมากมายให้เรียนรู้ ... :)


ดีคนหนึ่ง (แม้ว่าคำตอบของ Primo จะสั้นกว่า) คุณสามารถเขียนจุดจบ/$b[^$a]/&&say for"a"x5.."z"x5เพื่อบันทึกสองสามไบต์ แก้ไข: และคุณสามารถวางและทำ$b $a="aeiouy";/([^$a][$a]){2}[^$a]/&&say for"a"x5.."z"x5
Dada

aeiouyนอกจากนี้คุณไม่จำเป็นต้องมีคำพูดที่อยู่รอบ ๆ นอกจากนี้เนื่องจากการตรวจสอบ regex ของคุณสำหรับ 5 a.."z"x5ตัวอักษรที่คุณสามารถทำได้
Dada

@Dada: ขอบคุณ ในฐานะคนที่ใช้ Perl สำหรับการเขียนโปรแกรมปกติ แต่จนถึงตอนนี้ยังไม่ได้เล่นกอล์ฟฉันไม่เคยคิดที่จะใช้ประโยชน์จากโหมดที่ไม่เข้มงวด นั่นเป็นเหตุผลที่ฉันเลือก$aและ$bเป็นชื่อตัวแปรเนื่องจากสิ่งเหล่านั้นไม่จำเป็นต้องประกาศแม้ในโหมดเข้มงวด ... :) ฉันยังใช้ Perl 6 วันนี้มากซึ่งไม่ได้มีโหมดที่ไม่เข้มงวด
smls

3

สกาลา, 87 86 ไบต์

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)

คุณสามารถแทนที่f"$c$d$e$f$g"ด้วย""+c+d+e+f+gเพื่อบันทึกไบต์
corvus_192

3

R, 143 132 ไบต์

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))))

นี่เป็นครั้งแรกที่ฉันเล่นกอล์ฟรหัสดังนั้นฉันยินดีรับข้อเสนอแนะเพื่อสับมันเพิ่มเติม จนถึงตอนนี้มันเป็นมาตรฐาน R สวยทั้งหมด สิ่งที่อาจเป็นไปได้ยากเพียงอย่างเดียวคือ paste0 จะทำการวนกลับไปสู่ความยาวที่ยาวที่สุด

แก้ไข: เคล็ดลับที่ได้รับมอบหมายจากที่ใช้ rturnbull แทนที่ด้วยsapply(x,length)lengths


ยินดีต้อนรับสู่เว็บไซต์! นี่ดูค่อนข้างดี (ฉันเพิ่งตั้งโปรแกรมไปเล็กน้อยในตัวฉันเอง) ฉันขอแนะนำไม่รวมรหัสเก่าในคำตอบของคุณ ประวัติการแก้ไขจะพร้อมใช้งานเสมอเพื่อให้ทุกคนที่ปรารถนาจะสามารถดูได้เสมอ นี่เป็นเรื่องของสำนวนส่วนตัวมากกว่าดังนั้นอย่าลังเลที่จะเพิกเฉยต่อความคิดเห็นของฉัน
ข้าวสาลีตัวช่วยสร้าง

คุณสามารถบังคับมันด้วยฟังก์ชั่นการกำหนด114 ไบต์ !
Punintended

3

R, 111 98 ไบต์

เพิ่มyเป็นสระและ golfed off 13 ไบต์ด้วย @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="")

เราใช้expand.gridเพื่อสร้างชุดค่าผสมที่เป็นไปได้ทั้งหมดของVและCในเมทริกซ์ซึ่งเรากำหนดจากตัวแปรที่ตั้งไว้ล่วงหน้าletters(ตัวอักษร) เราย้อนกลับชุดค่าผสม (ตามค่าเริ่มต้นสำหรับตัวแปรแรกที่หมุนเร็วที่สุด) เพื่อให้มั่นใจว่าเรียงตามตัวอักษร จากนั้นเราวนซ้ำในแต่ละแถวของเมทริกซ์พิมพ์ตัวอักษรแต่ละตัวเพื่อ stdout เราใช้fillอาร์กิวเมนต์เพื่อcatให้แน่ใจว่าแต่ละคำเริ่มต้นในบรรทัดใหม่


ดี! คุณสามารถสับสิ่งนี้ลงไปอีก 98 ตัวอักษร (เพิ่ม 'y' เป็นสระหรือ 95 ถ้าไม่ได้) โดยใช้ตัวเลือกบางอย่างในแมวและโดยการเปลี่ยนชื่อ "ตัวอักษร": l = ตัวอักษร; v = c (1,5,9, 15,21,25); ใช้ (expand.grid (C <-l [-v] V <- L [V], C, V, C) [5: 1], 1, แมว , fill = T, sep = "")
Patrick B.

@PatrickB ขอบคุณ! ฉันได้รวมคำแนะนำของคุณแล้ว
rturnbull


2

Clojure 101 ไบต์

(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")))))

ไม่น่าตื่นเต้น ...


2

Ruby, 65 61 ไบต์

แนวทางที่แตกต่างอย่างสิ้นเชิง:

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

สิ่งใหม่ที่ฉันเรียนรู้วันนี้: ฟังก์ชั่นArray # product


2

C 361 ไบต์

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]);}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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]);
}

จะต้องมีวิธีการสั้นลงอย่างแน่นอน

คำอธิบาย

  • เก็บค่าจำนวนเต็มของ a, e, i, o, u, y ในอาร์เรย์ตัวเลข
  • เก็บตัวอักษรทั้งหมดในอาร์เรย์ถ้าเป็นเสียงสัมฤทธิ์แทนที่ด้วยพยัญชนะดังนั้นจึงมีค่าพยัญชนะที่ซ้ำกันในอาร์เรย์
  • ลบค่าพยัญชนะที่ซ้ำกัน
  • พิมพ์ชุดค่าผสมทั้งหมด cvcvc

หากคุณสามารถใส่เวอร์ชั่นที่ไม่น่าตื่นเต้นซึ่งจะช่วยได้อย่างมาก
SIGSTACKFAULT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.