하스켈, 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
대한 =<<
기능이므로 목록 모나드를 사용하면 여기에서 몇 문자를 면도 할 수 있습니다.