Haskell, 48
f=(!!)(sequence=<<(tail$iterate(['A'..'Z']:)[]))
หักกอล์ฟ:
f n = (concatMap sequence $ tail $ iterate (['A'..'Z'] :) []) !! n
คำอธิบาย
ผู้sequence
ประสานงานของ Haskell รับรายการการกระทำและดำเนินการโดยส่งคืนผลลัพธ์ของการกระทำแต่ละรายการในรายการ ตัวอย่างเช่น:
sequence [getChar, getChar, getChar]
เทียบเท่ากับ:
do
a <- getChar
b <- getChar
c <- getChar
return [a,b,c]
ใน Haskell, การกระทำจะได้รับการปฏิบัติเช่นค่านิยมและได้รับการติดกาวเข้าด้วยกันโดยใช้>>=
(ผูก) และreturn
วิทยาการ ประเภทใดก็ได้อาจเป็น "การกระทำ" หากใช้ตัวดำเนินการเหล่านี้โดยมีอินสแตนซ์Monad
บังเอิญประเภทรายการมีอินสแตนซ์ monad ตัวอย่างเช่น:
do
a <- [1,2,3]
b <- [4,5,6]
return (a,b)
[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]
เท่ากับนี้ ขอให้สังเกตว่ารายการความเข้าใจนั้นมีความคล้ายคลึงกันอย่างยอดเยี่ยมอย่างไร:
[(a,b) | a <- [1,2,3], b <- [4,5,6]]
เนื่องจากรายการเป็นประเภทของ "การกระทำ" เราจึงสามารถใช้sequence
กับรายการได้ ด้านบนสามารถแสดงเป็น:
sequence [[1,2,3],[4,5,6]]
ดังนั้นsequence
ให้เรารวมกันฟรี!
ดังนั้นเพื่อสร้างรายการ:
["A","B"..."Z","AA","AB"]
ฉันแค่ต้องสร้างรายการเพื่อส่งต่อ sequence
[['A'..'Z'],['A'..'Z','A'..'Z'],...]
จากนั้นใช้concatMap
กับทั้งสองsequence
รายการและเชื่อมโยงรายการผลลัพธ์ บังเอิญconcatMap
เป็น=<<
ฟังก์ชั่นสำหรับรายการดังนั้นรายการ monad ให้ฉันโกนตัวละครไม่กี่ตัวที่นี่เช่นกัน