BlockSorting を Groovy で

今年も半分が終わろうとしているが1月の TODO を解決する。 404 Blog Not Found:Algorithm - Suffix Array を JavaScript で再発明してみた Suffix Array ではなく BWT の方を。 Groovy で実装してみる 参考 http://homepage3.nifty.com/DO/blocksorting.htm…

Reverse Polish notation calculator

『すごいHaskellたのしく学ぼう!』 の 10章の逆ポーランド記法電卓を Groovy, Scala, Clojure, Scheme で書いてみる。 Reverse Polish notation calculator Groovy def solveRPN(expr) { expr.tokenize().inject([]){ acc, v -> "*" == v ? [acc[1] * acc[0]…

学習

頭の中の灰色の細胞が CPU や HDD だったとする。 知っていることが増えるのは HDD に書き込んだからということにしよう。 しかし、プログラミング能力が向上することを説明するのは難しい。 なぜなら CPU は変わっていないのだから。 考えられるのは HDD の…

Learn you a Clojure for Great Groovy!

最近話題のタイトルは、たのしく読んでいる途中(9章に入った)。 その話ではなく、このエントリは Clojure で Ninety-Nine Prolog Problems をやっているときに思いついたもの。 1. Prolog Lists - Prolog Site Ninety-Nine Prolog Problems も Lists のとこ…

関数型パーサー

もうすぐ Haskell の本が出版されるので復習する。 『プログラミング Haskell』 の第8章を今回は Scala(version 2.9.2) で書く。Scala 的に使った方がいいらしいので Option や Either も勉強する。 Scala の API と以下を参考にしながら書いてみた。 Java …

ブックマークの整理

ブックマークも無限リストのようなものなので head をつかんだまま続けていると Out of Memory になる。 なので、気分転換に整理してみた。 整理の方法 古い方から順に判断した。 最初から考えていたわけではないが、結果的に4つに別れた。 カテゴライズして…

Programming Grails

O'Reilly では Open Feedback Publishing System といって執筆中の書籍にコメントできるらしい(ただし English)。 Online Feedback Publishing System - O'Reilly Media というわけで Grails の本が出るみたい(まだ半分も書かれていない)。 Online Feedback …

最長重複文字列問題 in Groovy

WEB+DB PRESS Vol.67 の最長重複文字列問題をやってみた。 もう少し前に実装していたのだけど takeWhile 待ちしている間に目的が変わってしまった。 Clojure や Scala では既に実装されている方がおられる。 WEB+DB PRESS Vol.67の最長重複文字列問題をCloju…

最長重複文字列問題 in Scala

Clojure 編につづき Scala 編へ Scala は Haskell の多くの関数が用意されているので Haskell からの書き換えるのには有利だ。 def makePair [T](xs: Seq[Seq[T]]) = xs zip xs.tail def comlen [T](p: (Seq[T],Seq[T])) = p.zipped takeWhile(x => x._1 == …

最長重複文字列問題 in Clojure

Clojure を学ぶ Groovy と Scala は Java の文化圏から生まれたものだが、Clojure は Lisp の文化圏から Java に入ってきたものだ。 関数の呼び出しが (関数名 引数1 引数2 ...) と前置記法で書いたリストであるところは Lisp だが、他の Lisp 系言語に比べ…

なぜメモ化も重要か

1年前ぐらいに読んでよくわからなかったけど、ようやく理解できた気がしたので書いてみる。 なぜ関数プログラミングは重要か *1 John Hughes 氏の主張 プログラムをモジュール化するには関数プログラミングのスタイルで書くといいよ。 高階関数を使うと捗る …

実装時の型と評価後の型

前回の木構造と同じようにリストを表現するとどうなるのか? def tree = { [:].withDefault{ owner.call() } } def list = { h, t -> [h, { t?.call() }] } ちょっと意味が違う気がするけど気持ちの問題の範囲なので続ける。 h は先頭の要素で、t は評価する…

{ owner.call() }

Groovy では木構造が次の形で表現できるらしい。 def tree = { [:].withDefault{ owner.call() } } def users = tree() users.harold.username = 'hrldcpr' users.yates.username = 'tim' def json = new groovy.json.JsonBuilder(users).toString() assert …

Hamming numbers in SQL

SQL-99 では再帰が使えるので、それを使って Hamming numbers を出力する。 まずは、再帰クエリが使えるデータベースを調べてみる。 再帰クエリ - Wikipedia H2 Database が一番手軽に導入できるのでこれを使ってみる。 再帰クエリの書き方 H2 Dataabse のド…

Open Books

O'Reilly では Open Books といって一部の書籍がまるまる読めるらしい。 O'Reilly Open Books Project concurrency を調べて、groovy and concurrency を見ていたら Groovy の O'Reilly 本が目に入る。 そういえばドイツ語の本があったなということで調べて…

itertools in Groovy

Generator を手に入れたので、再びハミングの問題に挑戦する。 Hamming numbers - Rosetta Code 同じように実装するためには itertools が必要だ。 Python documentation に Python で書かれた仕様が載っているのでそのまま実装する。 itertools — Functions…

Named arguments

コンパイラさんに教えてもらった。 def aMethodHasNamedArguments(Map named=[:], Object... args) { println "named=$named, args=$args" } aMethodHasNamedArguments("A", key1:1, "B", key2:2, "C") // named=[key1:1, key2:2], args=[A, B, C] aMethodHa…

Generator in Groovy

同期する Generator を java.util.concurrent パッケージを使って書いてみる。 Using BlockingQueue はじめに http://groovy.codehaus.org/Iterator+Tricks のように非同期のものを BlockingQueue で書いてみる。 def generate(Closure generator) { return …

TiddlyWiki の設定

TiddlyWiki の Tips を調べていたら、設定(使用しているプラグラインとか)を公開されている方がいたので自分も公開してみる。 「TiddlyWiki」 を検索 - はてなブックマーク TiddlyWiki とは 開発者は Jeremy Ruston 氏 HTML ファイル1つでできている Wiki …

Groovy で Emulating callable objects その2

前回の Closure よりもっと簡単にできた。 というか Python と同じだった。 Python と同じ方法 org.codehaus.groovy.runtime.ScriptBytecodeAdapter より // TODO: set sender class public static Object invokeClosure(Object closure, Object[] arguments…

Groovy で Emulating callable objects

Python では object.__call__ を定義するとオブジェクトを呼び出せるそうだ。 3.4.5. Emulating callable objects Scala でも apply メソッドで同じようにオブジェクトを呼び出すことができる。 Groovy で同じようにするにはどうすればよいか。 そもそもの問…

Sorting by swap distance

ゲーム おはじきを使ったゲームをやっていた。 おはじきに 1 から 100 までの数字を書き缶に入れておく。 缶を振ってから10個とりだして並べる。 両手の指を使っておはじきを入れ替えながら数字の順に並べる。 一応競争なんだけど一斉にやったりしているわけ…

IoLanguage on コマンドプロンプト

.io

Bruce A. Tate 氏の『7つの言語 7つの世界』を読んでいる。 検索してみると結構読まれているようだ。 『404 Blog Not Found:コードについて書く方がコードを書くより読まれる現実』 があるにもかかわらず 書評ではなく、読んでコードが書かれているというこ…

Boyer-Moore algorithm

文字列照合のアルゴリズムは理解しても結果は java.lang.String#indexOf と変わらない。 ただ String#indexOf が O(NM) であるのに対して O(N) で処理できる*1。 Boyer-Moore algorithm (BM法) は KMP 法や Z algorithm と同じく O(N) だが平均比較回数は優…

Z algorithm

理解できると楽しいけど難しくて理解できないことも多い。 理解の種類で分類すると次のようになる。 概要を理解している (API が使える) 仕組みを理解している (実装できる) 様々な問題でそれを適切に使える 大抵 1 はまあ何とかなるし、それさえ分かってい…

Knuth-Morris-Pratt algorithm

WEB-DB PRESS Vol.66 に文字列検索のアルゴリズムが載っていたので、検索していたら気づいたこと 今まで Boyer-Moore だと思っていたものは Boyer-Moore-Horspool だった KMP 法のプログラムはシンプルなのに読めない KMP 法については日本語で書かれたわか…

『ある金額になるコインの組み合わせ』 に挑戦

お題:ある金額になるコインの組み合わせ - No Programming, No Life Javaで「ある金額になるコインの組み合わせ」 - terazzoの日記 を Groovy に翻訳しようといろいろ調べていたら Tree iterator が簡単そうだったので実装してみた*1。 参考 General design…

『FizzBuzz(Nパターン)』 に挑戦

お題:FizzBuzz(Nパターン) - No Programming, No Life fizz buzz without trial division · GitHub を Groovy に翻訳してみた。 @Grab(group='com.google.guava', module='guava', version='r09') import com.google.common.base.Function import static co…

『サマーインターン2011問題』 に挑戦

サマーインターン2011問題 | Preferred Research 思いついた方法が 解かれてブックマークされている方 と違ったので。半分より多く現れるなら文字のバイト位置をカウントして半分より大きいバイト位置だけ拾った文字を出力すればよいのではないかと思った。 …

0〜1000に含まれる0をカウントする

0〜1000に含まれる0をカウントする という問題。 参考 練習 - krystal: プログラミング超初心者(文系) - Rubyist - オリジナル 0〜1000に含まれる0をカウントする - http://rubikitch.com/に移転しました - Ruby で '0' in 0~1000 - ellaneous - golf で 他…