【衝撃】シェルスクリプトなら素数を列挙する問題が1行(ワンライナー)で書ける!

Bash,Linux

はじめに

シェルスクリプトだと FizzBuzz が1行(ワンライナー)で書ける と同じようにワンライナーネタです。

最近は Go 言語 を少しずつ勉強しています。

その中で素数を求める問題を説いてみよう!と思ったのですが、すぐに脇道にそれて 「Bash 上でシェルを使って得ならどう書くか?」 に頭を使っているうちにエントリを書くことにしました。

ぜひ、「孤独な数値」を数えて落ち着きたい方にどうぞ。

検証環境

$ head -n 2 /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"

$ bash -version | head -n 1
GNU bash, version 5.1.4(1)-release (x86_64-apple-darwin20.2.0)

動画解説

動画でも解説しています。

ただし、1 は素数と言ったり、素因数のことを約数と言ってみたり、数学をかじった人たちからマサカリが飛んできそうな内容になっています。。。。

素因数分解をしてくれるコマンド factor を活用

素数を求めるために、 factor コマンドを活用します。
( もしインストールされていないなら yum install coreutil あるいは apt install coreutil をどうぞ )

factor コマンドは引数で指定した数値を 素因数分解 してくれるコマンドです。

2, 3, 4, 20 のそれぞれの数値を引数として実行してみます。

# 2 = 2
$ factor 2
2: 2

# 3 = 3
$ factor 3
3: 3

# 4 = 2 * 2
$ factor 4
4: 2 2

# 20 = 2 * 2 * 5
$ factor 20
20: 2 2 5

実行結果はスペース区切りで出力されます。

1 列目には引数で指定した数値、 2 列目以降は素因数が列挙されています。

awk を組み合わせる

factor の実行結果を awk コマンドに渡して制御します。

素数 であるということは 素因数分解した結果、素因数が 1 つしかない ということです。

ですので factor 実行結果は 2 列 (3 の場合は 3: 3)しか表示されないはずです。

これを踏まえて、素数である場合のみ、標準出力させるようにしてみます。

$ factor 2 | awk 'NF==2 { print $2 }'
2

$ factor 3 | awk 'NF==2 { print $2 }'
3

# 何も表示されない
$ factor 4 | awk 'NF==2 { print $2 }'

# 何も表示されない
$ factor 20 | awk 'NF==2 { print $2 }'

2 列だった場合は、2 列目の値だけを表示しています。

応用:1〜100 の間の素数をすべて出力しなさい。

factor コマンドは複数の数値を渡して、一度にすべての数の素因数分解を行う事ができます。

# 1から10の数値を素因数分解
$ factor {1..10}
1:
2: 2
3: 3
4: 2 2
5: 5
6: 2 3
7: 7
8: 2 2 2
9: 3 3
10: 2 5

これを使えば、 1〜100 の間の素数をすべて列挙するのも容易 ですね。

$ factor {1..100} | awk 'NF==2 { print $2 }'
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97

ひとこと

ワンライナー系エントリ、面白そうなものがあれば引き続き投稿していきます。

Bash,Linux