Compare commits

...

4 Commits

Author SHA1 Message Date
sejo 2a74970967 part 1 and 2 in the same file 2021-12-16 01:24:20 -06:00
sejo b02687f338 day 16, pt 2! 2021-12-16 01:22:07 -06:00
sejo 22835f64df almost working pt 2 2021-12-16 01:11:32 -06:00
sejo 1c0c03a99e working day 16, pt 1 2021-12-16 01:07:00 -06:00
3 changed files with 241 additions and 0 deletions

78
16/16.awk Normal file
View File

@ -0,0 +1,78 @@
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
}

149
16/16_2.awk Normal file
View File

@ -0,0 +1,149 @@
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
}
function operate(n){
delete val
sum = 0; prod=1; min=lit[litsp]; max=0;
for(i=1;i<=n;i++){
val[i] = lit[litsp--]
sum += val[i]
prod *= val[i]
if(val[i]<min) min = val[i]
if(val[i]>max) max = val[i]
}
op = ops[osp--]
if(op==0) result = sum
if(op==1) result = prod
if(op==2) result = min
if(op==3) result = max
if(op==5) result = (val[2]>val[1])
if(op==6) result = (val[2]<val[1])
if(op==7) result = (val[2]==val[1])
lit[++litsp] = result
print "operation",op,"with",n,"values; result",result,"(litsp",litsp,")"
}
function subbits(n){
# print "minus", n, "bits"
for(i=1;i<=b2csp;i++){
b2c[i] -= n
}
}
{
p = strtobin($0)
# print p
}
END{
versionc = 0
checkbits = 0
checknsub = 0
litsp = 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 "---------------"
print "packet typeid", typeid
if(b2csp>0 && checkbits){
print "bits to check",b2c[b2csp]
subbits( 6 )
}
if(s2csp>0 && checknsub && check[checksp]=="n"){
print "subpackets to check:", s2c[s2csp]
s2c[s2csp]--;
}
if(typeid == 4){
print "literal"
pnum = ""
do{
startbit = substr(p,1,1)
num = substr(p,2,4)
p = substr(p,6)
if(b2csp>0 && checkbits) subbits( 5 )
# print startbit, num
pnum = pnum num
}while(startbit==1)
rnum = bin2num(pnum)
lit[++litsp] = rnum
print "value:", rnum, "litsp",litsp
}
else{
print "operator", typeid
ops[++osp] = typeid
lengthid = substr(p,1,1)
p = substr(p,2)
if(lengthid==0){
len = bin2num( substr(p,1,15) )
if(b2csp>0 && checkbits) subbits( 16 )
print "len bits to check",len, litsp
b2c[++b2csp] = len
litsv[++litsvsp] = litsp
check[++checksp] = "b"
checkbits = 1
p = substr(p,16)
}
else{ #lengthid == 1
nsub = bin2num( substr(p,1,11) )
if(b2csp>0 && checkbits) subbits( 12 )
s2c[++s2csp] = nsub
nsubs[++nsubssp] = nsub
check[++checksp] = "n"
checknsub = 1
print "n subpackets", nsub
p = substr(p,12)
}
} #end operator
while((check[checksp]=="n" && checknsub && s2c[s2csp]==0) || (check[checksp]=="b" && checkbits && b2c[b2csp]==0)){
if(check[checksp]=="n" && s2c[s2csp]==0 && checknsub ){
n = nsubs[nsubssp--]; n2csp--;
if(--s2csp==0) checknsub=0;
checksp--;
print "nsub done", n, s2csp
operate(n)
}
else if( check[checksp]=="b" && b2c[b2csp]==0 && checkbits ){
print "bits done"; b2csp--;
if(b2csp==0) checkbits=0;
checksp--;
n = litsp-litsv[litsvsp--]
operate(n)
}
}
}
print "pt1 sum of versions:", versionc
}

14
16/Makefile Normal file
View File

@ -0,0 +1,14 @@
1t:
awk -f 16.awk test
1i:
awk -f 16.awk input
2t:
awk -f 16_2.awk test
2i:
awk -f 16_2.awk input
paste:
xclip -sel c -o > test