adventofcode2022/day05/sol.awk

61 lines
1.4 KiB
Awk

# run me with awk -f sol.awk < input
/\[/ { # " [A] [B] [C] "
gsub("^ ", "[ ]") # "[ ] [A] [B] [C] "
gsub(" {4}", " [ ]") # "[ ] [A] [ ] [B] [C] [ ]"
gsub("^\\[|\\] \\[|\\]$", "") # " A BC "
lines[nlines++] = $0
if (nstacks < length())
nstacks = length()
}
/^$/ {
# transpose lines[j][i] -> stack[i][-j]
# and strip trailing spaces
for (i = 1; i <= nstacks; i++) {
s = ""
for (j = nlines-1; j >= 0; j--) {
c = substr(lines[j], i, 1)
if (c != " ") s = s c
}
stack[i] = s
stack2[i] = s
print s "."
}
print "----"
}
function reverse(s) {
r = ""
for (i = length(s); i > 0; i--)
r = r substr(s, i, 1)
return r
}
function move(S, n, fr, to, flip) {
#print n, fr, to
m = length(S[fr]) - n
if (flip) chunk = reverse(substr(S[fr], m+1))
else chunk = substr(S[fr], m+1)
#print stack[to]
#print stack[fr]
S[to] = S[to] chunk
S[fr] = substr(S[fr], 1, m)
#print stack[to]
#print stack[fr]
}
/^move .* from .* to .*/ {
move(stack, $2, $4, $6, 1)
move(stack2, $2, $4, $6, 0)
}
END {
for (i = 1; i <= nstacks; i++) {
p1 = p1 substr(stack[i], length(stack[i]))
p2 = p2 substr(stack2[i], length(stack2[i]))
}
print p1
print p2
}