ふるつき

v(*'='*)v かに

合成数列の和アドベントカレンダー番外編(J言語)

はじめに

 合成数列の和アドベントカレンダー は埋まっていたので勝手に番外編を書きます。

解答

次のようなスクリプトが解答になります。実行例もその下に載せています。

#!/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という組織の同人に寄稿しましたのでご覧ください(宣伝)

kosen14s.booth.pm

 さて解説ですが、何時間格闘しても良い説明を書くことができなかったので、コードの断片とその意味を書くにとどめさせていただきます。

素数判定

=&1@#@q:

 受け取った数Nが素数なのかそれとも合成数なのかを返します。q:素因数分解を行っていて、q: 100 だと返り値は 2 2 5 5 になります。

N番目の合成数を返す

(([`>:)@.(=&1@#@q:)@>:@$:@<:)`4:@.(=&1)

入力が1なら4を返し、そうでなければ入力を-1して再帰します。帰ってきた値はN-1番めの合成数なので、次の合成数を得るため+1しています。+1した結果が素数なら更に+1しています。

おわりに

この4はマジックナンバーになるんですかね。消すに消されずという感じではあります