fail_strings = r"""
ami
café
chapeau
concert
crayon
garage
garçon
lit
livre
mari
musée
oncle
ordinateur
pantalon
piano
pique-nique
portable
père
sandwich
saxophone
stade
stylo
théâtre
téléphone
voisin
""".strip().split()
pass_strings = r"""
botte
boum
chaise
chaussette
chemise
clarinette
copine
femme
fille
glace
heure
lampe
maison
montagne
personne
piscine
pizza
radio
raquette
salade
souris
sœur
table
télé
voiture
""".strip().split()
def convert(strings):
def f(s):
n = 1
for c in s:
n*=ord(c)
return n
return list(map(f, strings))
a = convert(pass_strings)
b = convert(fail_strings)
def solve(list1, list2, x=[]):
found = True
for i in range(1, min(256, max(list1), max(list2))):
f = lambda x: x%i
set1 = set(map(f, list1))
set2 = set(map(f, list2))
if not set1 & set2:
solve(set1, set2, x+[i])
found = False
if found:
if min(len(list1), len(list2)) < 4:
print(list1, list2, x)
solve(a, b)
ZmFpbF9zdHJpbmdzID0gciIiIgphbWkKY2Fmw6kKY2hhcGVhdQpjb25jZXJ0CmNyYXlvbgpnYXJhZ2UKZ2Fyw6dvbgpsaXQKbGl2cmUKbWFyaQptdXPDqWUKb25jbGUKb3JkaW5hdGV1cgpwYW50YWxvbgpwaWFubwpwaXF1ZS1uaXF1ZQpwb3J0YWJsZQpww6hyZQpzYW5kd2ljaApzYXhvcGhvbmUKc3RhZGUKc3R5bG8KdGjDqcOidHJlCnTDqWzDqXBob25lCnZvaXNpbgoiIiIuc3RyaXAoKS5zcGxpdCgpCgpwYXNzX3N0cmluZ3MgPSByIiIiCmJvdHRlCmJvdW0KY2hhaXNlCmNoYXVzc2V0dGUKY2hlbWlzZQpjbGFyaW5ldHRlCmNvcGluZQpmZW1tZQpmaWxsZQpnbGFjZQpoZXVyZQpsYW1wZQptYWlzb24KbW9udGFnbmUKcGVyc29ubmUKcGlzY2luZQpwaXp6YQpyYWRpbwpyYXF1ZXR0ZQpzYWxhZGUKc291cmlzCnPFk3VyCnRhYmxlCnTDqWzDqQp2b2l0dXJlCiIiIi5zdHJpcCgpLnNwbGl0KCkKCmRlZiBjb252ZXJ0KHN0cmluZ3MpOgogICAgZGVmIGYocyk6CiAgICAgICAgbiA9IDEKCiAgICAgICAgZm9yIGMgaW4gczoKICAgICAgICAgICAgbio9b3JkKGMpCgogICAgICAgIHJldHVybiBuCgogICAgcmV0dXJuIGxpc3QobWFwKGYsIHN0cmluZ3MpKQoKYSA9IGNvbnZlcnQocGFzc19zdHJpbmdzKQpiID0gY29udmVydChmYWlsX3N0cmluZ3MpCgpkZWYgc29sdmUobGlzdDEsIGxpc3QyLCB4PVtdKToKICAgIGZvdW5kID0gVHJ1ZQogICAgCiAgICBmb3IgaSBpbiByYW5nZSgxLCBtaW4oMjU2LCBtYXgobGlzdDEpLCBtYXgobGlzdDIpKSk6CiAgICAgICAgZiA9IGxhbWJkYSB4OiB4JWkKCiAgICAgICAgc2V0MSA9IHNldChtYXAoZiwgbGlzdDEpKQogICAgICAgIHNldDIgPSBzZXQobWFwKGYsIGxpc3QyKSkKICAgICAgICAKICAgICAgICBpZiBub3Qgc2V0MSAmIHNldDI6CiAgICAgICAgICAgIHNvbHZlKHNldDEsIHNldDIsIHgrW2ldKQogICAgICAgICAgICBmb3VuZCA9IEZhbHNlCgogICAgaWYgZm91bmQ6CiAgICAgICAgaWYgbWluKGxlbihsaXN0MSksIGxlbihsaXN0MikpIDwgNDoKICAgICAgICAgICAgcHJpbnQobGlzdDEsIGxpc3QyLCB4KQoKc29sdmUoYSwgYik=