advent-of-code/12021/10/10_2.awk

51 lines
754 B
Awk

function push( c ){
sp++
stack[sp] = c
}
function pop(){
sp--
return stack[sp+1]
}
function peek(){
return stack[sp]
}
BEGIN{
FS = ""
sp = 0
scorep = 1
}
{
corrupted = 0
for(i=1;i<=NF;i++){
t = peek()
if($i=="(" || $i=="[" || $i=="{" || $i=="<"){
push($i)
}
else{
if(i<NF && (($i==")"&&t!="(") || ($i=="]" && t!="[") || ($i=="}" && t!="{") || ($i==">" && t!="<" ))){
# print NR, "corrupted", $i, i
corrupted = 1
break
}
else pop()
}
}
if(!corrupted){
score = 0
for(i=sp;i>0;i--){
score *= 5
v = stack[i]
score += (v=="(") ? 1 : v=="[" ? 2 : v=="{" ? 3 : 4
}
scores[scorep++] = score
# print score
}
delete stack
sp = 0
}
END{
asort(scores)
# print length(scores), scorep
print scores[ scorep/2 ]
}