Прочитать число из шифра

На вход всегда подаются только 4 строки - это графический образ зашифрованного числа, каждая цифра которого изображена символами ('#' и '.') одной из представленных ниже матриц: введите сюда описание изображения

Например, если на вход поданы такие 4 строки: введите сюда описание изображения ,

то на выход нужно подать одну строку с числом 79098654321.

Итак, в данной задаче на выход нужно подать число, распознанное из графического образа. Число может быть в диапазоне [0; 1000000000000].

sp = [['##','##','##','##'],
      ['.#','##','.#','.#'],
      ['##','.#','#.','##'],
      ['##','.#','.#','##'],
      ['##','##','.#','.#'],
      ['##','#.','.#','##'],
      ['.#','#.','##','##'],
      ['##','.#','#.','#.'],
      ['##','..','##','##'],
      ['##','##','.#','#.']]
tmp = []
text = []
for i in range(4):
    text = input()
    tmp.append([text[i:i+2] for i in range(0, len(text), 2)])

Начал так, закончить не могу. Подскажите пожалуйсто. Не могу понять как входящие данные выстроить в нужном порядке?


Ответы (2 шт):

Автор решения: Zhihar

например можно такой код сделать:

text = ['.###', '##.#', '.##.', '.##.'] # пример числа 17

dictionary = ['########', '.###.#.#', '##.##.##', '##.#.###', '####.#.#', '###..###', '.##.####', '##.##.#.', '##..####', '####.##.']

res = ''

for i in range(0, len(text[0]), 2):
    figure = text[0][i:i+2] + text[1][i:i+2] + text[2][i:i+2] + text[3][i:i+2]

    if figure not in dictionary:
        res += '*'
    else:
        res += str(dictionary.index(figure))

print(res)

в переменную text я занес 2 числа, но если надо запросить с клавиатуры, то надо сделать так:

text = [input(), input(), input(), input()]

Ну и если есть желание сделать все в 1 строку:

res = ''.join(str(dictionary.index(''.join(text[j][i:i+2] for j in range(4)))) if ''.join(text[j][i:i+2] for j in range(4)) in dictionary else '*' for i in range(0, len(text[0]), 2))

А если гарантированно нет левых символов вне словаря (которые заменяются у меня на '*'), то код можно еще упростить:

res = ''.join(str(dictionary.index(''.join(text[j][i:i+2] for j in range(4)))) for i in range(0, len(text[0]), 2))
→ Ссылка
Автор решения: SergFSM

у меня так получилось, вроде работает, попробуйте:

sp = [['##','##','##','##'],
      ['.#','##','.#','.#'],
      ['##','.#','#.','##'],
      ['##','.#','.#','##'],
      ['##','##','.#','.#'],
      ['##','#.','.#','##'],
      ['.#','#.','##','##'],
      ['##','.#','#.','#.'],
      ['##','..','##','##'],
      ['##','##','.#','#.']]

text = ['##########', 
        '.#######..', 
        '#..###.###', 
        '#.#.###.##']

from textwrap import wrap

w = [wrap(i,2) for i in text]
res = ''.join(str(sp.index(list(j))) for j in zip(*w))  # '79098'
→ Ссылка