Last active
December 8, 2019 17:35
-
-
Save sjml/dfeb1cdcd56a0fea447bdc4e344b944a to your computer and use it in GitHub Desktop.
Output solutions for the Fourier transform puzzles in Assassin's Creed: Brotherhood
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Assassin's Creed Brotherhood has these silly fourier transform puzzles. | |
# Cluster 9 was bothering me so instead of solving it, I wrote this | |
# program to solve all of them. | |
# | |
# This was not the best use of my time, but I enjoyed it more than | |
# I did *actually* solving the puzzles, so who is the winner now?! | |
# | |
# Output at the bottom. | |
import itertools | |
from collections import OrderedDict | |
clusters = OrderedDict() | |
clusters["Cluster 4"] = { | |
"goal": [ 1, -2, 3, -1], | |
"components": { | |
"A1": [-1, 2, -1, 2], | |
"B1": [ 2, -4, 4, -3], | |
"C1": [ 3, -2, 1, -2], | |
} | |
} | |
clusters["Cluster 6"] = { | |
"goal": [ 4, -1, 0, -3], | |
"components": { | |
"A1": [ 3, -3, 2, -3], | |
"B1": [ 0, 4, -3, 3], | |
"C1": [ 4, -2, 1, -2], | |
"A2": [ 1, -2, 1, -3], | |
"B2": [ 1, -4, 2, 1], | |
"C2": [-2, 3, -1, 2], | |
} | |
} | |
clusters["Cluster 9"] = { | |
"goal": [ 0, -1, 3, -2], | |
"components": { | |
"A1": [-1, 0, 0, 0], | |
"B1": [ 0, 0, 0, -2], | |
"C1": [ 1, 0, 0, 2], | |
"A2": [ 0, 2, 0, 3], | |
"B2": [-4, 2, -1, 2], | |
"C2": [ 1, -3, 2, -4], | |
"A3": [ 2, 1, 0, -2], | |
"B3": [ 1, -3, 1, -1], | |
"C3": [-3, 1, -4, 1], | |
"A4": [ 2, -2, 1, -4], | |
"B4": [-3, -2, 3, -2], | |
"C4": [-1, 2, 1, 0], | |
} | |
} | |
clusters["Cluster 10"] = { | |
"goal": [-2, 2, -3, 1], | |
"components": { | |
"A1": [ 1, 0, 1, -2], | |
"B1": [ 4, -2, 3, -4], | |
"C1": [-4, 2, 1, 4], | |
"A2": [-4, 2, -1, 4], | |
"B2": [-1, 0, -2, 1], | |
"C2": [-4, 3, -2, 4], | |
"A3": [-4, 2, 1, -4], | |
"B3": [ 4, -3, 2, -4], | |
"C3": [-1, 1, 2, -3], | |
"A4": [-4, 3, -2, 4], | |
"B4": [ 4, -3, 2, -4], | |
"C4": [ 3, -3, -1, 3], | |
"A5": [-4, 2, -3, 4], | |
"B5": [ 4, -2, -1, 4], | |
"C5": [-1, 2, 1, -1], | |
"A6": [ 4, -2, 1, -4], | |
"B6": [ 4, 2, -1, -4], | |
"C6": [-3, 2, -4, 3], | |
} | |
} | |
def solve(cluster): | |
def sumcomps(comps): | |
sum = [0, 0, 0, 0] | |
for c in comps: | |
sum = [x+y for x, y in zip(sum, c)] | |
return sum | |
goal = cluster["goal"] | |
comps = cluster["components"] | |
working = [] | |
for length in range(len(comps.keys())): | |
combinations = itertools.combinations(comps.keys(), length+1) | |
for comb in combinations: | |
components = [comps[x] for x in comb] | |
if sumcomps(components) == goal: | |
working.append(comb) | |
return working | |
if __name__ == "__main__": | |
print_all = True | |
for name in clusters: | |
solutions = solve(clusters[name]) | |
if len(solutions) == 0: | |
print("%s has no solutions; is data correct?", name) | |
elif len(solutions) == 1: | |
print("%s solution:" % name, solutions[0]) | |
else: | |
solutions.sort(key=len) | |
print("%s has %d solutions; shortest is %s" % (name, len(solutions), str(solutions[0]))) | |
if print_all: | |
print("Other working solutions:") | |
for other in solutions[1:]: | |
print("\t%s" % str(other)) | |
# This program's output: | |
# ---------------------- | |
# Cluster 4 solution: ('A1', 'B1') | |
# Cluster 6 solution: ('A1', 'B1', 'A2') | |
# Cluster 9 has 2 solutions; shortest is ('C1', 'A3', 'B4') | |
# Other working solutions: | |
# ('A1', 'C1', 'C2', 'C4') | |
# Cluster 10 has 96 solutions; shortest is ('A1', 'C6') | |
# Other working solutions: | |
# ('A1', 'B1', 'A5', 'C6') | |
# ('A1', 'A2', 'A6', 'C6') | |
# ('A1', 'C2', 'B3', 'C6') | |
# ('A1', 'C2', 'B4', 'C6') | |
# ('A1', 'A3', 'B5', 'C6') | |
# ('A1', 'B3', 'A4', 'C6') | |
# ('A1', 'A4', 'B4', 'C6') | |
# ('A1', 'B1', 'A2', 'A5', 'A6', 'C6') | |
# ('A1', 'B1', 'C2', 'B3', 'A5', 'C6') | |
# ('A1', 'B1', 'C2', 'B4', 'A5', 'C6') | |
# ('A1', 'B1', 'A3', 'A5', 'B5', 'C6') | |
# ('A1', 'B1', 'B3', 'A4', 'A5', 'C6') | |
# ('A1', 'B1', 'A4', 'B4', 'A5', 'C6') | |
# ('A1', 'A2', 'C2', 'B3', 'A6', 'C6') | |
# ('A1', 'A2', 'C2', 'B4', 'A6', 'C6') | |
# ('A1', 'A2', 'A3', 'B5', 'A6', 'C6') | |
# ('A1', 'A2', 'B3', 'A4', 'A6', 'C6') | |
# ('A1', 'A2', 'A4', 'B4', 'A6', 'C6') | |
# ('A1', 'B2', 'C3', 'C4', 'C5', 'C6') | |
# ('A1', 'C2', 'A3', 'B3', 'B5', 'C6') | |
# ('A1', 'C2', 'A3', 'B4', 'B5', 'C6') | |
# ('A1', 'C2', 'B3', 'A4', 'B4', 'C6') | |
# ('A1', 'A3', 'B3', 'A4', 'B5', 'C6') | |
# ('A1', 'A3', 'A4', 'B4', 'B5', 'C6') | |
# ('A1', 'B1', 'A2', 'C2', 'B3', 'A5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'C2', 'B4', 'A5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'A3', 'A5', 'B5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'B3', 'A4', 'A5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'A4', 'B4', 'A5', 'A6', 'C6') | |
# ('A1', 'B1', 'B2', 'C3', 'C4', 'A5', 'C5', 'C6') | |
# ('A1', 'B1', 'C2', 'A3', 'B3', 'A5', 'B5', 'C6') | |
# ('A1', 'B1', 'C2', 'A3', 'B4', 'A5', 'B5', 'C6') | |
# ('A1', 'B1', 'C2', 'B3', 'A4', 'B4', 'A5', 'C6') | |
# ('A1', 'B1', 'A3', 'B3', 'A4', 'A5', 'B5', 'C6') | |
# ('A1', 'B1', 'A3', 'A4', 'B4', 'A5', 'B5', 'C6') | |
# ('A1', 'A2', 'B2', 'C3', 'C4', 'C5', 'A6', 'C6') | |
# ('A1', 'A2', 'C2', 'A3', 'B3', 'B5', 'A6', 'C6') | |
# ('A1', 'A2', 'C2', 'A3', 'B4', 'B5', 'A6', 'C6') | |
# ('A1', 'A2', 'C2', 'B3', 'A4', 'B4', 'A6', 'C6') | |
# ('A1', 'A2', 'A3', 'B3', 'A4', 'B5', 'A6', 'C6') | |
# ('A1', 'A2', 'A3', 'A4', 'B4', 'B5', 'A6', 'C6') | |
# ('A1', 'B2', 'C2', 'B3', 'C3', 'C4', 'C5', 'C6') | |
# ('A1', 'B2', 'C2', 'C3', 'B4', 'C4', 'C5', 'C6') | |
# ('A1', 'B2', 'A3', 'C3', 'C4', 'B5', 'C5', 'C6') | |
# ('A1', 'B2', 'B3', 'C3', 'A4', 'C4', 'C5', 'C6') | |
# ('A1', 'B2', 'C3', 'A4', 'B4', 'C4', 'C5', 'C6') | |
# ('A1', 'C2', 'A3', 'B3', 'A4', 'B4', 'B5', 'C6') | |
# ('A1', 'B1', 'A2', 'B2', 'C3', 'C4', 'A5', 'C5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'C2', 'A3', 'B3', 'A5', 'B5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'C2', 'A3', 'B4', 'A5', 'B5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'C2', 'B3', 'A4', 'B4', 'A5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'A3', 'B3', 'A4', 'A5', 'B5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'A3', 'A4', 'B4', 'A5', 'B5', 'A6', 'C6') | |
# ('A1', 'B1', 'B2', 'C2', 'B3', 'C3', 'C4', 'A5', 'C5', 'C6') | |
# ('A1', 'B1', 'B2', 'C2', 'C3', 'B4', 'C4', 'A5', 'C5', 'C6') | |
# ('A1', 'B1', 'B2', 'A3', 'C3', 'C4', 'A5', 'B5', 'C5', 'C6') | |
# ('A1', 'B1', 'B2', 'B3', 'C3', 'A4', 'C4', 'A5', 'C5', 'C6') | |
# ('A1', 'B1', 'B2', 'C3', 'A4', 'B4', 'C4', 'A5', 'C5', 'C6') | |
# ('A1', 'B1', 'C2', 'A3', 'B3', 'A4', 'B4', 'A5', 'B5', 'C6') | |
# ('A1', 'A2', 'B2', 'C2', 'B3', 'C3', 'C4', 'C5', 'A6', 'C6') | |
# ('A1', 'A2', 'B2', 'C2', 'C3', 'B4', 'C4', 'C5', 'A6', 'C6') | |
# ('A1', 'A2', 'B2', 'A3', 'C3', 'C4', 'B5', 'C5', 'A6', 'C6') | |
# ('A1', 'A2', 'B2', 'B3', 'C3', 'A4', 'C4', 'C5', 'A6', 'C6') | |
# ('A1', 'A2', 'B2', 'C3', 'A4', 'B4', 'C4', 'C5', 'A6', 'C6') | |
# ('A1', 'A2', 'C2', 'A3', 'B3', 'A4', 'B4', 'B5', 'A6', 'C6') | |
# ('A1', 'B2', 'C2', 'A3', 'B3', 'C3', 'C4', 'B5', 'C5', 'C6') | |
# ('A1', 'B2', 'C2', 'A3', 'C3', 'B4', 'C4', 'B5', 'C5', 'C6') | |
# ('A1', 'B2', 'C2', 'B3', 'C3', 'A4', 'B4', 'C4', 'C5', 'C6') | |
# ('A1', 'B2', 'A3', 'B3', 'C3', 'A4', 'C4', 'B5', 'C5', 'C6') | |
# ('A1', 'B2', 'A3', 'C3', 'A4', 'B4', 'C4', 'B5', 'C5', 'C6') | |
# ('A1', 'B1', 'A2', 'B2', 'C2', 'B3', 'C3', 'C4', 'A5', 'C5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'B2', 'C2', 'C3', 'B4', 'C4', 'A5', 'C5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'B2', 'A3', 'C3', 'C4', 'A5', 'B5', 'C5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'B2', 'B3', 'C3', 'A4', 'C4', 'A5', 'C5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'B2', 'C3', 'A4', 'B4', 'C4', 'A5', 'C5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'C2', 'A3', 'B3', 'A4', 'B4', 'A5', 'B5', 'A6', 'C6') | |
# ('A1', 'B1', 'B2', 'C2', 'A3', 'B3', 'C3', 'C4', 'A5', 'B5', 'C5', 'C6') | |
# ('A1', 'B1', 'B2', 'C2', 'A3', 'C3', 'B4', 'C4', 'A5', 'B5', 'C5', 'C6') | |
# ('A1', 'B1', 'B2', 'C2', 'B3', 'C3', 'A4', 'B4', 'C4', 'A5', 'C5', 'C6') | |
# ('A1', 'B1', 'B2', 'A3', 'B3', 'C3', 'A4', 'C4', 'A5', 'B5', 'C5', 'C6') | |
# ('A1', 'B1', 'B2', 'A3', 'C3', 'A4', 'B4', 'C4', 'A5', 'B5', 'C5', 'C6') | |
# ('A1', 'A2', 'B2', 'C2', 'A3', 'B3', 'C3', 'C4', 'B5', 'C5', 'A6', 'C6') | |
# ('A1', 'A2', 'B2', 'C2', 'A3', 'C3', 'B4', 'C4', 'B5', 'C5', 'A6', 'C6') | |
# ('A1', 'A2', 'B2', 'C2', 'B3', 'C3', 'A4', 'B4', 'C4', 'C5', 'A6', 'C6') | |
# ('A1', 'A2', 'B2', 'A3', 'B3', 'C3', 'A4', 'C4', 'B5', 'C5', 'A6', 'C6') | |
# ('A1', 'A2', 'B2', 'A3', 'C3', 'A4', 'B4', 'C4', 'B5', 'C5', 'A6', 'C6') | |
# ('A1', 'B2', 'C2', 'A3', 'B3', 'C3', 'A4', 'B4', 'C4', 'B5', 'C5', 'C6') | |
# ('A1', 'B1', 'A2', 'B2', 'C2', 'A3', 'B3', 'C3', 'C4', 'A5', 'B5', 'C5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'B2', 'C2', 'A3', 'C3', 'B4', 'C4', 'A5', 'B5', 'C5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'B2', 'C2', 'B3', 'C3', 'A4', 'B4', 'C4', 'A5', 'C5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'B2', 'A3', 'B3', 'C3', 'A4', 'C4', 'A5', 'B5', 'C5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'B2', 'A3', 'C3', 'A4', 'B4', 'C4', 'A5', 'B5', 'C5', 'A6', 'C6') | |
# ('A1', 'B1', 'B2', 'C2', 'A3', 'B3', 'C3', 'A4', 'B4', 'C4', 'A5', 'B5', 'C5', 'C6') | |
# ('A1', 'A2', 'B2', 'C2', 'A3', 'B3', 'C3', 'A4', 'B4', 'C4', 'B5', 'C5', 'A6', 'C6') | |
# ('A1', 'B1', 'A2', 'B2', 'C2', 'A3', 'B3', 'C3', 'A4', 'B4', 'C4', 'A5', 'B5', 'C5', 'A6', 'C6') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment