.groovy

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]…

Learn you a Clojure for Great Groovy!

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

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 …

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 …

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 で同じようにするにはどうすればよいか。 そもそもの問…

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

お題:ある金額になるコインの組み合わせ - 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 で 他…

型キャスト

最初に Groovy 1.8.1 がリリースされました。 前回 Grape について書いたばかりですがデフォルトでローカルの Maven リポジトリが参照されるようになりました。 Maven リポジトリを参照する設定を追加しただけならもう設定ファイルは削除してもいいです。 2…

Grape

groovysh でライブラリを参照したかったので Grape について調べた。(Groovy 1.8.0 時点) 参考 http://groovy.codehaus.org/Grape http://groovy.codehaus.org/Japanese+Grape groovy.grape.Grape.grab メソッド スクリプトで使用する @Grab の代わりに groo…

Levenshtein distance

diffの動作原理を知る〜どのようにして差分を導き出すのか を読んでからずいぶん時間を経たけれども Diff のアルゴリズムを理解できた*1。 理解するためにいろいろ検索したが Diff algorithm の解説が自分にはいちばん分かりやすかった*2。このエントリがな…

Longest common subsequence

Longest common subsequence - Rosetta Code を Groovy で実装してみる。 DP は Java 版を再帰は Haskell 版を参考にした。 Dynamic programming def lcs1(xs, ys) { int N = xs.size() int M = ys.size() int[][] dp = new int[N+1][M+1] for (i in 0..

java.lang.Double

Java の double の非数や無限大の振る舞いについてのメモ。 比較 Groovy のバグ報告で Doublle.NaN == Double.NaN は false と評価されるべきと上がっていた。 http://jira.codehaus.org/browse/GROOVY-4906 Java 言語仕様ではそうなっているらしいので確認…

Huffman coding

ハフマン符号はデータ圧縮の手法で 『プログラミングコンテストチャレンジブック』 によると貪欲法になるらしい。 出現頻度が高い文字により短い符号を割り当てるので元の文字列より圧縮できる。 エンコードの手順 文字列から頻度表を作成する 頻度表からハ…

monoid

id:akihiro4chawon 氏の 比較はモノイド を読んで新しい視点が得られた気がするので忘れないうちに書いておく。 半群とは Wikipedia から引用 演算が閉じている S の各元 a, b に対して、演算結果 a • b は再び S に属する。 結合律 S の各元 a, b, c に対し…

subsequences

Groovy Sequence of a number - Stack Overflow から def number = 169 // need a method in groovy to find the consecutive numbers that is, 1,6,9,16,69,169 // not 19! Groovy には List#subsequences があるがどうやら連続しているものだけ欲しいらし…

Text wrapping

終わってたけど 「プログラミングGroovy」のカバーに載せる短いプログラム - Togetter みて考えたもの。 「プログラミングGROOVY」と表示するプログラム。無茶な 3 行だったのできれいにした。 本当は Groovy のロゴをどこかの API でアスキーアートに変換し…

場合の数でループする

inamori 氏の ある確率 - 桃の天然水 を実装してみた*1。 8つのコップがあって、ボールをランダムに16個コップに入れる。 そのとき全てのコップに2個ずつボールが入る確率は? ボールを入れるコップでループする どのコップに入れたかで処理すると 8^16 回処…