BashでProject Euler(7) 配列

Bashに配列はあります。ただ、とても遅いです。
white spaceで区切って()で括ると配列になります。

#!/bin/bash

a=(1 2)
a+=(3)
echo ${a[@]}    # 1 2 3

a+=(3)は、見た通り要素を追加しています。
これは本当に追加なのでしょうか。多くの要素を追加して、経過時間を調べればだいたいわかります。

#!/bin/bash

N=$1
a=()
for n in `seq 1 $N`; do
    a+=($n)
done

これを、引数を変えてtimeで時間計測すると

arg    100000  1000000 10000000
real 0m0.656s 0m6.357s 1m4.420s

線形のようですね。
ちなみに、構築だけならこのほうが速いです。

#!/bin/bash

N=$1
a=(`seq 1 $N`)

3倍くらい速かったです。
参照は、次のようにします。

a=(1 2 3 4 5)
echo ${a[0]}    # 1

他の参照方法は、

echo ${a[@]}        # 1 2 3 4 5
echo ${a[@]:1:3}    # 2 3 4

2つ目は、0-baseの開始位置と長さを指定しています。

値の代入は、

a[1]=3

これで、Problem 7が解けます。エラトステネスの篩のややこしいバージョンになっていますが。

続きを読む