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