今日の自分を支える 技術→マネジメント

技術職→管理職になりました

シクシク素数列 Advent Calendar 2018 をbashでやってみた

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回目。 テストコードがあるのに、先にコードをきれいに書きつつ作ろうとして 余計な時間がかかってしまった感!