Das mit `count` ist interessant, habe ich allerdings noch nicht in Code versucht umzusetzen.
@__blackjack__ Das Suchen nach den X-Koordinaten ist nicht das Problem. Aber das Suchen in alle Richtungen. Um das zu verdeutlichen, hier mal mein Ansatz bzw. der Punkt an dem ich aufgehört habe, weil ich das Rätsel mit so nicht lösen will, weil das Mist ist.
Code: Alles auswählen
import re
from collections import defaultdict
EXAMPLE_LINES = """\
MMMSXXMASM
MSAMXMSMSA
AMXSXMAAMM
MSAMASMSMX
XMASAMXAMM
XXAMMXXAMA
SMSMSASXSS
SAXAMASAAA
MAMMMXMMMM
MXMXAXMASX""".splitlines()
DELTA = [x for x in range(-4, 5) if x != 0]
def parse_input(lines):
line_to_x = defaultdict(list)
for line_number, line in enumerate(lines):
for match in re.finditer("X", line):
line_to_x[line_number].append(int(match.start()))
return line_to_x
def count_xmas(x_coordinates, lines):
max_row_length = len(lines[0])
words_inline = []
words_vertical = []
words_diagonal = []
for row, columns in x_coordinates.items():
for column in columns:
for delta in DELTA:
if column >= 3:
words_inline.append(lines[row][column + delta])
elif delta > 0:
words_inline.append(lines[row][column + delta])
if row >= 3:
words_vertical.append(lines[row + delta][column])
elif delta > 0:
words_vertical.append(lines[row + delta][column])
if column > 3 and row > 3 and column + 4 <= max_row_length:
words_diagonal.append(lines[row + delta][column + delta])
# Und so weiter für die anderen Randfälle und oben sind
# auch nicht alle abgedeckt.
# Da wird man doch verrückt.
def main():
puzzle_input = EXAMPLE_LINES
x_coordinates = parse_input(puzzle_input)
print(count_xmas(x_coordinates, puzzle_input))
if __name__ == '__main__':
main()
Grüße
Dennis