Haskell

suffix array ってのは

こないだのを参考にしてくれたらしい。 cf. 「Webサーチエンジン」の講義課題を1-4までやってみた - keqhの日記 なんだか俺のコードよりもHaskellらしく見えるよ。ところで,リンク先のコードだと検索するたびに suffix array というか suffix のリストを作…

簡単なWebサーチエンジンの作り方を試す

気がつけば12月も中旬だよ……。少し前になるけど,「あとで試す」タグをつけといたやつをやってみる。これ↓: cf. 簡単なWebサーチエンジンの作り方 - 加藤 和彦のブログ 具体的な手順はこっちのページで公開されている。 cf. http://www.osss.cs.tsukuba.ac.…

急勾配の判定

id:edvakfさんがやってるのを見かけたので久しぶりに。 cf. 急勾配の判定 - どう書く?org cf. 急勾配の判定 - Haskellで遊ぶよ どう書く?org にはこれをポストしたんだけど: import List steep xs = and $ zipWith (>) xs $ map sum $ tail $ tails xs $ …

-1 を 10 で割ったあまりは?

どう書く?org のこのお題,はじめはHaskellで書いた。 modular n l h = l + n `mod` (h - l + 1) すでに投稿があったのでOCamlで書き直したんだけど,そのまま移植したんではうまくいかない。 # let modular n l h = l + n mod (h - l + 1);; val modular :…

Problem 31

今日は Problem 31。cf. Project Euler - Problem 31 cf. Life Goes On - 31問目id:rst76さんのをちょっと改良して1pのコインがない場合にも対応できるようにしてみた。問題の解答には必要ないんだけど。 module Main (main) where euler031 :: [Int] -> I…

Problem 14

今日は Problem 14。cf. Project Euler - Problem 14コラッツ問題の数列を求めるのは以前にやったのを流用。あとは力任せに… module Main (main) where collatz :: Int -> [Int] collatz 1 = 1 : [] collatz n | n `mod` 2 == 0 = n : collatz (n `div` 2) |…

Problem 8

今日は Problem 8。cf. Project Euler - Problem 8 module Main (main) where import Data.List import Data.Char euler008 :: [Char] -> Int euler008 n = maximum $ map euler008' $ nums n where nums = filter (\x -> length x > 4) . map (take 5) . ta…

Problem 13

