Haskell

ある金額になるコインの組み合わせ

ref:http://d.hatena.ne.jp/fumokmm/20110813/1313196903 こんなんかな。 coinCombinations :: Int -> [Int] -> [[Int]] coinCombinations total coins | total == 0 = [[]] | null coins = [] | total < first = firstUnusedList | otherwise = firstUsedLi…

文字列を先頭から見て同じところまで除去

ref:http://d.hatena.ne.jp/fumokmm/20110812/1313138407 via:http://www.kt.rim.or.jp/~kbk/zakkicho/11/zakkicho1108b.html#D20110812-4 ふむ。Haskell だとどうなるか。 素直に書くとこうかな。 sameAll :: Eq a => [a] -> Bool sameAll (x:xs) = all (x=…

strToInt

ref:HaskellでString型からInt型へ変換する関数 - 未定 それ、read でいいんでないの?

イテレータ

ref:Life is beautiful: 教えながら学ぶRuby:イテレータに片思い これくらいで、イテレータが云々とか言っているのはなんだかなぁ、とか思ったりしないでもない。なので、あえて Ruby 以外で。 Haskell で。 hello :: String -> [String] -> IO () hello to…

h-index #2

「わかりやすいコードではないなぁ」と言われたけど、さてどうしたものか。 命名をがんばる。 hindex :: [Int] -> Int hindex lst = length $ takeWhile cond rankedList where rankedList = zip (sortBy (flip compare) lst) [1..] cond (val, rank) = val …

h-index

ref:h-index を Ruby で書いてみた - まちゅダイアリー (2007-07-19) 他の言語で書いてみても面白いかも。Haskellとかね。 こういうの? import List import Test.HUnit hindex :: [Int] -> Int hindex lst = length $ takeWhile cond (zip sorted [1..]) wh…

アルファベットの繰り上がり #2

ref:アルファベットの繰り上がり Enum クラスのデータを定義するというネタで。これで任意区間を簡単に取得できる。 import Char alpha_succ :: String -> String alpha_succ [] = "A" alpha_succ ('Z':cs) = 'A' : alpha_succ cs alpha_succ (c:cs) = succ …

Haskell で小町算

まぁ、なんか自力で parse してみた。副作用無しで parse するのはこんな感じでいいのかなぁ。 import Char isNumber :: String -> Bool isNumber = all isDigit tokenize :: String -> [String] tokenize [] = [] tokenize (c:cs) | isSpace c = tokenize c…

アルファベットの繰り上がり

ref:アルファベットの繰り上がり import Char next :: String -> String next [] = "A" next ('Z':cs) = 'A' : next cs next (c:cs) = succ c : cs main :: IO () main = mapM_ (putStrLn . reverse) $ take 100 $ iterate next "A" 普通に基数変換かと思い…

ピラミッド

ref:ピラミッドを作る ひきつづき HUnit の練習。TDD、TDD。 import Test.HUnit nrepeat :: Int -> b -> [b] nrepeat n c = take n (repeat c) pyramid :: Int -> String pyramid n = pyramid' 1 (n - 1) where pyramid' _ s | s < 0 = [] pyramid' i s = nr…

コメントの削除

ref:/*コメント*/を取り除く どう書く?org こう、Haskell の練習というか HUnit の使い方確認というか。 import Test.HUnit removeComment :: String -> String removeComment = outOfComment where outOfComment ('/':'*':cs) = inComment cs outOfComment…

型推論の不思議

標準入力の各行にある数の合計を求めるプログラムを書いた。 main = do cs <- getContents print . sum . map read $ lines cs 以前はread関数を知らなかったので、ord関数とリスト操作を頑張ってやっていた。 readってすばらしい。けど、実数は読めないみた…

3n+1

ref:みずぴー日記 - 3n+1問題 via:Unknown::Programming - 3n+1問題 Haskell でやってみた。 f :: Int -> [Int] f n | n == 1 = [1] | n `mod` 2 == 0 = n : f (n `div` 2) | otherwise = n : f (3 * n + 1) max_seq :: Int -> Int -> Int max_seq n m = fol…

foldl/foldr

Haskellのfold(l|r)は、なぜfoldx binop [...]ではなくfoldx binop init [...]という具合に初期値を必要とするのか、その理由を述べよ。 さて、なんでだろう。リストの要素の型が T だとして、foldx binop [...] だと binop が T -> T -> T で、結果も T じ…

Haskell で FizzBuzz

ref:http://www.kt.rim.or.jp/~kbk/zakkicho/07/zakkicho0705.html#D20070510-2 自分ならこう書く。 main = mapM_ (putStrLn.toWord) [1..100] toWord a | mod a 5 == 0 && mod a 3 == 0 = "FizzBuzz" | mod a 3 == 0 = "Fizz" | mod a 5 == 0 = "Buzz" | ot…