Skip to content

Instantly share code, notes, and snippets.

@sjml
Last active December 8, 2019 17:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sjml/dfeb1cdcd56a0fea447bdc4e344b944a to your computer and use it in GitHub Desktop.
Save sjml/dfeb1cdcd56a0fea447bdc4e344b944a to your computer and use it in GitHub Desktop.
Output solutions for the Fourier transform puzzles in Assassin's Creed: Brotherhood
# 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