Julia

シクシク素数列 Advent Calendar 2018 Julia編

この記事は「シクシク素数列 Advent Calendar 2018」4日目になります。

言語は Julia を使って解いたのですが、素数関連の関数を使用する関係上バージョン 0.4 を使っています。

お題の詳細はココに譲るとして、早速解答と解説を見ていきましょう!


解答

print(join(filter(x->ismatch(r"4|9","$x")&&isprime(x),(1:1319).')[1:parse(readline())],","))

オンライン実行環境で見る


解説



  1. (1:1319).' で1から1319までの配列をつくる。

  2. その配列の中から filter で「素数 かつ 4か9が含まれる 数字 - ☆」を抽出する。「素数」の判定には isprime 関数、「4か9が含まれる」の判定には ismatch 関数を使う。与えられた数字が☆を満たすかどうか判定する際に「素数」の判定を後回しにしているのは、「4か9が含まれる」の判定のほうが「素数」の判定より早く判定でき、「4か9が含まれる」を満たさない場合は「素数」の判定のために無駄な計算をしなくて済むからである。

  3. ☆を満たす数字の配列の先頭から標準入力で与えられた数字(parse(readline()))分取り出す。

  4. 3. で取り出した配列を join 関数でカンマ区切りで結合する。

  5. 結果を print 関数で標準出力する。