Haskell

readを作ってみよう

30分プログラム、その419。そういえばshowは結構書いたことあるけど、readは書いたことがなかったことに気がついたので書いてみた。 正直、良くわからなん。どうも中置演算子の優先順位を考慮してreadを書かないといけないっぽいんだけど・・・。まあ、deriv…

Haskellでマーシャリング(showとread)

30分プログラム、その413。Haskellでマーシャリングにチャレンジしようとして、showとreadで十分なことに気がついた。 でも、せっかくなので途中の状態を保存して、中断可能な関数を書いてみた。たぶん、id:Gemmaさんあたりに継続使おうぜ、とか言われるんだ…

Haskellでグラフ描画

30分プログラム、その406。Data.Graph.Inductive.Graphvizというおもしろそうなライブラリを見つけたので使ってみる。 要するにノードとエッジで構成された、いわゆるグラフ理論のほうのグラフを扱うためのライブラリらしい。ノードとエッジでグラフを作るの…

FunDepでCollectionクラス

30分プログラム、その400。この前のocaml-nagoyaでid:syd_sydさんがFunDepの話をしていた。細かい話はついていけなかった。でも、例としてでてきたCollクラスがなかなか便利そうだった。 class Coll a b where empty :: b insert :: a -> b -> b instance Co…

モナドを理解するには

各個撃破しかないと思う。 圏論のモナドの話を聞いてもよく分からないし、理解したからといってHaskellプログラムがすらすら書けるようになる気がしない。 ボクには「モナドとは何ぞや」は荷が重すぎる。「Stateモナドとは何ぞや」ぐらいがちょうどいい。

Stateモナドを手で展開してみる

30分プログラム、その392。Stateモナドを理解するために手で展開してみた。 展開してみた感想は、確かにStateモナドが状態を持てる理由は分かった気がする。でも、これをモナドに押し込めた人は天才だと思う。 do 記法 とりあえず、普通に書いてみた。 impor…

Haskellでgrep

30分プログラム、その386。Haskellでgrepを作ってみた。最初、grep関数はこんな感じに書いてた。 grep r lines = let regex = mkRegex r in filter (containRegex regex) lines で、いちど動いたあとに、どんどん引数を消していったら以下のようになった。 g…

HaskellでPerlの<>

30分プログラム、その379。HaskellでPerlの<>(ダイヤモンド演算子)っぽいやつを実現してみる。 Perlの<>は、実にうまくできた演算子で コマンドライン引数が空なら、標準入力 コマンドライン引数が一つなら、それを開いたファイルハンドラ コマンドライン引…

STMを試してみる

30分プログラム、その370。ビューティフルコード (THEORY/IN/PRACTICE)に載ってたSTMを試してみる。 複数のスレッドで、ひとつのカウンターをインクリメントしつづけるプログラムを書いてみた。 インクリメントしたあとに値を表示しているけれど、なぜか飛び…

簡易HTTP Server

30分プログラム、その362。http://www.haskell.org/ghc/docs/latest/html/libraries/network/Network-Socket.htmlを使って、簡易HTTPサーバを書いてみた。 これだけ、IO aが多いとHaskell使ってる意味がほとんどない気がするけどね。 使い方 *Main> httpServ…

Network.Socketを試す

30分プログラム、その356。Unix/Linuxプログラミング理論と実践を読んでたら、じかにソケットを触りたくなったので、試してみた。 gethostbynameを呼ぶ方法が分からなかったので、getAddrInfoでごまかしてみた。 使い方 $ get example.com / <HTML> <HEAD> <TITLE>Example Web P</title></head></html>…

Problem 58 - Project Euler

30分プログラム、その336。Problem 58 - Project Euler。 1から初めて, 以下のように反時計回りに数字を並べていくと, 辺の長さが7の渦巻きが形成される. 37 36 35 34 33 32 31 38 17 16 15 14 13 30 39 18 5 4 3 12 29 40 19 6 1 2 11 28 41 20 7 8 9 10 27…

Problem55 - ProjectEuler

30分プログラム、その332。Problem55 - Project Euler。 47とその反転を足し合わせると, 47 + 74 = 121となり, 回文数になる. 全ての数が素早く回文数になるわけではない. 349を考えよう, 349 + 943 = 1292, 1292 + 2921 = 4213 4213 + 3124 = 7337 349は, 3…

Probelm51

30分プログラム、その327。Problem51 - Project Euler。 ちょっと方針を変えて、適当な素数を1つ選んで、それを置き換えて素数かどうか確認する方法にしてみた。とりあえず、計算は進んでるみたいだけれども、まだ答えはでてない。追記: 2時間ほどかけて、答…

Problem51 - Project Euler

30分プログラム、その326。Problem51 - Project Euler。 *57の第1桁を置き換えることで, 157, 257, 457, 557, 757, 857という6つの素数が得られる. 56**3の第3桁と第4桁を同じ数で置き換ることを考えよう. この5桁の数は7つの素数をもつ最初の例である: 5600…

