목록Season 1/하스켈 (21)
Graphics Programming
원문: http://brandon.si/code/the-state-monad-a-tutorial-for-the-confused/ 원작자 Brandon Simmons의 허락을 받아 번역한 글입니다. 원글의 라이센스는 Creative Commons BY-NC-SA로서 저작자 표시, 비영리, 동일조건변경허락 제약이 걸려있습니다. 하스켈의 State 모나드에 대한 이 튜토리얼은, 내가 읽었던 다른 글들에서 직면한 알기 어려웠던 차이점들을 이해하고, 모든 난해한 추상화를 파헤치기 위해 작성한 것이다. 이 글은 Maybe 모나드와 List 모나드는 잘 이해했지만 State 모나드에서 턱 막힌 사람들을 위한 것이다. 도움이 되기를! 데이터 선언 모나드를 이해하려면 그것의 자료형과 bind(>>=)의 정의를 살펴봐야 ..
문제: https://www.algospot.com/judge/problem/read/TSP1 n-queen은 며칠 고심하며 코딩했는데 익숙해져서 그런지 tsp는 코드를 금방 짤 수 있었다. 가지치기고 뭐고 그냥 무식하게 모든 경로를 따져서 해를 구한다. 저지는 통과하는데 비슷한 c++ 코드보다 약 15배 느림.. import Control.Monadimport Data.Arrayimport Data.List getInt :: IO IntgetInt = read `fmap` getLine :: IO Int main = do numCases Doublesolve table n = minimum $ map (\i -> goto i (delete i [1..n]) 0.0) [1..n] where goto fr..
문제: https://algospot.com/judge/problem/read/NQUEEN N의 범위가 1≤N≤12인 간단한 문제...인데 그냥 백트래킹으로 짜니까 시간 초과 ㅜㅜ 일단 n-queen 알고리즘과 무관한, 문제 입력을 처리하는 코드부터 작성한다. import Control.Monad main = do n n -> if row==1 then cnt else fill (board // [(row-1, 0)]) (row-1) ((board!(row-1)) + 1) cnt | peace -> fill (board // [(row,col)]) (row+1) 1 cnt | True -> (fill board row (col+1) cnt) where peace = (row==1) || False == ..
콘솔에서 숫자를 읽을 때 귀찮은 점은 문자열로 읽어서 변환을 해줘야 한다는 것이다. 예컨대 온라인 저지의 알고리즘 문제들은 보통 입력될 문제의 개수 C를 제시하고 C개의 테스트 입력들을 제시하기 때문에 이런 식으로 코딩하게 된다. import Control.Monad main = do numCases_s Int) -> IO String -> IO Int 따라서 num에는 Int 값이 바인딩된다. 사실 이 코드는 엄격한 타입 체계를 중시하는 하스켈에선 조금 엉성한데, print (num*3)을 print num로 바꿔보면 알 수 있다. main.hs:2:16: No instance for (Read a0) arising from a use of `read' The type variable `a0' is a..
하스켈은 간단한 로직을 라이브러리 함수로 제공하는 경우가 많아서 뭘 만들려다보면 직접 만들어야 하는지 문서에서 찾아봐야 하는지 모르겠다 -_- 암튼 실행 파일을 만들어보고자 처음으로 GHCi를 실행해서 숫자를 맞추는 간단한 게임을 구현해봤다. loop라는 보조 함수를 구현했는데 인자를 받아서 루프를 계속 돌거나 중단할 수 있는 기능이 있다. import System.IO main = loop 50 $ \goal -> do putStr "Enter your guess: " input > return (True, goal) else if n > goal then putStrLn "High!" >> return (False, goal) else putStrLn "Low!" >> return (False, go..
물론 하스켈 위키에 관련 페이지가 있는데 HaskellWiki: http://www.haskell.org/haskellwiki/Memoization 이해가 안 돼... 그래서 그냥 직접 따져봄 -- 재귀를 이용한 피보나치 수 구하기 fib :: Int -> Integer fib 0 = 1 fib 1 = 1 fib n = fib (n-2) + fib (n-1) 뻔하지만 똑같은 걸 여러 번 계산하는 게 문제다. fib 3 = fib 1 + fib 2 = fib 1 + (fib 0 + fib 1) fib 4 = fib 2 + fib 3 = (fib 0 + fib 1) + (fib 1 + fib 2) = (fib 0 + fib 1) + (fib 1 + fib 0 + fib 1) 명령형 언어에서는 배열을 하나 마..
문제: https://algospot.com/judge/problem/read/URI 쉬운 거 그만 풀려고 했는데 이 문제는 댓글에 하도 함정이 있느니 어쩌느니 해서 한 번 풀어봤다. main = do num_s special xs _ -> x : decode xs where special (z:y:ys) = case y of '0' -> ' ' : decode ys '1' -> '!' : decode ys '4' -> '$' : decode ys '5' -> '%' : decode ys '8' -> '(' : decode ys '9' -> ')' : decode ys 'a' -> '*' : decode ys _ -> '%' : z : y : decode ys 한 방에 통과되는데.. 뭐가 함정이라는 거지..