목록전체 글 (140)
Graphics Programming
콘솔에서 숫자를 읽을 때 귀찮은 점은 문자열로 읽어서 변환을 해줘야 한다는 것이다. 예컨대 온라인 저지의 알고리즘 문제들은 보통 입력될 문제의 개수 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 한 방에 통과되는데.. 뭐가 함정이라는 거지..
문제: https://algospot.com/judge/problem/read/HOTSUMMER 문제 수: n 목표치: goal 사용량: a1 a2 a3 a4 a5 a6 a7 a8 a9 a1 + a2 + ... + a9 >= 를 일일이 쓰며 따져볼 필요가 없으니 do 표기를 사용해서 금방 작성했다. import Control.Monad import System.IO main = do numProblems_s
문제: https://algospot.com/judge/problem/read/LECTURE 짝수 길이의 문자열을 입력받아 -> 두 개씩 자른 다음 -> 사전순 정렬해서 -> 다시 합쳐서 -> 출력하라. = getLine - pairup - sort - concat - putStrLn 앞의 두 문제(MERCY, ENDIANS)를 풀어봐서 이제 입출력에서는 걸리적거리는 게 없다. 그냥 함수 합성 연산자 (.) 를 이용해서 핵심 코드를 한 줄로 쓰는 멋을 부리고 싶었다. 근데 리스트를 두 개씩 쪼개는 라이브러리 함수를 못 찾아서 실패.. -,- 이것저것 섞으면 그런 함수를 정의할 수도 있을 것 같은데... 일단 문자열을 쪼개주는 pairup이라는 함수를 직접 정의했다. 이제 입력 문자열을 str이라고 하면 ..
페이스북에서 알게 된 사이트인데 코딩으로 게임을 플레이할 수 있다. 되게 신기함 ㅋㅋ 한 마디로 온라인 저지의 게임 버전이다. 게임은 지가 알아서 돌아가는데 예시 코드에는 콘솔 입출력이 있어서 헷갈렸는데, 주석을 읽어보니 콘솔 입출력으로 게임을 제어하는 형식이었다. 제일 첫 번째 게임인 Onboarding을 깨봤다. 게임 화면에 DEBUG MODE 버튼을 눌러보면 적들의 이름이 나온다. 네 개는 HotDroid이고 마지막 것은 Buzz인데 우리 우주선은 HotDroid만 잡고 Buzz에게 죽는다. -- 게임에서 제공하는 기본 코드 import System.IO import Control.Monad main :: IO () main = do hSetBuffering stdout NoBuffering -- ..
문제: https://algospot.com/judge/problem/read/ENDIANS 1. 정수 N을 입력받는다. 2. N개의 32비트 정수를 입력받아 반대 엔디안으로 바꿔서 출력한다. 워낙 간단한 문제니 전략을 바로 세울 수 있다. 문제 하나를 푸는 액션 solve를 정의한다. N을 입력받아서 solve를 N번 실행한다. 하스켈 코드로 그 개요를 표현하자면 다음과 같다. import Control.Monad -- replicateM_은 여러 액션을 실행하고 결과는 버린다 (액션들을 >> 연산자로 연쇄하는 것과 같은 효과) main = 입력 >>= (\ 문제수 -> replicateM_ 문제수 solve) 문제는 입력이 4 123 3166 4232 874 처럼 띄어쓰기 형태로 들어올 경우 어떻게 ..