Задача день 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
,4
,7
и8
цифр, глядя на длину символов. То же самое относится и к входному сигналу. - Мы знаем, что три-три цифры имеют длину пять и шесть символов соответственно.
- Из этих трех цифр, если мы можем найти две цифры, то оставшаяся часть — это третья цифра.
Найдите две цифры длины шесть, т. е. 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. Спасибо!