advent-of-code/12021/03/03_2_new.awk

48 lines
890 B
Awk

function bin2num( s ){
num = 0
for(i=1;i<=length(s);i++)
num += lshift( substr(s,i,1), length(s)-i)
return num
}
BEGIN{ FS="" }
{
a[NR] = $0
b[NR] = $0
count += $1
}
END{
bita = count>=NR/2
bitb = ! bita
for(nbit = 1; nbit<=NF; nbit++){
if (length(a)>1) delete sela
if (length(b)>1) delete selb
pa = 1; pb=1
counta = 0; countb = 0
for(i=1; i<=length(a); i++){
if( substr(a[i],nbit,1) == bita ){
sela[pa++] = a[i]
counta += substr(a[i],nbit+1,1)
}
}
for(i=1; i<=length(b); i++){
if( substr(b[i],nbit,1) == bitb ){
selb[pb++] = b[i]
countb += substr(b[i],nbit+1,1)
}
}
bita = counta>=(length(sela)/2)
bitb = countb<(length(selb)/2)
delete a; delete b;
for(i=1; i<=length(sela); i++) a[i] = sela[i]
for(i=1; i<=length(selb); i++) b[i] = selb[i]
}
oxy = bin2num(sela[1])
co2 = bin2num(selb[1])
print oxy, co2, oxy*co2
}