Untitled
unknown
plain_text
a year ago
3.5 kB
7
Indexable
import itertools
def foo(a,b,c):
# a - всегда самая длинная из а и b, так удобней
ab_swap = False
if len(a) < len(b):
ab_swap = True
a, b = b, a
# если с длиньше самой длинной строки (a) больше чем на 1 символ
# значит ответа нет
if len(c) > len(a)+1:
print("UNSOLVABLE")
return
# если с меньше самой длинной строки (a)
# значит ответа нет
if len(c) < len(a):
print("UNSOLVABLE")
return
alphabet = set(a+b+c)
# если разных букв во всех строках больше 10
# значит ответа нет
if len(alphabet) > 10:
print("UNSOLVABLE")
return
# переворачиваем строки, так удобнее, перевернем обратно в конце
a = a[::-1]
b = b[::-1]
c = c[::-1]
# itertools.permutations(l, r) перебирает все перестановки из l по r
for perm in itertools.permutations(list(range(10)), len(alphabet)):
# мапа буква -> цифра
m = dict()
# заполняем мапу
i = 0
to_next_perm = False
for ch in a+b+c:
if ch not in m:
m[ch] = perm[i]
# избегаем случаев когда первой букве в строке достался 0, ведущих нулей нет по условию
if perm[i] == 0:
if a[-1] == ch or b[-1] == ch or c[-1] == ch:
to_next_perm = True
break
i += 1
if to_next_perm:
continue
reminder = 0
for i in range(len(a)):
a_current = m[a[i]]
# т.к. с >= a то не боимся выйти за пределы строки
c_current = m[c[i]]
# т.к. b <= a то заменяем b_current на 0 если вышли за пределы b
b_current = m[b[i]] if i < len(b) else 0
s = a_current + b_current + reminder
c_predict = s % 10
reminder = s // 10
if c_current != c_predict:
break
else:
# если закончили цикл без брейков
if len(a) == len(c) and reminder == 0 or len(a) != len(c) and reminder == m[c[-1]]:
# если а и с одинаковой длины и остатка не осталось
# или если с длинне чем а (может быть длинее только на 1 символ) то проверяем что он равен остатку, если ок то рисуем ответ
if ab_swap:
a, b = b, a
print_result(m,a,b,c)
return
# если цикл прервался на break пробуем следующую перестановку
# перебрали все перестановки, ответа нет
print("UNSOLVABLE")
def string_to_num(s, m):
return "".join(str(m[ch]) for ch in s)
def print_result(m, *strings):
for s in strings:
print(string_to_num(s[::-1], m))
# foo('abc', 'def', 'ghi') # 6823 6823 13646
foo('abcabcabca', 'defdefdefd', 'hijhijhijk') # 1421421421 7637637637 9059059058Editor is loading...
Leave a Comment