【問題と解答】jus共催 第56回シェル・ワンライナー160本ノックアウトシェル芸勉強会

Tue Nov 2 11:00:33 JST 2021 (modified: Tue Nov 2 11:00:33 JST 2021)
views: 77, keywords: プログラミング,勉強会,シェル芸,シェル芸勉強会

  このエントリーをはてなブックマークに追加 
  • 問題で使われているデータファイルはGitHubにあります。クローンは以下のようにお願いします。
  • 環境: 解答例はUbuntu 20.04 LTSで作成。Macの場合はcoreutilsをインストールすると、GNUのコマンドが使えます。BSD系の人は玄人なので各自対応のこと。

Q1

日本語を入力せずに、端末に月月火水木金金と出力してください。

解答例

$ cal | sed -n 2p | sed 's/^.//;s/...$//' | tr -d ' '| sed 's/^./&&/;s/.$/&&/'
月月火水木金金

Q2

次のコマンドからパイプをつなげて、「今日の仕事は、楽しみですか。」と出力してください。

$ echo 今楽日しのみ仕で事すはか、。

解答例

$ echo 今楽日しのみ仕で事すはか、。 | sed p | sed -E '1s_(.)._\1_g;2s_.(.)_\1_g' | paste -sd ''
$ echo 今楽日しのみ仕で事すはか、。 | fold -b6 | sed 's/./& /' | rs -T | tr -d ' \n' | awk 4

Q3

 red.txtから色(ANSIカラーコード)を除去してください。特に一般解を考える必要はありません。

$ less red.txt
・・・
perESC[01;31mESC[KseESC[mESC[Kvering
furtivenESC[01;31mESC[KesESC[mESC[Ks's
remeESC[01;31mESC[KdiESC[mESC[Ked
・・・

解答例

$ cat red.txt | sed 's/\x1b\[01;31m//g' | sed 's/\x1b\[K//g' | sed 's/\x1b\[m//g'
### nodeのstrip-ansiを使う ###
$ cat red.txt | strip-ansi

Q4

端末に次のように描画してください。

解答例

$ echo -e '11\n 11  44\n     433\n6666 433' | sed 's/ /  /g' | sed 's/[^ ]/\x1b[4&m  \x1b[m/g'

Q5

ros_logファイルは、複数のプロセスがログを書き込んだファイルです。次のようにVALUEという文字列をgrepで検索すると、行の最初の文字列が欠けている行があります。

小問1

この、欠けている文字列をros_logから探してください。

小問2

欠けている部分を上のgrep VALUE ros_logの出力につなげて、各行に描いてあるふたつの数字の差を出力してください。左の数字はシステムの時刻、右の数字はプログラムが走り出してからの秒数なので、すべての行の差が(だいたい)一致すると、正しくデータが復元していることが分かります。

解答例

小問1

ログの壊れ方にもよりますが、ros_logの場合は次のような正規表現で検出できます。

小問2

Q6

house.pgmは、ある環境の地図です。この地図は1画素で5[cm]四方の領域に物があるかないかを示したものですが、1画素10[cm]四方に解像度をさげたいと考えました。田字型の4区画で、値が最も小さい(色の濃い)画素を残す方法で、解像度を下げてhouse_s.pgmというファイルに保存してください。基本的に画素をAWK等で加工する解を想定していますが、できる人はImageMagickを使ってもかまいません。また、AWK等で処理する場合、できる人はforやwhile文を使わないでやってみましょう。

  • 図: 解像度を下げる前後の地図

解答例

$ convert house.pgm -compress None - | awk 'NR>=6' | sed 's/ /\n/g' |
awk NF | paste - - | awk '{print ($1<$2?$1:$2)}' | xargs -n 192 |
rs -T | sed 's/ /\n/g' | awk NF | paste - - |
awk '{print ($1<$2?$1:$2)}' | xargs -n 192 | rs -T |
cat <(head -n 4 house.pgm ) - | sed '1s/P5/P2/' | sed 2d |
sed '2s/384/192/g' > house_s.pgm

Q7

a^3 + b^3 = 6963472309248a <= bとなる整数の組(a,b)を全て求めてください。できる人は、48988659276962496に対して同様に(a,b)を求めてください(桁落ち注意)。

  • 参考

解答例

桁落ちの心配のないもの。



prev:日記(2021年10月7日) next:jus共催 第56回シェル芸勉強会リンク集





このサイトではGoogle Analyticsやその他ソーシャルボタンのためにCookieを使用しています。もし同意いただけない場合はブラウザでクッキーを無効にして閲覧をお願いします。This site uses cookies for Google AdSense and some social buttons. If you cannot accept our use of cookies, please disable cookies on your browser.