Bash on Ubuntu on Windowsをインストールしたので、Project EulerをBashで解いてみました。
元々、WindowsのPythonで64ビット整数を扱おうとすると多倍長整数になってしまい32ビットの範囲で計算しているときよりかなり遅いという問題がありました。Linux版のPythonなら、整数は64ビットで計算するので、この問題は起こりません。Ubuntuで実行することで数倍速くなりました(通常のスクリプトなら速くならず、むしろ若干遅い印象)。メモリも2GBの壁がなくなり、ガーベージコレクタが適切に働いてくれないという問題も解決されます。
Bashのバージョンは、
$ bash --version GNU bash, バージョン 4.3.11(1)-release (x86_64-pc-linux-gnu)
です。
さて、スクリプトを書いていきましょう。
とりあえず、包除原理を使って書きます。N=1000として、
N未満の3の倍数の自然数の和s3=3[(N-1)/3][(N-1)/3+1]/2
N未満の5の倍数の自然数の和s5=5[(N-1)/5][(N-1)/5+1]/2
N未満の15の倍数の自然数の和s15=15[(N-1)/15][(N-1)/15+1]/2
s3+s5-s15
で答えが出ます。
#!/bin/bash # e001.sh N=$1 s3=$((((N-1)/3)*((N+2)/3)/2*3)) s5=$((((N-1)/5)*((N+4)/5)/2*5)) s15=$((((N-1)/15)*((N+14)/15)/2*15)) s=$((s3+s5-s15)) echo $s
$ ./e001.sh 1000
代入
代入は、
name=value
とします。例えば、
n=1
とすれば、変数nの値が1となります。
ここで、=の前後にスペースを入れてはいけません。入れると変数名や値にスペースがついてしまいます。
そして、それを標準出力するには、
echo $n
とします。変数に$をつけてはじめて値になります。
引数
スクリプトの引数は、$1、$2、…となります。