2011-01-01から1年間の記事一覧

Control.Arrow

.hs

『プログラミングHaskell』の次に『Real World Haskell』を読みはじめた。 でも先に Control.Arrow とか Control.Applicative が何であるかを知りたい。 ありがたいことに日本語のブログが結構あるので読ませてもらって少し分かってきた。 99 questions/Solu…

Groovy の型変換

型変換についてのメモ。 プログラムの挙動がおかしいと思ったときに読み返すためのもの。 Scala の implicit conversions implicit conversions が試されるのは 要求された型への変換 変数宣言の型への変換 メソッド呼び出しの引数の型への変換 レシーバの変…

Groovy MOP

Groovy にはメタプログラミングための API が用意されている。*1 関数の自動メモ化 の中で当てはめると Spring AOP のようなことを言語内で行える。 class MemoizeInterceptor implements Interceptor { def cache = [:] def hasResult @Override Object bef…

『自然数対の整列列挙』に挑戦

お題: 2011-04-30 http://d.hatena.ne.jp/route150/20110428/1303994639 似ているのだが f が不定である。id:route150 氏から 遅延評価(主にfoldrとmerge)は相性がいい と教えてもらったのに自力で解いたらこうなった。 import Control.Monad import Data.L…

『直角三角形の面積...』に挑戦

お題:http://d.hatena.ne.jp/route150/20110428/1303994639 直角三角形の斜辺でない2辺をa、bとする。a、bは整数で「1 (追記) 但し、列挙する数は無限個とする(現実的には無理だが)。 最初に一覧にして眺めてみる。 [1, 1] [1, 2] [1, 3] [1, 4] [2, 2] [1…

Groovy on コマンドプロンプト

独学なのでプログラミングの最初の関門は環境設定だった。検索しては他の人の設定を参考にさせて頂いたので私も公開しておく。現在、Groovy 1.8 リリースされたところ。Groovy をアルゴリズムの勉強をするための動く疑似コードとして使い始めた。半年間、コ…

Catalan number その2

.hs

Haskell で 前回 の処理を実装してみた。 catalan :: Int -> [[Char]] catalan 0 = [[]] catalan n = ['N':c1++'E':c2 | i <- [0..n-1], c1 <- catalan i, c2 <- catalan (n-i-1)] path :: [Char] -> Int -> [[Char]] -> [[Char]] path [] _ (s:ss) = (take …

Catalan number

Rosetta Code の方は公式を実装するだけだったので『数のマジック』の練習問題 7.4.1 を NxN 格子上にして出力することにする。 3x3 の場合 次の線上をSからGまで北か東に移動して辿り着くすべてのパスを表示する。 パスの総数はカタラン数になる。 +--+--+-…

Hamming number その2

id:akihiro4chawon 氏のエントリの 1つ目の実装を見て Haskell の実装と同じだったので驚いた。 スクリプトで Haskell と同じように書き直してみる。 val hamming: Stream[BigInt] = BigInt(1) #:: merge(merge(hamming map {_ * 2}, hamming map {_ * 3}), …

Hamming number

Hamming numbers - Rosetta Code から 素因数分解した形が 2^i 3^j 5^k になる数をハミング数というらしい。ただし i, j, k >= 0Haskell のコードを引用する。 Haskell hamming = 1 : map (2*) hamming `merge` map (3*) hamming `merge` map (5*) hamming w…

Groovy の Deque

GroovyにおけるProject Coin相当拡張について - uehaj's blog のように Java より先に Groovy にはその機能が存在することがある。でもそれはたまに問題になる。 LinkedList と ArrayDeque はともに Deque であるがその振る舞いが違う。 Deque linkedList = …

Happy number

Happy numbers - Rosetta Code から Happy number とは次のようなものらしい。 その数の各桁の平方和が 1 になれば Happy ならない場合は再帰して調べる 各桁の平方和が 4 になると循環するので Happy ではない 例) 79 は 49+81=130 -> 1+9+0=10 -> 1 なので…

groovy.util.MapEntry

Hash from two arrays - Rosetta Code から Groovy keys = ['a','b','c'] vals = ['aaa', 'bbb', 'ccc'] hash = [:] keys.eachWithIndex { key, i -> hash[key] = vals[i] } Haskell import Data.Map makeMap ks vs = fromList $ zip ks vs mymap = makeMap …

Fibonacci number

以前、AST変換でバイトコードを直接生成して計算する方法で Pure Java より速いことが話題に上がっていた。*1 http://www.jroller.com/melix/entry/yes_fibonacci_in_groovy_can 速いぞGroovy! - uehaj's blog Pure Java より速いぞ Groovy! - 倭マン's BLOG…

Groovy で改行のエスケープ

Rosetta Code で発見したソースから def queensUniqueSolutions = { start -> assert start instanceof Number || start instanceof List def qus = (start instanceof Number) \ ? queensDistinctSolutions(start) \ : [] + start for (def i = 0; i < qus.…

Groovy でリストのかけ算

元ネタ: http://d.hatena.ne.jp/atsuoishimoto/20110409/1302347562 Groovy でも同様で*1 groovy:000> a = [[]] * 5 ===> [[], [], [], [], []] groovy:000> a.head() << 'A' ===> [A] groovy:000> a ===> [[A], [A], [A], [A], [A]] 別のインスタンスにした…

『今流行のお題を出してみた』に Groovy で挑戦

お題:はてなブログに移行しました 問題をみて「グラフが強連結であること」ってところまでは調べたんだが 強連結であることを判定するアルゴリズムはあっても強連結なグラフを作るものがみあたらない。 何回かグラフ関連のアルゴリズムをあさっていたら気が…

評価順

.hs

『Jythonプログラミング』の西尾泰和氏のエントリに似ているけど違う話。 最小限Lisp - 西尾泰和のはてなダイアリー 最小限 Haskell あるかな? 『プログラミング Haskell』 10.5 仮想マシン 関数型パーサに比べて検索に Hit しない。 プログラミングHaskell…

Groovy の in キーワード

groovy.time パッケージを調べていたら知らない in の使い方をしていた。 http://groovy.codehaus.org/JN0545-Dates System.setProperty('user.timezone', 'GMT') def c= new GregorianCalendar( 2002, Calendar.JUNE, 30 ) assert c.lenient c.set( Calenda…

List comprehension

Scala の for 式で覆面算を解いているエントリを見つけたので同じように Haskell と Groovy で解きながらリスト内包表記について考える。 リストモナドを使ってみる - みずぴー日記 リスト内包表記は Groovy にもいずれ実装されるのか? http://jira.codehau…

時間帯重複チェック(応用編)その3

お題:時間帯重複チェック(応用編) - No Programming, No Life Haskell で解答されていたのでそれを Groovy で書いてみる。 http://d.hatena.ne.jp/route150/20110401/1301661345 Control.Applicative モジュールの知識がないので読めない部分がある。 ghc…

時間帯重複チェック(応用編)その2

お題:時間帯重複チェック(応用編) - No Programming, No Life をもう一度解く。 フラグ方式には及ばないが計算量を改善した方法に辿り着いた*1。フラグ方式は bucket sort のように限定条件に気づいているので気づいていない方式では太刀打ちできない。ま…

時間帯重複チェック(応用編)

お題:時間帯重複チェック(応用編) - No Programming, No Life を解く。*1 調べてみたら 区間木 - Wikipedia というものがあるみたいだが、手頃な感じではないので Groovy で力づくな方法で解くことにする。 class Time implements Comparable<Time> { int h, m </time>…

Parser Combinator ライブラリを使ってみる

数式のところを Java のライブラリで書いてみる。*1 JParsec http://jparsec.codehaus.org/ @Grab('jparsec:jparsec:2.0') import org.codehaus.jparsec.Parser import org.codehaus.jparsec.Parser.Reference import org.codehaus.jparsec.functors.* impor…

spread の Operator Overloading

Groovy では List は * 演算子で 1つ外側の List の要素に展開できる。 groovy:000> [1,2,*[3,4,5]] ===> [1, 2, 3, 4, 5] Groovy の演算子はメソッドで定義できるが http://groovy.codehaus.org/Operator+Overloading に * は載っていない。*1 groovy:000> …

Parser Combinator

Graham Hutton 氏の『プログラミング Haskell』 第8章 関数型パーサーを Groovy で書く。 Page Redirection にコードがあるがテキストとは少し違う。 Parser で扱う補助的な関数を定義する Closure を Parser として扱うので Parser 自体は定義しない Just …

Groovy で swap

http://www.fepc.or.jp/present/jigyou/japan/ によると 0〜8 時が消費電力の少ない時間帯みたいだ。というわけで深夜プログラミング中 単純な変数の場合 Groovy には Multiple Assignment があるので単純な変数の swap は簡単に行える。 http://groovy.code…

Groovy の getAt

Groovy では演算子の多重定義によって a[b] は a.getAt(b) の呼び出しに置き換えられる。 a, b のクラスは自由なので、次のようなこともできる。 class Greeting { def text } class Say { def getAt(Greeting greeting) { println greeting.text } } new Sa…

Groovy の Range

s = "abc" assert "abc" == s[0..<s.size()] assert "abc" == s[0..-1] assert "ab" == s[0..-2] assert "a" == s[0..<-1] 最後の動作に驚いたので Groovy の Range を調査する。 Range のプロパティ class MyRange extends AbstractList /* implements Range */ { int from, to boolean reverse MyRange(int from, int to) { this.reverse = from >…</s.size()]>

シャッフルする

シャッフル関連のメモ 1年前の記事 「Microsoft が提供しているブラウザ選択でランダムであるはずの表示順序に偏りがあった」という内容だ。 MS、Webブラウザ選択画面にアルゴリズム上のバグか − @IT Doing the Microsoft Shuffle: Algorithm Fail in Brows…