# 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 }