この記事は「シクシク素数列 Advent Calendar 2018」4日目になります。
言語は Julia を使って解いたのですが、素数関連の関数を使用する関係上バージョン 0.4 を使っています。
お題の詳細はココに譲るとして、早速解答と解説を見ていきましょう!
解答
print(join(filter(x->ismatch(r"4|9","$x")&&isprime(x),(1:1319).')[1:parse(readline())],","))
解説
-
(1:1319).'
で1から1319までの配列をつくる。 - その配列の中から
filter
で「素数 かつ 4か9が含まれる 数字 - ☆」を抽出する。「素数」の判定にはisprime
関数、「4か9が含まれる」の判定にはismatch
関数を使う。与えられた数字が☆を満たすかどうか判定する際に「素数」の判定を後回しにしているのは、「4か9が含まれる」の判定のほうが「素数」の判定より早く判定でき、「4か9が含まれる」を満たさない場合は「素数」の判定のために無駄な計算をしなくて済むからである。 - ☆を満たす数字の配列の先頭から標準入力で与えられた数字(
parse(readline())
)分取り出す。 -
- で取り出した配列を
join
関数でカンマ区切りで結合する。
- で取り出した配列を
- 結果を
print
関数で標準出力する。