= 누조레보보 in haskell

전 기사



누조레 보보 @mattn

mattn씨
[
  ["ボ", ""],
  ["ジョ", ""],
  ["レ", "ー"],
  ["ヌ", "ー"],
  ["ボ", "ー"]
]

이 1 element 눈만을 shuffle 해 전체 flatten 같은 것이 깨끗이 쓸 수 있는 언어는 강할 것 같네요.



이것에 대해 나름대로 써 보았습니다.
하스켈 초보자이므로 더 이상 아름답지 못했습니다 ...
module BeaujolaisNouveau where

import Control.Arrow
import System.Random
import Control.Monad

main :: IO ()
main = do
    let beaujolaisNouveau = [ ["ボ", ""]
                            , ["ジョ", ""]
                            , ["レ", "ー"]
                            , ["ヌ", "ー"]
                            , ["ボ", "ー"]
                            ]
    res <- (liftM concat $ liftM concat $ shuffle1st beaujolaisNouveau)
    putStrLn res

shuffle1st :: [[a]] -> IO [[a]]
shuffle1st xs = do
    xs' <- shuffle $ fstL xs
    return $ zipWith (\x y -> [x, y]) xs' (sndL xs)


shuffle :: [a] -> IO [a]
shuffle (x:[])= return [x]
shuffle xs = do
        pickedIndex <- randomRIO (0, (length xs) - 1)
        let picked = xs !! pickedIndex

        rest <- shuffle $ restOf (pickedIndex + 1) xs
        return $ picked : rest

restOf :: Int -> [a] -> [a]
restOf _ (x:[]) = []
restOf n xs     = take (n - 1) xs ++ (drop n xs)

fstL :: [[a]] -> [a]
fstL []     = []
fstL (x:xs) = head x : fstL xs

sndL :: [[a]] -> [a]
sndL []     = []
sndL (x:xs) = head (tail x) : sndL xs

결과





[2019-11-27 17:43]

좋은 웹페이지 즐겨찾기