今日は11日です。
11は素数だから今日は素敵な日です。
Javaでやってみる
public class Main { static int value = 11; public static void main(String[] args) { for (int i = 2; i < value; i++) { if (value % i == 0) { System.out.println(false); return; } } System.out.println(true); } }
(もうちょい面倒だと思ったのに…)
Groovyでやってみる
こういうのはJavaでやると面倒なので、Groovy(勉強中)でやってみよう。
def value = 11 println value <= 2 || (2..value-1).every { value % it != 0 }
…なんかごっちゃりした。
1行にしてみる
無理矢理1行で書いてもあまり嬉しくない。
def value = 11;println value <= 2 || (2..value-1).every{value % it != 0}
Object (Groovy JDK)眺めてたら with ってのがあるっぽい。あと ..< 使って、0はfalseだから省略出来る。
println 11.with{i -> (2..<i).every{i % it}}
こんなもんかな?
折角なのでコマンドラインから実行
PS> groovy -e "println 11.with{i -> (2..<i).every{i % it}}"
指定されたファイルが見つかりません。
指定されたファイルが見つかりません。
コマンドの構文が誤っています。
…なんだこりゃ?ファイルに保存したら実行できたけど、それじゃ嬉しくない。うーん。
ベタ書きカッコワルイのでパラメータを受けるようにする
println ((args[0] as int).with{i -> (2..<i).every{i % it}})
ハマったとこ
一番外側のカッコを付けないと動かないんですが、エラーがイマイチ理解できなくてしばらく首捻ってました。println(args[0] as int) の戻り(voidだからnullっぽい?)に with 呼んで、それが入っている i と 2 を比較しようとしたところでコケる感じです。
その部分だけ切り出してgroovyshで実行するとこんな感じ。
groovy:000> null.with{it <= 2} ERROR groovy.lang.GroovyRuntimeException: Cannot compare org.codehaus.groovy.runtime.NullObject with value 'null' and java.lang.Integer with value '2' at groovysh_evaluate$_run_closure1.doCall (groovysh_evaluate:2) at groovysh_evaluate.run (groovysh_evaluate:2)
NullPointerExceptionにはならないんですね。