.groovy

trampoline

Windows update を実行したらパソコンが壊れてしまった。 パソコンが壊れたことは過去に 3 回あるがいずれも Windows update 中と直後。 今回はグラフィックボードが壊れただけ*1で助かったので続きを。 前回調べたのは TCO を実装するためで、何故実装した…

metaClass

以前 uehaj 氏が指摘されたエントリ ExpandoMetaClass.enableGlobally()について一言いっておくか - uehaj's blog ExpandoMetaClass.enableGlobally() で metaClass が変化するのは同じだけど振る舞いは変わっているようなのでメモしておく。 この辺りは明文…

Closure.DONE

Closure は便利だけれども Groovy の場合は途中で break や return *1ができない。 値を返す必要がないときは each より for を使っているが内部イテレータが必要な場合は先に findAll でフィルタリングしている。 でも Groovy も一部のメソッドは break の…

Bitwise operation

Java と Groovy のビット演算のメモ 基本 参考: http://leepoint.net/notes-java/data/expressions/bitops.html assert (3 & 5) == 1 // AND assert (3 | 5) == 7 // OR assert (3 ^ 5) == 6 // XOR assert ~3 == -4 // NOT assert (3 << 2) == 12 assert (…

Y combinator

Y combinator について分かった(気がする)範囲のメモ 『Scheme 手習い』 9章 この章が難しくて悩んでいたのだけど理由が分かった。 Learning Programming Languages with Koans によると*1『Scheme 手習い』は Koan の元になっているようだ。 各章はあるテー…

Re: そのコード、本当に最適化されてますか?

Nagai Masato 氏の Exploring Groovy 1.8 Part 1 - そのコード、本当に最適化されてますか? を読んでコメントしようとしたができなかったので。 if-else と if + return は変わらない エントリのソースを試していて偶然気が付いた。{} をつければ変わらない…

埋め込み文字列+遅延評価

元ネタ Re: Just for fun Groovy script for Google Picasa Venkat Subramaniam 氏の『Programming Groovy』に載っている Tips らしい*1。 Groovy で pass-by-name を検索して Hit した*2。 いつか使おうと思っていたが面白い使用例を思いつきそうにないので…

Koan

Ryo Tomidokoro 氏の エントリ を読んで知った。 調べてみたところ Ruby 発祥の禅問答集のようなもので様々な言語で存在するみたいだ*1。 禅の公案(Koan)がプログラミング学習でプチブーム:Rails Hub情報局:エンジニアライフ Groovy は cjudd 氏の groov…

A micro-manual for LISP Implemented in Groovy

元ネタは Nurullah Akkaya 氏の A micro-manual for LISP Implemented in C その元ネタは Lisp の始祖である John McCarthy 氏の A micro-manual for LISP - not the whole truth*1 LISP による実装は 50 行ぐらい、C による実装は 380行ぐらいある。 この差…

ファイルの改行コードを変換する方法

元ネタ:1行で指定ディレクトリ配下のファイルの改行コードを変換する方法 - Togetter がんばってみたが AntBuilder に及ばなかった。 // 個人的な設定なので注意 new File('.').eachFileRecurse(groovy.io.FileType.FILES) { it.write(it.text.normalize()…

文字列で+を表示する

Groovyのtrampolineを使ってピラミッドのお題を解いてみた - No Programming, No Life が楽しそうなので私も エロと風俗情報満載 どう抜く? から引用する。 pooq 氏からの お題 与えられた文字列で+のかたちを表示するプログラムをかいてください。 サンプ…

Groovy の型変換

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

Groovy MOP

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

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

お題: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

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 で挑戦

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

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