Haskell

与えられた数字のケタ数

http://ja.doukaku.org/40/より。ふつうです。Integerを使ってIntの制限を越えられるようにしてみました。こういう場合は、Data.ListモジュールのgenericXXX関数を使います。 module Main (main) where import Data.List (genericLength) keta :: Integer ->…

下降階乗羃と「組合せ型の最小完全ハッシュ関数」の逆関数

ふつうに組合せnCkをHaskellで書くとこうなります。数式は、n! / (k!・(n - k)!)です。 fact :: Int -> Int fact n = product [1 .. n] comb :: Int -> Int -> Int comb n k = fact n `div` (fact k * fact (n - k)) これを下降階乗羃(falling factorial)を…

平均律の周波数計算ツール

音階と周波数の対応表のJavaScriptのコードをHaskellに移植してみました。基準周波数は、A=440Hzです。 module Main (main) where import Control.Monad (zipWithM_) import System (getArgs) import Text.Printf (printf) notes :: [String] notes = cycle …

RFC 4180対応版 CSVレコードの分解

エロと風俗情報満載 どう抜く?より。Persecの練習のため、このプログラムを写経しました。写経というにはずい分変わってしまったように思いますが。 module Main (main) where import Text.ParserCombinators.Parsec (Parser, parse, char, string, many, t…

関数型言語に適したデータ構造とアルゴリズム

今後のステップアップのためには勉強すべきでしょうか。欲しくなってきました。Algorithms: A Functional Programming Approach (International Computer Science Series)作者: Fethi A. Rabhi,Guy Lapalme出版社/メーカー: Addison-Wesley発売日: 1999/06/0…

Tiny MML

http://ja.doukaku.org/31/より。Windows限定。Haskellもやればできる子です。 module Main (main) where import Control.Concurrent (threadDelay) import System.Win32 (UINT, BOOL) foreign import stdcall unsafe "Beep" cBeep :: UINT -> UINT -> IO BO…

マップの通り抜け

http://ja.doukaku.org/30/nested/より。このRubyのプログラムをHaskellに移植してみました。 配列はとりあえずData.Arrayを使ってみました。HaskellのData.Arrayは、(Int, Int)もインデックスに使えます。二次元配列ぽく使えて便利。副作用がない代わりに全…

Haskellで充足可能性問題

ライブドアブログ(livedoor Blog)| 読みたいブログが見つかるより。リンク先のコメントにもありますが、sequenceを使うとこんな感じでしょうか? module Main (main) where sat :: Int -> ([Bool] -> Bool) -> [[Bool]] sat n f = [xs | xs <- sequence $…

n日後を返す関数を返す関数

http://ja.doukaku.org/29/より。カリー化そのものです。 module Main (main) where import System.Time nDaysLater :: Int -> ClockTime -> ClockTime nDaysLater n = addToClockTime noTimeDiff { tdDay = n } main :: IO () main = do let fiveDaysLater …

リストを逆順に表示

http://ja.doukaku.org/27/より。GHCのソースを見ると実装がふたつあります。 USE_REPORT_PRELUDEの場合。 reverse :: [a] -> [a] reverse = foldl (flip (:)) []なしの場合。 reverse :: [a] -> [a] reverse l = rev l [] where rev [] a = a rev (x:xs) a …

議席数をドント方式で

http://ja.doukaku.org/26/より。ふつう。 module Main (main) where import Data.List (sortBy, sort, group) dhondt :: Int -> [Integer] -> [Int] dhondt n = count . take n . deq . zipWith prepare [0 ..] where prepare :: Int -> Integer -> [(Doubl…

h-index

h-index - odz bufferより。ちょっと出遅れた感はあるのですが、折角書いたので。。。 uncurryを使って、一行にしてみました。よけい読み難くなった気がします。 import List (sort) hindex :: [Int] -> Int hindex = length . takeWhile (uncurry (<=)) . z…

税込み価格への修正

http://ja.doukaku.org/6/lang/haskell/より。Parsec使ってみました。Persec使った方が拡張性がいい。と思いたいです。 module Main (main) where import Text.ParserCombinators.Parsec text :: Parser [String] text = many $ price <|> other price :: Pa…

ダブル完全数

http://ja.doukaku.org/25/より。Pythonのコードを移植しただけ。 module Main (main) where sumMeasure :: Int -> Int sumMeasure n = sum [x | x <- [1 .. n - 1], n `mod` x == 0] main :: IO () main = mapM_ putStrLn [show n | n <- [1 .. 10000], sum…

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

エロと風俗情報満載 どう抜く?より。リストモナド。カンマを間に挟んで出力するのはfoldl1が便利かも。1がポイント。 module Main (main) where columnNumbers :: [String] columnNumbers = map f [c1 : c2 : [] | c1 <- ' ' : ['A' .. 'Z'], c2 <- ['A' ..…

/*コメント*/を取り除く

http://ja.doukaku.org/17/より。いたってふつう。 module Main (main) where removeComment :: String -> String removeComment [] = [] removeComment ('/' : '*' : xs) = inComment xs removeComment (x : xs) = x : removeComment xs inComment :: Strin…

RubyとHaskellでランレングス法

ライブドアブログ(livedoor Blog)| 読みたいブログが見つかるより。 HaskellはData.Listにgroupって関数があるので、これを使うと簡単に書けます。こんな感じ。 module Main (main) where import Data.Char (digitToInt) import Data.List (group) runlen…

アレイのuniq

エロと風俗情報満載 どう抜く?ってHaskellだったらnubだなぁと思って、GHCのソースを見てみるとふたつ実装がありました。 まずひとつ目。USE_REPORT_PRELUDEが定義されているときはこちらを使っているみたいです。 nub :: (Eq a) => [a] -> [a] nub = nubBy…

ICPC: Problem C: Numeral System

Problem C: Numeral Systemより。ふつうに実装。StringがCharのリストだと楽です。エラーチェックはしていません。変な入力を与えると落ちます。 module Main (main) where import Data.Char (isDigit, digitToInt) import Text.Printf (printf) toMCXI :: I…

ICPC: Problem A Keitai Message

Problem A: Keitai Messageより。Stateモナドを使って、こんな感じかな。今ひとつ美しさにかける気がします。 module Main (main) where import Control.Monad.State (State, execState, get, put) import Data.List (group, (!!)) key :: (Char, Int) -> St…

Haskell勉強会#5に行ってきました

参加者の皆さん、お疲れ様でした。ガラムの旬の野菜カレー、野菜たっぷりでおいしゅうございました。 さて今日の演習の課題。標準入力から読み込んで、各行を60文字ずつ改行して、標準出力に出力するプログラムです。interact便利です。 module Main (main) …

Hello, world!その2

エロと風俗情報満載 どう抜く?より。 うーん、ダメです。Haskellで解けません。Rubyだったらアルファベット(+ 空白)を一文字も使わずに解けるのに… $><<"\110\145\154\154\157\54\40\167\157\162\154\144\41\41" # => Hello, world!!

倍数になる13進数

エロと風俗情報満載 どう抜く?より。いたってふつう。 module Main (main) where to13 :: Int -> Int to13 = sum . zipWith (*) (map (13 ^) [0 ..]) . tons where tons 0 = [] tons n = let (a, b) = n `divMod` 10 in b : tons a main :: IO () main = pr…

ピラミッドを作る

http://ja.doukaku.org/8/より。 Haskellの場合。 module Main (main) where pyramid :: Int -> [String] pyramid n = [(replicate (n - i) ' ' ++ replicate (i * 2 - 1) '*') | i <- [1 .. n]] main :: IO () main = putStr $ unlines $ pyramid 4 -- => *…

リストモナドで

id:rubyco:20070704:mulを見て、「これはリストモナドだ〜」と思いました。こんな感じ。 module Main (main) where main :: IO () main = mapM_ putStrLn f where f :: [String] f = do c1 <- ['-', '=', '+'] c2 <- ['-', '=', '+'] c3 <- ['-', '=', '+'] …

Cohi(こひ)とは?

びわこ開発合宿で開発したライブラリです。プレゼン資料へのリンクだけじゃアピールが足りないかなと思って、ブログに直してみました。 これって何? Rubyで関数型プログラミングをサポートするライブラリです。 Haskellの影響を多分に受けています。 Haskel…

整数を2進数の文字列に変換する

びわこ開発合宿に間に合わなかったので今さらな気もしますが、ようやくHIGHER-ORDER PERLが到着しました。第1章に整数を2進数の文字列に変換する関数が載っていたので、それをHaskellに直してみました。 module Main (main) where binary :: Int -> String b…

Cohi(こひ)-0.0.1をリリースしました

Rubyで関数型プログラミングをするライブラリです。いつものgemの手順でインストールできます。exampleディレクトリに階乗とフィボナッチ数のサンプルを入れておきましたので興味のある人はぜひ。 $ gem install cohiなおこのライブラリはびわこ開発合宿の開…

びわこ開発合宿に参加しています

びわこのほとり。最寄りの民家まで数百メートルというところです。隔離されています。これは最寄駅から歩いていけないな。しかしたまには田舎もいいものです。ハックにつかれて琵琶湖を散歩したり。ウシガエルの声を聞いたり。 僕のテーマは、「関数型言語Ru…

ホントにパングラム?

パングラムとはアルファベットを使った言葉遊びで、すべての文字(26個のアルファベット全部)を使って文章を作るのが目的です。有名なのは"The quick brown fox jumps over the lazy dog"で、タイプライターのテストに使われているらしいです。 ちょっとした…