【問題と解答】jus共催 第37回シェル芸bot生きてるかどうか分からないけどシェル芸bot向けシェル芸勉強会
Sat Sep 1 17:49:53 JST 2018 (modified: Sat Sep 1 17:52:57 JST 2018)
views: 2978, keywords:プログラミング,勉強会,シェル芸,シェル芸勉強会 この記事は最終更新日が6年以上前のものです。
- 環境: 2018年8月30日の時点でのシェル芸botに合わせています。解答例はUbuntu Linux 18.04 で作成。Macの場合はcoreutilsをインストールすると、GNUのコマンドが使えます。BSD系の人は玄人なので各自対応のこと。
Q1
次のようなFizzBuzzのアニメーションを作ってください。
解答
こちらのanimation
コマンドを使用した例です。
$ seq 100 | sed '0~3s/.*/Fizz/;0~5s/.*/Buzz/;0~15s/.*/FizzBuzz/' |
awk '{printf("%08s\n",$1)}' | sed 's/ / /' | animation
Q2
次のような出力を得てください。できる人は画像で三角形の中に目を描いてください。
/\
/ \
/ 👁 \
/ \
 ̄ ̄ ̄ ̄
解答
$ echo ' /\' | sed ':a p;s@ /@/ @;b a' | head -n 4 | sed '$a ̄ ̄ ̄ ̄' | sed '3s;/ ;/ 👁 ;'
/\
/ \
/ 👁 \
/ \
 ̄ ̄ ̄ ̄
Q3
次の数字は、いずれも3桁の中に同じ数がなく、各桁を足すと15になる数字です。また、0は含みません。このような数を全て列挙してください。
159 168 186 195 249 258 267 276 285 294 348 357 375 384 429 438 456 465 483 492 519 528 537 546 564 573 582 591 618 627 645 654 672 681 726 735 753 762 816 825 834 843 852 861 915 924 942 951
解答
$ seq -w 999 | grep -v 0 | awk -F '' '$1+$2+$3==15' |
grep -Pv '([1-9]).*\1' | xargs
159 168 186 195 249 258 267 276 285 294 348 357 375 384 429 438 456 465 483 492 519 528 537 546 564 573 582 591 618 627 645 654 672 681 726 735 753 762 816 825 834 843 852 861 915 924 942 951
Q4
次のような役満画像を出力してください。できればasciiコードだけ入力して作ってください。
解答
$ echo -e $(echo \\U1F00{0,1,2,3,6}) | grep -o . |
awk '{print $1$1$1}' | xargs | sed 's/.$//' | imgout -f Symbola
Q5
次のような出力を、出力が予想できないようになるべく難読化して得てください。できる人はascii文字だけで得てください。
山
山
山
山 山 山
山山山山山
⽥⽥⽥⽥⽥
⽥ ⽥ ⽥
⽥⽥⽥⽥⽥
⽥ ⽥ ⽥
⽥⽥⽥⽥⽥
解答例
$ echo '..@.. @.@.@ @@@@@ .....' | awk '{print $1,$1,$1,$2,$3,$4,$3,$2,$3,$2,$3}' |
xargs -n 1 | sed '6,$s/@/x/g' | sed "y/@.x/$(echo -ne \\u5c71\\u3000\\u2f65)/"
山
山
山
山 山 山
山山山山山
⽥⽥⽥⽥⽥
⽥ ⽥ ⽥
⽥⽥⽥⽥⽥
⽥ ⽥ ⽥
⽥⽥⽥⽥⽥
Q6
今度は次のような出力を作ってください。これは特にasciiコードに制限しませんが、難読化されているほど良いこととします。
山
田
山
山 田 山
田山田山田
田山田山田
山 田 山
田山田山田
山 田 山
田山田山田
解答例
$ echo '..@.. x.@.x @x@x@ .....' |
awk '{print $1,$1,$1,$2,$3,$4,$3,$2,$3,$2,$3}' |
xargs -n 1 | sed '1s/@/x/' | sed '3s/@/x/' | sed 'y/.x@/ 山田/'
山
田
山
山 田 山
田山田山田
田山田山田
山 田 山
田山田山田
山 田 山
田山田山田
Q7
松屋のメニューについて、ひらがなに変換した上でfiglet
あるいはtoilet
で巨大文字にして、何段かに別れて出力された場合、一行に並べなおして画像にしてください。
解答
$ matsuya | kakasi -i utf-8 -JH |
sed 's/うし/ぎゅう/g' | figlet |
awk '{a[NR%8]=a[NR%8]$0}END{for(i=0;i<8;i++)print a[i]}' |
imgout
Q8
matsuya
コマンドを使って、次のような出力を得てください。(HTML上で見ると崩れているかもしれませんが、四角形に文字をレイアウトしてください。)
鉄皿鶏のチリソース定食
皿 定
鶏 ス
の ー
チ ソ
リ リ
ソ チ
ー の
ス 鶏
定 皿
食定スーソリチの鶏皿鉄
解答
matsuya | pee cat "grep -o ." rev |
awk 'NR==1{a=$0;print}NR>1{printf $0;for(i=1;i<length(a)-1;i++)printf " ";print substr(a,length(a)-NR+2,1)}' |
sed 2d | tac | sed 2d | tac | sed '$s/.$//'
鉄皿鶏のチリソース定食
皿 定
鶏 ス
の ー
チ ソ
リ リ
ソ チ
ー の
ス 鶏
定 皿
食定スーソリチの鶏皿鉄