Problem44が解けた?

30分プログラム、その318。Problem44 - Project Eulerが解けた、のか? id:banjunのコードをリライトしただけがしないでもない。 方針としては、適当なxとjを選ぶ(x

Problem44 - Haskellで無理矢理

30分プログラム、その317。Problem44 - Project EulerをHaskellで無理矢理解こうとして失敗した。まあ、無理だとは思ってたけどね。使った方針は、次のようなもの。 適当なPxを決める Px = Pi + Pjとなるiとjを全て求める。ただしi > j Pi - Pjが五角数のも…

Problem40

30分プログラム、その313。Problem40 - Project Euler。 正の整数を順に連結して得られる以下の10進の無理数を考える: 0.123456789101112131415161718192021...小数点第12位は1である. dnで小数点第n位の数を表す. d1 × d10 × d100 × d1000 × d10000 × d1000…

Problem36

30分プログラム、その309。Problem36 - Project Euler。 585 = 10010010012 (2進) は10進でも2進でも回文数である. 100万未満で10進でも2進でも回文数になるような数の総和を求めよ. (注: 先頭に0を含めて回文にすることは許されない.) 0が条件を満すかどう…

Problem32

30分プログラム、その305。Project Euler - Problem32。 7254は面白い性質を持っている. 39 × 186 = 7254と書け, 掛けられる数/掛ける数/積に1から9の数が1回ずつ出現する. 掛けられる数/掛ける数/積に1から9の数が1回ずつ出現するような積の総和を求めよ. H…

Problem28

30分プログラム、その301。Problem28 via Project Euler。 1から初めて右方向に進み時計回りに数字を増やしていき, 5×5の螺旋が以下のように生成される: 21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13 両対角線上の数字の合計は101で…

Problem21 -友愛数の和-

30分プログラム、その287。Problem21 via Project Euler。 d(n)をnの真の約数の和と定義する。(真の約数とはn以外の約数のことである。) もし、d(a) = b かつ d(b) = a を満たすとき、aとbは友愛数(親和数)であるという。 例えば、220の約数は1, 2, 4, 5…

兄弟の論理クイズ

30分プログラム、その231。兄弟の論理クイズをリストモナドで解いてみる。 5人兄弟が年長順に並んXいます。 それぞれの背中にはOかXのマークが書かれています。自分の背中のマークは見えませんが、自分より前の兄弟の背中は見えます。 1〜5がそれぞれ上から…

テトリスっぽい何か

30分プログラム、その230。HaskellのFALでテトリスを作ろうとした。 Macだとうまいことイベントがとれなくて、操作ができなかったので途中で飽きらめた。一応、ブロックが落ちてきて積み上げるとこまではできている。 ソースコード import Fal import Shape …

Smart*CSSっぽい何か

http://howdyworld.org/yacss/index.htmlで最新版を配布しています。30分+プログラム、177。Smart*CSSっぽいやつ。Smart*CSSは以下のように記述したCSSを動的に変換するPHPスクリプト。 div.entry{ div.title{ ... } div.section{ ... } } これとほとんど同…

ソフィー・ジェルマン素数

30分プログラム、その166。CATVで見たプルーフ・オブ・マイ・ライフ [DVD]に登場したソフィー・ジェルマン素数を計算するプログラム。ソフィー・ジェルマン素数は、2p+1が素数であるようなpのこと。例えば、2*2+1=5で2と5も素数なので、2はソフィー・ジェル…

7は孤独な数字

30分プログラム、その162。曰く7は孤独な数字。 理由は、 「1から10の数字を二組に分けて、両方ともグループの数字の積が一緒になる組み合わせはあるか?」という、某作家さんの本に書いてあったエピソードがなぜか忘れられないんです。 ちなみに、答えは「…

ソートをいろいろ

30分プログラム、その157。インサーションソートのアルゴリズムを確認したくなったので、さくっと作ってみる。ただ、インサーションソートだけだと寂しかったので、マージソートをクイックソートをば。 使い方 *Main> isort [42,1,5,9] [1,5,9,42] *Main> ms…

与えられた文字列で作るピラミッド

30分プログラム、その155。与えられた文字列で作るピラミッド。 「ピラミッドを作る」の続編です。 与えられた文字列を使って下の例のようなピラミッドを書いてください。 頂点は与えられた文字列の最後の一文字、 底辺は与えられた文字列の各文字の間に空白…

隣り合う二項の差

30分プログラム、その145。隣り合う二項の差。ちょっと指が痛いので、簡単に。 使い方 *Main> diff [3,1,4,1,5,9,2,6,5] [-2,3,-3,4,4,-7,4,-1] ソースコード diff :: Num a=>[a]->[a] diff [] = [] diff [_] = [] diff (x:xs@(y:_)) = (y-x):diff xs 参考 …