| @@ -0,0 +1,30 @@ | |||
| def valid_z1s(z2, w, c1, c2, c3): | |||
| valid = {(z2 - w - c3) // 26} | {(z2 * 26 + i) for i in range(26)} | |||
| for z1 in valid: | |||
| if z1 < 26 ** exp: | |||
| if evolve(z1, w, c1, c2, c3) == z2: | |||
| yield z1 | |||
| def evolve(z, w, c1, c2, c3): | |||
| return (z // c1) if (z % 26 + c2 == w) else (z * 26 + w + c3) | |||
| consts = [ | |||
| (int(els[4]), int(els[5]), int(els[15])) | |||
| for block in open(0).read().split('inp w')[1:] | |||
| for els in [[ln.split()[-1] for ln in block.splitlines()]] | |||
| ] | |||
| state = [('', 0)] | |||
| for exp, (c1, c2, c3) in list(enumerate(consts, 1))[::-1]: | |||
| print(exp, len(state)) | |||
| state = [ | |||
| (w + s, z1) | |||
| for s, z2 in state | |||
| for w in '123456789' | |||
| for z1 in valid_z1s(z2, int(w), c1, c2, c3) | |||
| ] | |||
| (head, _), *body, (tail, _) = sorted(state) | |||
| print(tail) | |||
| print(head) | |||