2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

シクシク素数列 awk編

Last updated at Posted at 2018-12-16

こちらは シクシク素数列 Advent Calendar 2018 の17日目の記事です。

「平成最後の」が流行語になった年に、awkです。
Wikipediaによるとsince1979らしいので、来年は40周年を機にawk再評価のムーブメントが起きるやもしれません。

ルール(転載)

  • 数値に4か9を含む素数をシクシク素数と呼ぶことにします
    • 19とか41とか149とか。
  • 標準入力として正の整数 N を与えたら N 番目までのシクシク素数を半角カンマ区切りで標準出力してください
    • 例 N = 9 の場合、 19,29,41,43,47,59,79,89,97
  • N は最大で 100 とします

実装

awk '{for(i=9;$0;i++)if(match(i,/4|9/)){for(j=2;j<i;j++)if(i%j<1)j=i;printf(i<j?x:--$0?i",":i RS)}}'

懺悔

文系出身の万年素人が、ワンライナーをキメる仙人たちに憧れて、
何とか1バイトでも短く書きたい、という煩悩を最優先してシクシクHackしましたが、
これが精一杯でした。

雑な説明

awkは入力を行ごとに処理します。$0にその行の内容が入ります。
今回の場合、正の整数 N が入ることになります。

forループの中で、シクシク素数を見つけたらそれを出力しつつ$0を減らしていきます。
ループの繰り返し条件に$0とあるのは、
awkでは真偽判定の文脈ではゼロは偽(ゼロ以外は真)であることを利用しています。

match関数でシクシクかどうかを見ています。
この文脈ではiは文字列として扱われます。

内側のループで素数かどうかを見ています。
割り切って抜けた時はxを出力。
といっても何も代入していないので、この文脈では空文字です。

最後まで割り切れなかった時にiを叫ぶのですが、
カウントダウンしている$0がゼロでない間はカンマをつけます。
文字列を連結するには、ただ並べて書くだけ、というこの大らかさ。

ゼロになったら、カンマの代わりに\nとするのですが、
awkの組み込み変数RSの初期値が改行コードであることを利用したのは、
前述の煩悩のなせるわざ。

結果

シクシク素数列
$ seq 10 | awk '{for(i=9;$0;i++)if(match(i,/4|9/)){for(j=2;j<i;j++)if(i%j<1)j=i;printf(i<j?x:--$0?i",":i RS)}}'
19
19,29
19,29,41
19,29,41,43
19,29,41,43,47
19,29,41,43,47,59
19,29,41,43,47,59,79
19,29,41,43,47,59,79,89
19,29,41,43,47,59,79,89,97
19,29,41,43,47,59,79,89,97,109

それっぽく出てると思います。

###おまけ

more4949(almost_sick)
$ seq 4 9 | awk '{for(c=4+9;$(sick*sick);c++)if(match(c,/4|9/)){for(q=sqrt(49)-sqrt(4)-sqrt(9);c>q;q++)if(c%q<49/49)q=c;printf(c<q?sick:--$(sick*sick)?c",":q RS)}}'
19,29,41,43
19,29,41,43,47
19,29,41,43,47,59
19,29,41,43,47,59,79
19,29,41,43,47,59,79,89
19,29,41,43,47,59,79,89,97
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?