11
9

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.

Project Eulerをシェル芸で解いてみる(Problem 1)

Last updated at Posted at 2016-01-03

概要

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問だけあって、簡単ということもあるけど...
    • 実際、そのまんまだし...
  • シェル芸、処理の過程が把握しやすくて、楽ちん。
    • コメントアウトするだけで、途中まで実行することも簡単にできるので、便利。
    • 僕のように面倒臭がりな人間に、ぴったりだと思う。

  1. About - Project Euler (https://projecteuler.net)

  2. シェル芸の定義 >> シェル芸 - 上田ブログ (https://blog.ueda.asia/?page_id=1434)

  3. 233168

11
9
5

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
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?