概要
Project Euler1は、数学的な問題解決能力を要求する、プログラミング問題集である。
Project Eulerは、一般的なオンラインプログラミングジャッジとは異なり、解答するプログラミング言語は、特に限定されていない。
フォームに入力した値だけで正誤を判別するため、適切なアルゴリズムさえ考案できれば、手計算で解答することも可能である。
そのため、Web上では様々な手法による解答が公開されている。
しかし、シェル芸2による解答は、私が探した限りでは、殆ど見つからなかった。
そこで、私自身の勉強も兼ねて、Project Eulerをシェル芸で解いてみることにした。
本記事では、Project EulerのProblem 1を、シェル芸で解いた際の過程を述べる。
実行環境
- Arch Linux (x86_64, 4.3.3-2-ARCH)
- zsh (5.2)
- GNU coreutils (8.24)
- gawk (4.1.3)
問題文
[原文 (https://projecteuler.net/problem=1)]
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
[日本語訳 (http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%201)]
10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.
正答は注釈3に記載する。
解法1
#!/bin/sh
seq 1 999 \
| # 1000未満の自然数の生成
awk 'BEGIN{sum=0}; ($1 % 3 == 0 || $1 % 5 == 0){sum += $1}; END{print sum}'
# 3もしくは5の倍数の出力
解法1の解説
この解法による処理の詳細は、コードに記載してあるコメントの通りである。
解法2
#!/bin/sh
(seq 3 3 999; seq 5 5 999) \
| # 1000未満の自然数のうち、3の倍数と5の倍数を出力
sort -n \
| # 数値のソート
uniq \
| # 重複する数値(15の倍数)の除去
tr '\n' '+' \
| # 総和算出式の生成
sed -e 's/+$/\n/' \
| # 末尾の余分な演算子'+'の除去
bc
# 総和の出力
解法2の解説
この解法による処理の詳細は、コードに記載してあるコメントの通りである。
雑記
- 「こうすればもっと効率化できるよ」や、「こう書けばエレガントだよ」等の意見がありましたら、気軽に教えていただけますと幸いです🐺
- 現在の進捗状況 -> https://github.com/gin135/Project_Euler/tree/master/sh
- 解法1は、シェル芸というよりは、ほとんどAWKのコードだよね...
- なので、なるべくシェルコマンドだけで答えを出す、解法2も考えてみた。
- まあ、シェル芸の「目の前の問題をパパっと終わらせる」という目的を考えると、解法1でも問題は無い気もする。
- なんか、解説がすっごく投げやりな気がする...
- 第1問だけあって、簡単ということもあるけど...
- 実際、そのまんまだし...
- シェル芸、処理の過程が把握しやすくて、楽ちん。
- コメントアウトするだけで、途中まで実行することも簡単にできるので、便利。
- 僕のように面倒臭がりな人間に、ぴったりだと思う。
-
About - Project Euler (https://projecteuler.net) ↩
-
シェル芸の定義 >> シェル芸 - 上田ブログ (https://blog.ueda.asia/?page_id=1434) ↩
-
233168 ↩