【宿題】「第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/ $/@/'

出力は次のようになります。

A3.png


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

出力は次のようになります。

A4.gif


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