今日は Problem 13 をやってみた。これは簡単。cf. Project Euler - Problem 13 nums :: [Integer] nums = [37107287533902102798797998220837590246510135740250, 46376937677490009712648124896970078050417018260538, 7432498619952474105947423330951305…

Problem 12

今日は Problem 12をやってみた。cf. Project Euler - Problem 12 via 自堕落系徒然日記 - Problem 12 三角数の約数 import Data.List triangleNumbers :: [Integer] triangleNumbers = snd $ mapAccumL (\a x -> (a+x, a)) 1 [2..] divisors :: Integer -> …

unfold

なるほど,unfold ってこういうふうに使えるのか。cf. ZOETROPEの日記 - Foundations of F#を読む(3)Haskellでやってみる。 *Main> take 10 $ Data.List.unfoldr (\(n0,n1) -> Just (n0, (n1, n0+n1))) (1, 1) [1,1,2,3,5,8,13,21,34,55] unfoldr に与える関…

Probrem 21

今日は Probrem 21 をやってみた。cf. http://projecteuler.net/index.php?section=problems&id=21数 n に対して約数(nを含まない)すべてを足しあわせる関数 d があるとして,d(a) = b かつ d(b) = a となるような a と b (ただしa≠b)を amicable pair,…

Project Euler

ってのがあるのか。cf. http://projecteuler.net/index.php via Life Goes On - はじめました気が向いたときにはやってみるかな。 とりあえず Problem 1 を内包表記で。 euler0001 :: Int -> Int euler0001 n = sum [x | x <- [1..(n-1)], or [x `mod` 3 == …

コラッツ予想

cf. Way of My Life - コラッツ予想Haskell と OCaml でやってみた。 与えられた数から1になるまでをリストで返す。 collatz :: Int -> [Int] collatz 1 = 1 : [] collatz n | n `mod` 2 == 0 = n : collatz (n `div` 2) | otherwise = n : collatz (n * 3 +…

データの整列(Haskell版)

同じことをHaskellで。Ordクラスのインスタンスにしたら sortByDic はただの sort ですんだ。 import List data Point = Pt Float Float deriving (Show, Eq, Ord) distance :: Point -> Float distance (Pt x y) = sqrt (x * x + y * y) sortByDic :: [Poin…

ダブル完全数

cf. どう書く?.org - ダブル完全数HaskellのほうがRubyよりすっきりしてるな。 divisors n = filter ((==0).mod n) [1..(n `div` 2 + 1)] isDoublePerfectNumber n = (sum.divisors) n == (n*2) main = mapM_ (putStrLn.show) $ filter isDoublePerfectNumb…

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

cf. どう書く?.org - アルファベットの繰り上がりsucc でいいじゃん,と思ったらダメだった。 Prelude> succ 'A' 'B' Prelude> succ 'Z' '['Ruby の String#succ はうまくやってくれるのに。 なら,26進数だと考えて素直に繰り上がりを処理すればいいか……と…

倍数になる13進数

cf. どう書く?.org - 倍数になる13進数 module Main (main) where fromDecimal :: (Integral a) => a -> a -> a fromDecimal n x = f 0 x 1 where f r 0 _ = r f r y z = f (r + (y `mod` 10) * z) (y `div` 10) (z * n) main :: IO () main = putStr $ sho…

アレイのuniq

cf. どう書く?.org - アレイのuniq再帰で uniq [] = [] uniq (x:xs) = x:uniq (filter (/=x) xs) と書いてから,こんな関数ありそうだなぁと思ったらやっぱりあった。 Data.List nub 高階関数版: uniq2 :: (Eq a) => [a] -> [a] uniq2 = foldl (\a e -> if…

条件を満たす行を取り除く

条件を満たす行を取り除く via http://d.hatena.ne.jp/gan2/20070706/1183708048'#'で始まる行を取り除く問題。すげーひさしぶりに Haskell で書いてみる。 module Main where import System f :: String -> Bool f (h:tl) | h == '#' = False | otherwise =…

ピラミッドを作る

どう書く?org - ピラミッドを作る与えられた高さのピラミッドを作る module Main where import System cjust :: Int -> String -> String cjust w s | w <= length s = s | otherwise = margin ++ s ++ margin where margin = replicate ((w - (length s)) …

FizzBuzz問題

cf. どうしてプログラマに・・・プログラムが書けないのか? via 404 Blog Not Found - ブクマゴルフってどうよ? なんか昨日からあちこちで見かけるので書いてみた。久しぶりの Haslellで。 あと,増田で剰余は使うな,と言ってるから使わない。 fizz = cycle…

文字列を空白で区切る

テキストファイルから入力を受け付ける時にはよく使う。あとはカンマ区切りなんかも。 import Data.Char splitBy :: (a -> Bool) -> [a] -> [[a]] splitBy p [] = [] splitBy p xs = a : (splitBy p $ dropWhile p $ b) where (a, b) = break p xs splitBySp…

リストによる正方行列(つづき)

cf. 今日の一行 - リストによる正方行列処理週をまたいでしまった。解答例もでてるけど。 問題3。これも内包表記で。 boxing :: [[a]] -> [[a]] boxing m = [[m!!x!!y| x <- [0..l1], y <- [0..l1], x`div`l2 == i, y`div`l2 == j] | i <- [0..l3], j < - […

パターンの回転

パソコン甲子園というのを見つけた。 プログラミング部門の問題が公開されてるので(↓)ちょっとやってみよう。 http://www.pref.fukushima.jp/pc-concours/common/2006honsen.pdf正方行列つながりってことで問題01。 8文字×8行のパターンを右回りに90度、18…

内包表記

こういうのもできるのか。 Prelude> [x| x <- [0..3], y <- [0..3]] [0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3] Prelude> [y| x <- [0..3], y <- [0..3]] [0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]

リストによる正方行列

cf. 今日の一行 - リストによる正方行列処理問題1。 matrix n = [[x+(n^2*y)| x <- [1..n^2]] | y <- [0..n^2-1]] *Main> matrix 2 [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] *Main> matrix 3 [[1,2,3,4,5,6,7,8,9],[10,11,12,13,14,15,16,17,18],…

ファイル入力か標準入力

引数が与えられたらそれをファイル名と見なしてファイルを読み込み,与えられなければ標準入力から読み込む。いわゆるフィルタとしても働くプログラム。こんな感じでいいか? module Main (main) where import System main :: IO () main = do args <- getAr…

loop の列挙

cf. 今日の一行 - loopの列挙 trail はすでにたどったノードのリスト p と次にたどるノードの候補 q を受け取って,全ての経路を列挙する。「次のノード」がスタートと同じならそこでそのループは終わり。違うなら再帰的にノードをたどる。 各ノードは比較さ…

文字列の中央詰めを length を使わずに短く書けるだろうか?

via 毎日Haskell - 2006-12-28 文字列の左詰、右詰 cf. desumasuの日記 - Rubyの文字列操作関数をHaskellで定義する length を使わずに書けたけど,短いとは言い難い。 ljust(左詰)と rjust(右詰)が定義されてるとして center :: Int -> String -> Strin…

ISBN規格改訂

1月1日からISBN(国際標準図書番号)が変わったという話題。via ぷわぷわのあかしろ - ISBN cf. 日本図書コード管理センター - ISBN規格改訂のお知らせそういえば昨日買った本のISBNは13桁だった。 そうか,チェックデジットの計算方法も変わってるのか。 で…