計算機設定記録

パソコンの設定やトラブルシューティング

LL DECADE 君ならどう書くONLINE

 Lightweight Languageイベント「LL DECADE」というのが今日あったらしい。そこでその場でコードを書くイベントがあってなんかもらえたそうなのだが、行かれぬから!

君ならどう書く Online | 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スクリプトを吐き出してそれを実行するという手順。一時間かかった。