advent-of-code/12021/16/16.awk

79 lines
1.4 KiB
Awk

function strtobin(s){
bin = ""
for(i=1;i<=length(s);i++){
c = substr(s,i,1)
if(c=="0") b="0000"
if(c=="1") b="0001"
if(c=="2") b="0010"
if(c=="3") b="0011"
if(c=="4") b="0100"
if(c=="5") b="0101"
if(c=="6") b="0110"
if(c=="7") b="0111"
if(c=="8") b="1000"
if(c=="9") b="1001"
if(c=="A") b="1010"
if(c=="B") b="1011"
if(c=="C") b="1100"
if(c=="D") b="1101"
if(c=="E") b="1110"
if(c=="F") b="1111"
bin = bin b
}
return bin
}
function bin2num(b){
num = 0
n=length(b)
for(i=1;i<=n;i++){
bit = substr(b,i,1)
num += lshift(bit,n-i)
}
return num
}
{
p = strtobin($0)
# print p
}
END{
versionc = 0
while( bin2num(p) > 0){
version = bin2num(substr(p,1,3))
versionc += version
p = substr(p,4)
typeid = bin2num( substr(p,1,3) )
p = substr(p,4)
print p, version, typeid
if(typeid == 4){
print "literal"
pnum = ""
do{
startbit = substr(p,1,1)
num = substr(p,2,4)
p = substr(p,6)
print startbit, num
pnum = pnum num
}while(startbit==1)
print "value:", bin2num(pnum)
}
else{
print "operator"
lengthid = substr(p,1,1)
p = substr(p,2)
if(lengthid==0){
len = bin2num( substr(p,1,15) )
print "len",len
p = substr(p,16)
}
else{ #lengthid == 1
nsub = bin2num( substr(p,1,11) )
print "nsub", nsub
p = substr(p,12)
}
} #end operator
}
print "sum of versions:", versionc
}