ハスケル、48
f=(!!)(sequence=<<(tail$iterate(['A'..'Z']:)[]))
少ないゴルフ:
f n = (concatMap sequence $ tail $ iterate (['A'..'Z'] :) []) !! n
説明
Haskellのsequence
コンビネータはアクションのリストを取得して実行し、リスト内の各アクションの結果を返します。例えば:
sequence [getChar, getChar, getChar]
以下と同等です:
do
a <- getChar
b <- getChar
c <- getChar
return [a,b,c]
Haskellでは、アクションは値のように扱われ、>>=
(バインド)およびreturn
プリミティブを使用して接着されます。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
の=<<
関数なので、リストモナドではここでいくつかの文字を剃ることもできます。