練習をしてみることにしました。いつの間にかbeta‐10が出てたみたいです。
プログラムの練習には数学的なパズルが一番,ということで1から100までの
間にある素数のリストを出力するスクリプトを書いてみました。
2から100までをループで回す。各数字を2からその数字までで割り切れる数字がないか[その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> }
チェックしてフラグをセットする。フラグが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 件のコメント:
コメントを投稿