Initial release
This commit is contained in:
164
SW VI Les Ewoks sont tous copains.py
Normal file
164
SW VI Les Ewoks sont tous copains.py
Normal file
@@ -0,0 +1,164 @@
|
||||
from itertools import product
|
||||
|
||||
input = open("AmisEwoks.txt").read().splitlines()
|
||||
|
||||
#list of ewoks
|
||||
table = dict()
|
||||
#list of direct links
|
||||
couples = list()
|
||||
print("d =", 0)
|
||||
for i in input:
|
||||
a,b = i.split(",")
|
||||
a = a.strip()
|
||||
b = b.strip()
|
||||
if a not in table:
|
||||
table[a] = dict()
|
||||
table[a][a] = 0
|
||||
if b not in table:
|
||||
table[b] = dict()
|
||||
table[b][b] = 0
|
||||
couples.append((a,b))
|
||||
print("\t", "new links:", len(table))
|
||||
|
||||
print("d =", 1)
|
||||
for ewok in table:
|
||||
for couple in couples:
|
||||
if couple[0] == ewok:
|
||||
table[ewok][couple[1]] = 1
|
||||
table[couple[1]][ewok] = 1
|
||||
if couple[0] == ewok:
|
||||
table[ewok][couple[0]] = 1
|
||||
table[couple[0]][ewok] = 1
|
||||
print("\t", "new links:", len(couples))
|
||||
|
||||
#find new links, 8 times as we know that the farest eworks are d = 8
|
||||
max_d = 0
|
||||
for i in range(3):
|
||||
print("d =", i+2)
|
||||
new_links = dict()
|
||||
for ewok1 in table:
|
||||
couples_knowing_ewok1 = list(product(table[ewok1].keys(), repeat=2))
|
||||
for couple in couples_knowing_ewok1:
|
||||
a = couple[0]
|
||||
b = couple[1]
|
||||
da = table[ewok1][a]
|
||||
db = table[ewok1][a]
|
||||
if (a,b) not in new_links and (b,a) not in new_links and a not in table[b]:
|
||||
new_links[(a,b)]=da+db
|
||||
max_d = max(max_d, da+db)
|
||||
elif (a,b) in new_links:
|
||||
new_links[(a,b)]=min(da+db, new_links[(a,b)])
|
||||
elif (b,a) in new_links:
|
||||
new_links[(b,a)]=min(da+db, new_links[(b,a)])
|
||||
|
||||
#Add new lins to the table
|
||||
print("\t", "new links:", len(new_links))
|
||||
for c1, c2 in new_links:
|
||||
table[c1][c2] = new_links[(c1,c2)]
|
||||
table[c2][c1] = new_links[(c1,c2)]
|
||||
|
||||
nb_links = 0
|
||||
for ewok1 in table:
|
||||
for ewok2 in table[ewok1]:
|
||||
nb_links += 1
|
||||
print("nb_links", nb_links)
|
||||
print("max_d", max_d)
|
||||
|
||||
solution = dict()
|
||||
for ewok1 in table:
|
||||
for ewok2 in table[ewok1]:
|
||||
if table[ewok1][ewok2] == max_d:
|
||||
solution[ewok1] = None
|
||||
solution[ewok2] = None
|
||||
print('"' + '", "'.join(solution.keys())+ '"')
|
||||
|
||||
"""
|
||||
input = sorted(input)
|
||||
|
||||
solutions = dict()
|
||||
|
||||
ewoks = list()
|
||||
couples = list()
|
||||
for i in input:
|
||||
a,b = i.split(",")
|
||||
couples.append((a.strip(), b.strip()))
|
||||
solutions[(a.strip(), b.strip())] = 1
|
||||
if a not in ewoks:
|
||||
ewoks.append(a)
|
||||
if b not in ewoks:
|
||||
ewoks.append(b)
|
||||
|
||||
# for i in range(len(ewoks)):
|
||||
for i in range(len(ewoks)):
|
||||
for j in range(i+1, len(ewoks)):
|
||||
start = ewoks[i]
|
||||
stop = ewoks[j]
|
||||
|
||||
if (start, stop) in solutions or (stop, start) in solutions:
|
||||
print("X", end='')
|
||||
continue
|
||||
chains = [[start,]]
|
||||
found = False
|
||||
while not found:
|
||||
print(".", end='')
|
||||
for chain in chains:
|
||||
latest = chain[-1]
|
||||
nexts = list()
|
||||
#cherche les nouveaux contacts
|
||||
for c in couples:
|
||||
if latest==c[0] and c[1] not in nexts:
|
||||
nexts.append(c[1])
|
||||
elif latest==c[1] and c[0] not in nexts:
|
||||
nexts.append(c[0])
|
||||
#Supprime les nouveaux contacts déjà présents dans la chaine
|
||||
for maillon in chain:
|
||||
if maillon in nexts:
|
||||
nexts.remove(maillon)
|
||||
#Ajoute la liste de nouveaux contacts à la chaine
|
||||
chain.append(nexts)
|
||||
#Creation d'une nouvelle chaine pour optimiser la suite en évitant des boucles
|
||||
new_chains = list()
|
||||
#Pour chaque chaine
|
||||
for chain in chains:
|
||||
#Si le chaine se termine par une liste de contact
|
||||
if isinstance(chain[-1], list):
|
||||
#Crée une liste de contacts à garder
|
||||
children = list()
|
||||
#Pour chaque nouveau contact
|
||||
for child in chain[-1]:
|
||||
#On vérifie qu'ion n'est pas présent dans une autre chaine
|
||||
for other_chain in chains:
|
||||
#Si pas déjà présent, on le garde
|
||||
if child not in other_chain and child not in children:
|
||||
children.append(child)
|
||||
#Pour chaque contact à garder, on crée une nouvelle chaine égale à l'ancienne + le nouveau contact
|
||||
for child in children:
|
||||
new_chains.append(chain[:-1]+[child,])
|
||||
#La chaine ne se termine pas par une liste, c'est un cul de sac
|
||||
else:
|
||||
# new_chains.append(chain)
|
||||
pass
|
||||
#chains est maintenant égal à la nouvelle chain
|
||||
chains = new_chains
|
||||
#Si la cible est dans une chaine, c'est gagné!
|
||||
for chain in chains:
|
||||
if stop in chain:
|
||||
solution = chain
|
||||
found = True
|
||||
|
||||
#On popule la liste de résultats avec tous les éléments de la chaine
|
||||
for a in range(len(chain)):
|
||||
for b in range(len(chain)):
|
||||
coup = (chain[a],chain[b])
|
||||
dist = abs(b-a)
|
||||
solutions[coup] = dist
|
||||
print(len(solutions), coup, ":", dist)
|
||||
|
||||
# print()
|
||||
# for k in solutions:
|
||||
# print(k, solutions[k])
|
||||
|
||||
for res in solutions:
|
||||
if solutions[res]>=8:
|
||||
print(res)
|
||||
"""
|
||||
Reference in New Issue
Block a user