Qiitaのアドベントカレンダーのシクシク素数列をbashでやりました。 qiita.com
回答
#!/bin/bash # 4949している素数の数 rescnt=0 # 素数は1を除くので2から開始 num=2 # 0の場合は結果なし。探したい数見つかるまでループする。 while [ ! $1 = 0 -a ! "$rescnt" = "$1" ] do if [ ! -z `echo $num | grep -E "4|9"` ]; then for((i=2;i<=$(($num/2));i++)); do [ $(($num % $i)) = 0 ] && break done # 最後までループしていたら$iは$num/2+1になっている if [ "$i" = $(($num/2+1)) ]; then [ ! "$rescnt" = "0" ] && echo -n "," echo -n $num rescnt=$(( $rescnt + 1 )) fi fi num=$(( $num + 1 )) done
テストコード
# テスト tmpfile=$(mktemp) function test_sosu_4949() { ./4949.sh $1 >> $tmpfile #cat $tmpfile if [ "`cat $tmpfile`" = "$2" ]; then echo -n "success!" else echo -n "error" fi echo "$1 $2" echo -n > $tmpfile } test_sosu_4949 9 "19,29,41,43,47,59,79,89,97" test_sosu_4949 8 "19,29,41,43,47,59,79,89" test_sosu_4949 7 "19,29,41,43,47,59,79" test_sosu_4949 6 "19,29,41,43,47,59" test_sosu_4949 5 "19,29,41,43,47" test_sosu_4949 4 "19,29,41,43" test_sosu_4949 3 "19,29,41" test_sosu_4949 2 "19,29" test_sosu_4949 1 "19" test_sosu_4949 0 "" rm -f $tmpfile
所感
bashのテストコードを書くのは合成数の和を含めて2回目。 テストコードがあるのに、先にコードをきれいに書きつつ作ろうとして 余計な時間がかかってしまった感!