Hacker Rank: Looping and Skipping

Hacker Rankのこちらの問題について書いてみたいと思います。

1から99までの奇数を1行に1つずつ出力するというもの。まぁ、seq 1 2 99で瞬殺です。

$ seq 1 2 9
1
3
5
7
9

というように、FirstLastの数字の間にもう1つ数字を入れると、Incrementを指定できます。seqコマンドのヘルプに書いてあります。

もう少し問題の趣旨に沿った解き方をしてみましょう。
ループとスキップをしろという問題なので、1から100まで入力して、forとかwhileとかでループしながら奇数なら出力、偶数ならスキップするというのが王道なのでしょう。

この問題は入力が無いので、自力で1から100までの数字の並びを作ってやる必要があります。Bashで連続した数字の並びを作るときは、大体次のようにしています。

$ echo {1..9}
1 2 3 4 5 6 7 8 9

これを元ネタにループを回すとすると、大体次のやり方が浮かびます。

$ for i in {1..3}; do echo $i ;done
1
2
3
$ echo {1..3} | xargs -n1 | while read i; do echo $i; done
1
2
3

ループを回すなら、for文で次のようにも書けます。

$ for ((i=1;i<=3;i++));do echo $i; done
1
2
3

ここで奇数だけ出力するのにぱっと思いつくのは次のやり方です。

$ for i in {1..3}; do [ $(($i % 2)) -eq 1 ] && echo $i ; done
1
3

if文を使って書くとこうなります。

$ for i in {1..3}; do \
>   if [ $(expr $i % 2) -eq 1 ]; then \
>     echo $i
>   fi \
> done
1
3

上の二つはマジメに2で割った余りを求めてましたが、求めなくてもOKです。

$ echo {1..20} | xargs -n1 | sed -n '/[13579]$/p'
1
3
5
7
9
11
13
15
17
19

整数だけというのを利用して、1の位が13579のいずれかの場合だけ出力してます。

ん~。このくらいでしょうか。次回はseqコマンドを掘り下げてみたいと思います。
# 自分にノルマを課していくスタイル。