はじめに
合成数列の和アドベントカレンダー は埋まっていたので勝手に番外編を書きます。
解答
次のようなスクリプトが解答になります。実行例もその下に載せています。
#!/usr/bin/jconsole.sh echo +/ ((([`>:)@.(=&1@#@q:)@>:@$:@<:)`4:)@.(=&1)"0 >:@i.@".@>(2}ARGV) exit ''
$ ./script.ijs 2 10 $ ./script.ijs 4 27 $ ./script.ijs 10 112 $ ./script.ijs 100
解説
J言語についてはすべてが http://www.jsoftware.comにあるのでそちらを参照するか、簡単にですが日本語で説明した記事をkosen14sという組織の同人に寄稿しましたのでご覧ください(宣伝)
さて解説ですが、何時間格闘しても良い説明を書くことができなかったので、コードの断片とその意味を書くにとどめさせていただきます。
素数判定
=&1@#@q:
受け取った数Nが素数なのかそれとも合成数なのかを返します。q:
は素因数分解を行っていて、q: 100
だと返り値は 2 2 5 5
になります。
N番目の合成数を返す
(([`>:)@.(=&1@#@q:)@>:@$:@<:)`4:@.(=&1)
入力が1なら4を返し、そうでなければ入力を-1して再帰します。帰ってきた値はN-1番めの合成数なので、次の合成数を得るため+1しています。+1した結果が素数なら更に+1しています。
おわりに
この4はマジックナンバーになるんですかね。消すに消されずという感じではあります