本を読む

読書やコンピュータなどに関するメモ

「第12回本当は怖くないシェル芸勉強会」の問題を試してみた

 TODO山積みなんですが、なんか現実逃避で「【問題だけ】第12回本当は怖くないシェル芸勉強会 | 上田ブログ」の問題を試してみました。

 環境はLinux + bash。とりあえずawkやそれより高機能なツールは使わない方針でやってみました。しかし、なんかスマートじゃない。

Q1

$ for i in {10..0} {1..10}; do printf '%*s%*s%*s\n' $((10-i)) '' -$i x $((i+1)) x; done | sed -e 's/xx/x/'
x                   x
 x                 x
  x               x
   x             x
    x           x
     x         x
      x       x
       x     x
        x   x
         x x
          x
         x x
        x   x
       x     x
      x       x
     x         x
    x           x
   x             x
  x               x
 x                 x
x                   x

Q2

$ echo 'たけやぶ' | (read x; echo -n ${x:0:-1}; rev<<<$x)
たけやぶやけた
$ while read x; do echo -n ${x:0:-1}; rev<<<$x; done < kaibun
たけやぶやけた
わたしまけましたわ

 追記:全部sedでやると、こうか。

$ echo 'たけやぶ' | sed -e 'h;s/.$/:/;:a;s/^\([^:]\)\(.*\):/\2:\1/;t a;x;G;s/[\n:]//g'
たけやぶやけた

Q3

 パス。というかこの問題があったの、今気がつきました。

Q4

$ curl -s http://elze.tanosii.net/d/kenmei.htm | nkf -wd | sed -ne '/^   <TD>/{s///;s/(.*//;p}' | grep -f pref
青森県
群馬県
大阪府
鹿児島県

Q5

$ while read x; do (sed -e 's/ .*//'<<<$x; sed -e 's/^..//'<<<$x | tr ' ' '\n' | sort -nr) | tr '\n' ' '; echo; done < input
A 1234 31 4 -42 
B 94 31.1 10 -34 

Q6

$ while read n; do printf '%2d ' $n; printf '%*s\n' $n '' | tr ' ' '*'; done < num
 5 *****
 3 ***
 4 ****
10 **********
 2 **

 追記:pure bashだとこうか。

$ while read n; do printf '%2d ' $n; printf -v b '%*s' $n ''; echo "${b// /*}"; done < num
 5 *****
 3 ***
 4 ****
10 **********
 2 **

Q7

 パス。

Q8

$ while read x y; do if (($(eval echo "\$(($y))") > 0)); then echo $x; else rev<<<$x; fi; done < result > /tmp/r
$ (sed -e 's/-.*//' < /tmp/r ; echo -e "A\nB\nC") | sort | uniq -c > /tmp/r1
$ (sed -e 's/.*-//' < /tmp/r ; echo -e "A\nB\nC") | sort | uniq -c > /tmp/r2
$ join -j 2 -a 1 -a 2 /tmp/r1 /tmp/r2 | while read t k m; do echo $t $((k - 1)) $((m - 1)); done
A 0 3
B 3 1
C 2 1

 ちと苦しい。

 追記:解答例の出力フォーマットを見ると、これでもよさそう。あいかわらず苦しい感じですが。

$ while read x y; do if (($(eval echo "\$(($y))") > 0)); then echo $x; else rev<<<$x; fi; done < result > /tmp/r
$ (cut -d - -f 1 /tmp/r | sort | uniq -c | sed 's/ *\(.\) \(.\)/\2 \1勝/'; cut -d - -f 2 /tmp/r | sort | uniq -c | sed 's/ *\(.\) \(.\)/\2 \1負/') | sort
A 3負
B 1負
B 3勝
C 1負
C 2勝

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/1252-a9afb574

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad