【宿題】「第55回シェル芸勉強会」の解答例
- 問題および出題者による解答例:
- 参考リンク:
Q1
次の図形を描いてください。for文やwhile文は禁止とします。
* * * * * * * *
* * * *
* * * *
* * * *
* * * *
* * * *
* * * *
* * * * * * * *
A1
$ printf '* * * * * * * *\n* * * *\n* * * *\n* * * *\n* * * *\n* * * *\n* * * *\n* * * * * * * *\n'
* * * * * * * *
* * * *
* * * *
* * * *
* * * *
* * * *
* * * *
* * * * * * * *
Q2
次のおしゃれなUNKOを落ち着かせてASCIIコードのUNKOに戻してください。どんな変換方法でも構いませんが、UNKO
の4個の大文字と、元の𝒰𝒩𝒦𝒪
の4文字は使用禁止にします。元の𝒰𝒩𝒦𝒪
由来のデータを使わない方法も禁止です。
$ echo 𝒰𝒩𝒦𝒪
A2
# 出題の条件上、awkコマンド内でNFとENDは使用不可
$ echo 𝒰𝒩𝒦𝒪 | uniname -p | awk '/script/i{c=c $12;print c}' | tail -n1
UNKO
Q3
次のふたつの出力例のように、端末のフチに@
を並べてください。for文やwhile文は禁止とします。
A3
# 次のようにすることで、perlコマンドの変数にシェル変数の値を渡せます
$ perl -sE '$c=" "x${C}."\n";$l=${c}x($L-1);print $l' -- -C=$(tput cols) -L=$(tput lines) | sed '1s/ /@/g;$s/ /@/g;s/^ /@/;s/ $/@/'
出力は次のようになります。
Q4
端末上で次のような出力を得てください。
A4
$ reset; S=$(seq 30 | awk '{OFS="";for(i=1;i<=30;i++){$i="_";$NR="💩"}print}'); paste -d "" <(echo "$S") <(echo "$S" | rev) | sed 's/💩💩/_🍣/' | while read l; do printf "\033[1;1H\n\n${l//_/ }\n\n\n"; sleep 0.2; done
出力は次のようになります。
Q5
次のwords
について、同じ文字がちょうど3つ存在し、他に同じ文字がちょうど2つ存在する単語を抽出してください。
$ cat words
metabolizes
Manuela
Kroger
purchasable
luster
clattering
mesh
campus
seating
giblet
(...略...)
A5
$ cat words | while read l; do printf "$l "; (echo $l | grep -o . | sort | uniq -c | tr -d '\n'; echo); done | awk '/3/' | awk '/2/' | awk '{print $1}'
multidimensional
sharecropper
antenna
constitutionals
Goolagong
nostalgically
Q6
次のような模様を描いてください。
A6
$ perl -E '$O="💩 "x9 ."\n"." 💩"x16 ."\n"." 💩"." 💩"x7 ."\n"." 💩"x16 ."\n";print ${O}x9' | sed -E 's/ +$//' | head -n33
💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩 💩
💩 💩 💩 💩 💩 💩 💩 💩 💩
Q7
words
について、しりとりになっている行を横一列に出力してください。大文字小文字は区別しません。出力は次のようになります。
campus seating giblet Tomas
lifeless secures
clews shove exhaust
orifice equivocal
A7
$ sed -E 's/^([A-Z])/\1#/' words | sed -Ez 's/(.)\n\1/\1!\n!\1/gi' | grep ! | sed -Ez 's/!\n!/ /g' | sed -E 's/(.)#/\U\1/g'
campus seating giblet Tomas
lifeless secures
clews shove exhaust
orifice equivocal
Written on August 25, 2021