Задача день 8 не так проста. Длинный вопрос и понимание может занять больше времени для некоторых. В этой статье мы попытаемся упростить вопрос и работать над решением.

Если вы не знакомы с Пришествием кода, я настоятельно рекомендую решить его самостоятельно, прежде чем рассматривать эти решения.

Понять проблему

Эта задача фокусируется на обнаружении цифры из набора символов, как и Семисегментные дисплеи. Вот пример 0-9 цифр:

Вход делится на две части, шаблоны сигналов и четырехзначное выходное значение. Это означает, что на основе сигнала; вам нужно идентифицировать четырехзначное число из заданного набора символов для каждой цифры в выходном значении. Проблема в том, что сигнал искажен и невозможно определить, какой набор символов представляет какую цифру.

Один из входных данных из списка примеров входных данных, который я нашел немного простым для понимания:

edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc

Часть 1

Первая часть как всегда относительно проста; Вместо декодирования случайного набора символов для оцифровки нам нужно подсчитать 1, 4, 7 и 8. Почему эти четыре цифры? Потому что они имеют относительно разное количество символов.

ans = sum(
  len(chars) in (2, 3, 4, 7)
  for line in inputs
  for chars in line.split('|')[1].strip().split()
)
print(f'Times do digits 1, 4, 7, or 8 appear: {ans}')

Вот и все! Просто и прямо.

Часть 2

В части 2 вы должны декодировать все четырехзначные выходные значения из искаженных входных сигналов. Давайте перечислим всю информацию, которая у нас есть, или мы можем проанализировать существующие данные:

  1. Мы можем декодировать 1, 4, 7 и 8 цифр, глядя на длину символов. То же самое относится и к входному сигналу.
  2. Мы знаем, что три-три цифры имеют длину пять и шесть символов соответственно.
  3. Из этих трех цифр, если мы можем найти две цифры, то оставшаяся часть — это третья цифра.

Найдите две цифры длины шесть, т. е. 0, 6 и 9

Найти цифру 6: мы можем сравнить 1 с 6, и разница в 1 символ очевидна. Этого достаточно, чтобы найти 6.

Далее 0: сравните 0 с 4. То же, что и 1-6, разницы в 1 символ достаточно, чтобы найти 0. Примечание. В 4 есть разница в один символ с 6 , но на предыдущем шаге мы нашли 6, так что можем его игнорировать.

Найдите две цифры длины пять, например 2, 3 и 5

Найти цифру 5: аналогично 1-6; Мы можем найти 5 из цифры 6, учитывая, что все символы в 5 также входят в 6.

Найдите цифру 3: То же, что и 5-6. У нас есть 3-9, которая также соответствует 5, но у нас уже есть 5, поэтому мы можем ее игнорировать.

Мы расшифровали все цифры с помощью приведенного выше анализа, и теперь несложно получить четырехзначное выходное значение для всех позиций.

inputs = [
    'be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe',
    'edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc',
    'fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg',
    'fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb',
    'aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea',
    'fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb',
    'dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe',
    'bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef',
    'egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb',
    'gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce',
]
def format(input):
    return list(map(lambda w: ''.join(sorted(w)), input))
outputs = list(map(format, [input.split('|')[1].strip().split() for input in inputs]))
inputs = list(map(format, [input.split('|')[0].strip().split() for input in inputs]))

Код для нахождения суммы всех выходных значений:

code = []
mapping = {2: 1, 3: 7, 4: 4, 7: 8}
for input in inputs:
    temp = {}
    for word in input:
        if len(word) in mapping:
            temp[mapping[len(word)]] = word
    
    # Find 6
    for word in input:
        if len(word) == 6 and any(char not in word for char in temp[1]):
            temp[6] = word
            break
# Find 0
    for word in input:
        if len(word) == 6 and any(char not in word for char in temp[4]) and word not in temp.values():
            temp[0] = word
            break
    
    # Find 9 after 6 and 0 with length 6
    for word in input:
        if len(word) == 6 and word not in temp.values():
            temp[9] = word
            break
# Find 5
    for word in input:
        if len(word) == 5 and all(char in temp[6] for char in word):
            temp[5] = word
            break
    
    # Find 3
    for word in input:
        if len(word) == 5 and all(char in temp[9] for char in word) and word not in temp.values():
            temp[3] = word
            break
    
    # Find 2 after 3 and 5 with length 5
    for word in input:
        if len(word) == 5 and word not in temp.values():
            temp[2] = word
    
    # Transform key-value to value-key
    code.append({v: k for k, v in temp.items()})
total = 0
for i, output in enumerate(outputs):
    total += int(''.join(map(str, [code[i][word] for word in output])))
print(f'Sum of the output values is {total}')

Примечание. Обязательно используйте введенные данные для получения ответа.

Наконец, подумайте о том, чтобы стать участником Medium. Спасибо!