2017-05-01から1ヶ月間の記事一覧

BashでProject Euler(8) 二次元配列

Bashには二次元配列はもちろんありません。それらしいことを実現するにはかつてのPerl4のように例えばカンマで区切るようなことをしなければなりません。 #!/bin/bash N=$1 table=() for y in `seq 1 $N`; do b=() for x in `seq 1 $N`; do b+=($((x*y))) do…

BashでProject Euler(7) 配列

Bashに配列はあります。ただ、とても遅いです。 white spaceで区切って()で括ると配列になります。 #!/bin/bash a=(1 2) a+=(3) echo ${a[@]} # 1 2 3 a+=(3)は、見た通り要素を追加しています。 これは本当に追加なのでしょうか。多くの要素を追加して、経…

BashでProject Euler(6) ラムダ

前回はパイプを使ったのですが、結局ラムダが使えないので中途半端なんですよね。takewhileやfilterを汎用の関数にできないのです。 しかし、evalを使うとラムダっぽいことができます。 a=1 b=c eval $b=\$a echo $c # 1 evalは、c=$aという文字列をコマンド…

BashでProject Euler(5) パイプ

前回は、フィボナッチ数列を垂れ流すだけのfibsを使いたいが、fibsが終わらないと次に進まないのでできないという話でした。 しかし、Linuxにはパイプというものがあったはずです。これならfibsがある程度進めば、その下流の関数が動き出すはずです。そこで…

BashでProject Euler(4) 関数

関数fは次のように定義します。 [function] f() { ... } 関数の値の返し方には2種類あります。 is_even() { n=$1 return $((n%2)) } 引数は、$1、$2に格納されます。そして、returnで返します。 返せる値は0〜255の整数に限られているので、上のように、叙述…

BashでProject Euler(3) if

if文を使えるようになると、Problem 1が解けます。if文は、 if ...; then ... elif ...; then ... else ... fi という形式になっています。ifの行は、例えば次のようです。 #!/bin/bash if [ 1 -lt 2 ]; then echo 1 fi -ltはless thanを意味していて、1は2…

BashでProject Euler(2) for

Problem 1を前回のように包除原理で解くのはプログラミングの問題としてはやや邪道です。ループを回す方法を考えてみましょう。 while/untilを使うことも使うことも可能ですが、やはりforを使うほうがフローが分かりやすいでしょう。forには2種類あります。…

BashでProject Euler(1) first step

Bash on Ubuntu on Windowsをインストールしたので、Project EulerをBashで解いてみました。 元々、WindowsのPythonで64ビット整数を扱おうとすると多倍長整数になってしまい32ビットの範囲で計算しているときよりかなり遅いという問題がありました。Linux版…