LL DECADE 君ならどう書くONLINE
Lightweight Languageイベント「LL DECADE」というのが今日あったらしい。そこでその場でコードを書くイベントがあってなんかもらえたそうなのだが、行かれぬから!
問題はこちら:
君ならどう書く Online 問題文 | LL Decade
awkで書いてみた。
#! /usr/local/bin/gawk -f BEGIN{ B2H["0000"]="0" B2H["0001"]="1" B2H["0010"]="2" B2H["0011"]="3" B2H["0100"]="4" B2H["0101"]="5" B2H["0110"]="6" B2H["0111"]="7" B2H["1000"]="8" B2H["1001"]="9" B2H["1010"]="A" B2H["1011"]="B" B2H["1100"]="C" B2H["1101"]="D" B2H["1110"]="E" B2H["1111"]="F" N255 = "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" IPV4 = "^" N255 "\\." N255 "\\." N255 "\\." N255 "$" H = "[0-9A-Fa-f]" h = "[1-9A-Fa-f]" H02= H H MACa = "^" H02 "-" H02 "-" H02 "-" H02 "-" H02 "-" H02 "$" MACb = "^" H02 ":" H02 ":" H02 ":" H02 ":" H02 ":" H02 "$" H4="(" H "|" h H "|" h H H "|" h H H H ")" IPV6 = "^" H4 ":" H4 ":" H4 ":" H4 ":" H4 ":" H4 ":" H4 ":" H4 "$" ANS="" } $0~MACa { # print "MACa" ANS = ANS "00" next } $0~MACb { # print "MACb" ANS = ANS "00" next } $0~IPV4 { # print "IPV4" ANS = ANS "01" next } $0~IPV6 { # print "IPV6" ANS = ANS "10" next } { # print "X" ANS = ANS "11" } END{ # print ANS HEXANS=bin2hex(ANS) # print HEXANS printhex2asc(HEXANS) } func bin2hex(str ,r,i) { r="" for(i=1;i<=length(str);i+=4) { r = r B2H[substr(str,i,4)] } return r } func printhex2asc(str ,r,i,s,tmp) { tmp="tmpfile" print "BEGIN{" > tmp r="" for(i=1;i<=length(str);i+=2) { r = "\\x" substr(str,i,2) print "printf(\"" r "\")" >> tmp } print "print \"\" }" >> tmp s = "gawk -f " tmp system(s) }
大きく3つの機能。1つめは正規表現でIPv4/IPv6/MAC/その他を引っ掛ける。次に2進→16進変換を連想配列で処理。そして得られた16進をASCIIコードに変換したいのだが、16進リテラルをASCII文字で表示するのに変数がうまく使えなかったので(私が知らないだけかも)awkのスクリプトを吐き出してそれを実行するという手順。一時間かかった。