2005-03-21

Groovyの練習 - 素数のリストを出力する -

最近Groovyでスクリプトを書くのをサボってたので,勘を取り戻すために
練習をしてみることにしました。いつの間にかbeta‐10が出てたみたいです。

プログラムの練習には数学的なパズルが一番,ということで1から100までの
間にある素数のリストを出力するスクリプトを書いてみました。

[その1]
1> for(i in 2..100) {
2> flag = 1
3> for(j in 2...i) {
4> if(i%j == 0)
5> flag = 0
6> }
7> if(flag == 1)
8> print i + ", "
9> }
2から100までをループで回す。各数字を2からその数字までで割り切れる数字がないか
チェックしてフラグをセットする。フラグが1だったら出力,というような流れです。
「2..100」は2以上100以下,「2...i」は2以上i未満という範囲を表しています。
一番オーソドックスなプログラムだと思います。

それではこれを改造してちょっとGroovyらしく書いてみます。

[その2]
1> (2..100).each { i |
2> flag = 1
3> (2...i).each { j |
4> if (i%j == 0)
5> flag = 0
6> }
7> if (flag == 1)
8> print i + ", "
9> }

[その1]のループを,範囲オブジェクトのeachに置き換えました。ちょっと
すっきりしたかな。でもやっぱりフラグが面倒ですね。

[その3]
1> (2..100).each { i |
2> if ( (2...i).every { j | i%j != 0 } )
3> print i + ", "
4> }

範囲オブジェクトのeveryを使うと,フラグが要らなくなります。everyは『リストの
全ての要素に対して与えられた条件式が成り立つときtrueを返す』というメソッドです。
[その3]では『2からi-1までの数がiを割り切らない』という条件判断に使っています。

[その1]から比べると,大分短くなっちゃいました。これでも十分だけどもうちょっと
短くなんないかな。

ちょっとトリッキィだけど,こんなのも出来ます。

[その4]
1> (2..100).each { i |
2> (2...i).every { j | i%j != 0 } ? print i + ", ": print
3> }

わぉ,最初の9行のプログラムが3行になっちゃったよ! 実質2行だし。
スクリプト言語を使うのってGroovyが初めてなんだけど,こんなに楽チンで良いのかしら。

さてさて,これを実行してみると。

[実行結果]
3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
53, 59, 61, 67, 71, 73, 79, 83, 89, 97,

2が出力されてないじゃん・・・orz


参考リンク
Groovy - Java用スクリプト言語
    Groovyを勉強するならとりあえずこのページを印刷しとくと良いかも。コンパクトにまとまってます。

0 件のコメント: