labunix's blog

labunixのラボUnix

「第12回本当は怖くないシェル芸勉強会」を解いてみた

■「第12回本当は怖くないシェル芸勉強会」を解いてみた

 シェル芸、チョットデキルかも知れない。

 【問題と解答例】第12回本当は怖くないシェル芸勉強会
 http://blog.ueda.asia/?p=3535

■Q1 画面にバッテンを描いて下さい。
 九九って分かりやすいですよね。

$ for n in `seq 1 9`;do \
    for m in `seq 1 9`;do \
      if [ $n -eq $m ];then \
        echo -n "XX"; \
      else \
        echo "$m $n" | awk '{if((10-$1)==$2){printf "XX"}else{printf "%02d",$1*$2}}';fi | \
          sed s/"[0-9][0-9]"/" "/g | sed s/"XX"/"X"/g; \
    done;echo; \
  done
X       X
 X     X 
  X   X  
   X X   
    X    
   X X   
  X   X  
 X     X 
X       X

$ for n in `seq 1 9`;do \
    for m in `seq 1 9`;do \
      if [ $n -eq $m ];then \
        echo -n "XX"; \
      else \
        echo "$m $n" | awk '{if((10-$1)==$2){printf "XX"}else{printf "%02d",$1*$2}}';fi | \
          sed s/"[0-9][0-9]"/"  "/g | sed s/"XX"/" X"/g; \
    done;echo; \
  done
 X               X
   X           X  
     X       X    
       X   X      
         X        
       X   X      
     X       X    
   X           X  
 X               X

$ for n in `seq 1 9`;do \
    for m in `seq 1 9`;do \
      if [ $n -eq $m ];then \
        echo -n "XX"; \
      else \
        echo "$m $n" | awk '{if((10-$1)==$2){printf "XX"}else{printf "%02d",$1*$2}}';fi | \
          sed s/"[0-9][0-9]"/"   "/g | sed s/"XX"/"  X"/g; \
    done;echo; \
  done
  X                       X
     X                 X   
        X           X      
           X     X         
              X            
           X     X         
        X           X      
     X                 X   
  X                       X


■余談 普通の九九表。

$ for n in `seq 1 9`;do \
    for m in `seq 1 9`;do \
      echo "$m $n" | awk '{printf "%3d",$1*$2}'; \
    done;echo; \
  done
  1  2  3  4  5  6  7  8  9
  2  4  6  8 10 12 14 16 18
  3  6  9 12 15 18 21 24 27
  4  8 12 16 20 24 28 32 36
  5 10 15 20 25 30 35 40 45
  6 12 18 24 30 36 42 48 54
  7 14 21 28 35 42 49 56 63
  8 16 24 32 40 48 56 64 72
  9 18 27 36 45 54 63 72 81

■Q2 小問1. 次のechoの出力から回文を完成させてください。

$ echo -n $(Xarray=(`echo "たけやぶ" | sed s/"."/" &"/g`); \
            for n in `seq 0 $((${#Xarray[*]}-1))`;do \
              echo ${Xarray[$n]}; \
            done; \
            for m in `seq $((${#Xarray[*]}-2)) -1 0`;do \
              echo ${Xarray[$m]}; \
            done) | tr -d ' ';echo
たけやぶやけた

■小問2. 次のファイルの各行について回文を完成させてください。
 あ、一般化するの早すぎたw。。。

$ cat kaibun 
たけやぶ
わたしまけ

$ cat kaibun | \
  for list in `xargs`;do echo -n $(Xarray=(`echo "$list" | sed s/"."/" &"/g`); \
    for n in `seq 0 $((${#Xarray[*]}-1))`;do \
      echo ${Xarray[$n]}; \
    done; \
    for m in `seq $((${#Xarray[*]}-2)) -1 0`;do \
      echo ${Xarray[$m]}; \
    done) | tr -d ' ';echo; \
  done
たけやぶやけた
わたしまけましたわ

■Q3 ウェブ等からデータを取得して南武線の駅名のリストを作ってください。
 これで合ってるかどうかは分からない。

$ wget -O - "http://ja.wikipedia.org/wiki/%E5%8D%97%E6%AD%A6%E7%B7%9A" 2>&1 | \
    grep "<td><a href=\"/wiki/.*title=" | grep "駅</a></td>\$" | sed s%^.*title=\"%% | \
    awk -F\" '{print $1}' | awk '{if(NR%10==0){print $0}else{printf "%s,",$0}}';echo
川崎駅,尻手駅,矢向駅,鹿島田駅,平間駅,向河原駅,武蔵小杉駅,武蔵中原駅,武蔵新城駅,武蔵溝ノ口駅
津田山駅,久地駅,宿河原駅,中野島駅,稲田堤駅,京王稲田堤駅,矢野口駅,稲城長沼駅,南多摩駅,是政駅
府中本町駅,分倍河原駅,西府駅,谷保駅,矢川駅,西国立駅,立川駅,尻手駅,八丁畷駅,川崎新町駅
浜川崎駅,尻手駅,鶴見駅,

■Q4 北から順(正確には都道府県番号順)に並べてください。
 順番はISO規格です。

$ cat pref
鹿児島県
青森県
大阪府
群馬県

$ w3m -dump "http://ja.wikipedia.org/wiki/ISO_3166-2:JP" 2>&1 | \
  grep "都\|道\|府\|県" | grep -f pref | sed s/".* の旗"//g
青森県
群馬県
大阪府
鹿児島県

■Q5 各行の数字を大きい順にソートしてください。

$ cat input 
A 31 1234 -42 4
B 10 31.1 -34 94

$ cat input | while read list;do \
    echo -n "$list" | sed s/"[0-9]\|\-\|\."//g; \
    echo "$list" | tr -d '[A-Z]' | sed s/" "/"\n"/g | sort -n | xargs echo -n;echo; \
  done
A    -42 4 31 1234
B    -34 10 31.1 94

■Q6 次のファイルについてグラフを作ってください。

$ cat num | \
  while read list;do \
    echo "$list" | awk '{printf "%2d ",$1}'; \
    for n in `seq 1 $list`;do echo -n "*";done;echo; \
  done
 5 *****
 3 ***
 4 ****
10 **********
 2 **

■Q7 Q6のグラフを次のように縦にしてください。

$ Xarray=(`cat num`); \
  for m in `seq 0 12`;do \
    for n in $(seq 0 $((`cat num | wc -l`-1)));do \
      if [ "${Xarray[$n]}" -gt "$m" ];then \
        echo -n " o"; \
      else \
        echo -n "  "; \
      fi; \
    done;echo; \
  done | tac;cat num | xargs echo -n;echo

          
          
          
       o  
       o  
       o  
       o  
       o  
 o     o  
 o   o o  
 o o o o  
 o o o o o
 o o o o o
5 3 4 10 2

■Q8 次のデータは、何かの試合の結果ですが、各チームが何勝何敗だったかを集計してください。引き分けは無いと仮定して構いません。

$ cat result 
A-B 1-2
B-A 3-1
C-A 1-0
B-C 5-4
C-B 2-1

$ sed s/"-"/" "/g result | \
    awk '{if($3>$4){print $1,"W\n"$2,"L"}else{print $2,"W\n"$1,"L"}}' | \
    sort | uniq -c | \
    awk '{if ($3=="L"){print $2,$1"負"}else{print $2,$1"勝"}}'
A 3負
B 1負
B 3勝
C 1負
C 2勝