Haskell

漢数字への変換

30分プログラム、その798。数字から漢数字への変換をやってみました。 1以上1億未満の数字にのみ対応してます。 使い方 *Main> kanji 10 十 *Main> kanji 42 四十二 *Main> kanji 12345 一万二千三百四十五 ソースコード import qualified System.IO.UTF8 as…

単語の削除

30分プログラム、その792。anarchy golf - delete wordsにインスパイアされました。 使い方 *Main> deleteWord "golf" "flogwaiurhgm" " waiurh m" ソースコード replace :: Eq a => a -> a -> [a] -> [a] replace _ _ [] = [] replace old new (x:xs) = if …

魔方陣を作ってみる

30分プログラム、その784。魔方陣を作ってみた。 最初はリストモナドでベタ書きしようかと思ったけど magicSquare = do a <- [1..9] b <- delete a [1..9] c <- delete b $ delete a [1..9] .... guard ... return ... みたいなひどいことになりそうだったの…

-3進数への変換

30分プログラム、その776。anarchy golf - Negatenaryにインスパイアされて、-3進数への変換をやってみました。 基数が負の変換はやったことがなかったので、わりと苦戦しました。各桁が必ず正の数になるようにするのがむずい! 使い方 *Main> negatenary (-6…

整数を英語に変換

30分プログラム、その771。anarchy golf - 100にインスパイアされて、整数を英語(one,two,three,...)に変換してみました。今日のポイントは、 alphaNum n = msum [ lookup n table, do let (x, y) = split n x' <- lookup x table y' <- lookup y table retu…

真理値表

30分プログラム、その759。真理値表を作ってみよう。 [mixi]初心者です。 - Javaの課題丸投げ | mixiコミュニティにインスパイアされました。要するに、適当な論理式を与えると真理値表を出力するプログラムです。 出力の整形は、けっこう適当です。 使い方 …

HaskellでFizzBuzz

30分プログラム、その748。HaskellでFizzBuzz。 当初の予定ではSchemeで便利なスクリプトを書く予定でしたが、諸事情により中止となりました。(手元のマシンに処理系がインストールされてなかった。) というわけで、たまたま入っていたHaskellでFizzBuzzを書…

テイラー展開によるネイピア数

30分プログラム、その743。Haskellでテイラー展開によるネイピア数を求めてみる。 mixiの課題コミュにインスパイアされています。 数値に関する型クラスがよく分からなくて、A Gentle Introduction to Haskell: Numbersを読みながらやってました。とりあえず…

文字の間にwを挟む関数

30分プログラム、その739。文字の間にwを挟む関数を書いてみました。 文字の間に文字を挟むだけなら、intersperseというずばりそのものの関数があります。が、今回は文字列を挟みたかったので自分で書きました。 あと、日本語の文字列(UTF8)を扱うためにutf8…

べき集合

30分プログラム、その730。べき集合をもとめる関数。前にべき集合を一行で求めるコードを見たことあるような気がするけど、思い出せなかったし、辿りつけなかった。ちぇー。 使い方 Prelude> powerSet [1..3] [[1,2,3],[2,3],[1,3],[3],[1,2],[2],[1],[]] ソ…

既約分数クイズ

30分プログラム、その722。既約分数クイズにチャレンジしました。 今回は力技で解きましたが、クイズと言うからにはきっとクールな解法があるんでしょう。 使い方 *Main> irreducibleFracs 4 [(0,1),(1,1),(1,2),(1,3),(2,3),(1,4),(3,4)] ソースコード type…

Insersion Sort

30分プログラム、その715。2009-11-30 - Haskellで遊ぶよ - haskellにインスパイアされました。 書いてから上記のページを見てみたんけど、http://haskell.org/ghc/docs/latest/html/libraries/base-4.2.0.0/Data-List.htmlのinsertやinsertByがあったのか。…

Data.Graphを試そう

30分プログラム、その710。Haskellでグラフを扱いたかったので、Data.Graphを試してみました。mkGraphの返すグラフの型が、具体的な型ではなく、grになっています。 *Main> :t mkGraph mkGraph :: (Graph gr) => [LNode a] -> [LEdge b] -> gr a b これはこ…

油売り算(1)

30分プログラム、その708。昔の日記をあさっていたら、http://karetta.jp/article/blog/ll-spirit/033840が解けてなかったので、再チェレンジ!が、前回挫折しただけあって、なかなか難しい。とりあえず、後で必要になるだろう型を定義しました。続きはまた今…

n+kパターンを試そう

30分プログラム、その701。プログラミングHaskellを読んでたら、Haskellにはn+kパターンってのがあるらしい。 これを使うと even (n+1) = odd n みたいにパターンの部分にn+kの形が使えるらしいです。曰く、不人気で将来のバージョンでは消えるかもしれない…

HOASによるラムダ式

30分プログラム、その691。HOASによるラムダ式。 id:keigoiさんに、HOAS(Higher order abstract syntax)なるものを教えてもらいました。 詳しいことは、http://homepages.inf.ed.ac.uk/ratkey/unembedding.pdfに書いてあるらしいです。今のところの理解は、 …

仲間はずれの判定、ふたたび

30分プログラム、その684。昔にやった仲間はずれの判定を、もう一度やってみました。 問題はhttp://ja.doukaku.org/53/を参考に、前回の回答は仲間外れの判別 - みずぴー日記を見てください。 使い方 *Main> classify [1,1,1,1,1] Same 1 *Main> classify [1…

来年まであと何日?

30分プログラム、その677。来年まであと何日かを出力するプログラム。 恐しいことに、今年も終わりが見えてきました。 そのことについて考えるといろいろと後悔の念がでてきますが、とりあえず来年まで何日あるかを出力するプログラムを書いてみましょう。 …

Writerモナドを試してみた

30分プログラム、その670。Writerモナドを試してみました。 前回がReaderモナドだったので、今回はWriterモナドを試してみました。 The Writer monadには、Writerモナドは裏でログをとったりするのに便利だと書いてあったので、関数の呼び出しを記録してみま…

Readerモナドを試してみる

30分プログラム、その663。Readerモナドを試してみました。 The Reader monadを読んでたら、環境がどうのこうの書いてあったので、簡単なプログラミング言語を作ってみました。環境が使いたかっただけなので、変数束縛と変数参照のほかには、整数リテラルと…

サイコロを100回振って、各目の出る割り合いを求める

30分プログラム、その653。サイコロを100回振って、各目の出る割り合いを求めてみる。ソーシャル・ネットワーキング サービス [mixi(ミクシィ)]にインスパイアされました。 問題2.1〜6の目が出るサイコロを100回振って、1〜6の目が出る割合を求めるプログラ…

縦書き変換

30分プログラム、その649。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_208にインスパイアされて、縦書き変換を作ってみました。でも、日本語はできません。普通に書いててもつまんないよねー、とか思って、ArrowやらHUnitやらを使ってます。ど…

だいたいの時刻を表示するコマンド

30分プログラム、その641。だいたいの時刻を表示するコマンドを作ってみました。 http://kodawari2007.blog108.fc2.com/blog-entry-533.htmlというオシャレアイテムは、時刻を"20 minutes past 22"(22時から20分が過ぎた)みたいに表示してくれるらしい。 キ…

ファイルを行数別に分類してカウントしてみる

30分プログラム、その636。ファイルを行数別に分類してカウントしてみる。 コードを書いてると、基本的に各ファイルの行数はばらばらになります。 というわけで、実際に、どれくらいばらけてるかを調べるために、行数ごとに分類してカウントするプログラムを…

一個のリストから何個もの情報をとりだすコードはどう書くのがいいんだろう

例えば、下の行数カウントプログラムは、次のように書くのが一番キレイだと思う。 -- xsが各ファイルの行数のリスト -- (<100行未満のファイルの個数>, <100行以上のファイルの個数>)を返す lineStatics :: [Int] -> (Int,Int) lineStatics xs = (length $ f…

大文字・小文字の反転

30分プログラム、その633。anarchy golf - invert caseにインスパイアされました。 単語中の大文字を小文字に、小文字を大文字にする変換。例えば、Fooを与えるとfOOが得られる。 大文字化と小文字化をいい感じに組合せたらできないだろうか、と考えてみたけ…

配列のシャッフル

30分プログラム、その629。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_014やnanigac.comにインスパイアされて配列のシャッフルにチャレンジしてみた。配列のシャッフルはリストの要素のシャッフル - みずぴー日記でもやったけど、上記のサイト…

文字列に含まれる単語の最初の文字を大文字にする

30分プログラム、その625。エロと風俗情報満載 どう抜く?をやってみよう。 要するに、"hello world"を与えたときに"Hello World"を返すプログラムを作ればいいんだよね。 ライブラリを探せばずばりそのものの関数がありそうな気がしたので、なるべくライブ…

マクローリン展開によるsin関数

30分プログラム、その622。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_188にインスパイアされて、sin関数を書いてみます。 『マクローリン展開をそのまま実装すればいいんだろ、簡単簡単』と思ってら、わりと時間がかかってしまった。Intじゃ…

HappyNumberの判定

30分プログラム、その618。C++の宿題/HappyNumber - C/C++の宿題を片付けます@wiki - アットウィキにインスパイアされてHappyNumberの判定をやってみる。 正整数a以上b以下のHappyNumberを求めるプログラムを作成せよ。 ただし、関数を使うこと。 HappyNumbe…