Witam, Święta za pasem to zabrałem się za advent of code. https://adventofcode.com/2024/day/4. W skrócie: mamy blok tekstu o kształcie kwadratu. W tym bloku mamy znaleźć wszystkie wystąpienia słowa XMAS (poziomo,pionowo,skośnie i wspak oraz mogą nachodzić na siebie: XMASAMX). Skrypt działa na bloku testowym (inputblok liter 10x10) i zwraca poprawnie 18 wystąpień słowa. W bloku z zadania (https://adventofcode.com/2024/day/4/input) nie zwraca poprawnie ilości wystąpień - brakuje mi ze 200 rekordów. Czy ktoś może podpowiedzieć co robię źle? Jakieś sugestie jak pozbyć się 4 bloków while ? Wydaje mi się, że problem leży w obliczaniu przekątnych ale policzyłem że skrypt wycina odpowiedną ich ilość (38 dla kwadratu z liter o boku 10), sprawdziłem też że wycina je odpowiednio z lewej góry na dół i z prawej góry na dół. HELP!
Popełniłem takiego tasiemca jak poniżej:
import regex as re
path = r'C:\TEST\advent4_test.txt'
import itertools as it
def count_overlapping(line, search_for):
return len(re.findall(search_for, line, overlapped=True))
# HORIZONTAL MATCHES
count_horizontal = 0
with open(path,'r') as f:
for line in f.readlines():
if count_overlapping(line,'XMAS'):
count_horizontal +=1
if count_overlapping(line,'SAMX'):
count_horizontal +=1
# stworzenie listy list poziomych znaków, oraz usunięcie znaku końca linii
list_of_horizontals = [] # to będzie nasze matrix,lista list
with open(path,'r') as f:
for line in f.readlines():
line = line.rstrip('\n')
lista = []
for i in line:
lista.append(i)
list_of_horizontals.append(lista)
# VERTICAL MATCHES
rows = len(list_of_horizontals)
columns = len(list_of_horizontals[0])
vert_string=''
list_of_vert_strings = []
for i in range(rows):
for j in range(columns):
vert_string += list_of_horizontals[j][i]
list_of_vert_strings.append(vert_string)
vert_string =''
count_vertical = 0
for i in list_of_vert_strings:
count_vertical += count_overlapping(i,'XMAS') + count_overlapping(i,'SAMX')
# DIAGONAL MATCHES
count_diagonal = 0
matrix = list_of_horizontals.copy()
flatt_matrix = list(it.chain.from_iterable(matrix)) # spłaszczenie całej matrycy(lista w liście) do ciągu znaków w jednej liście
rlist = [] # będzie zawierała odwrócone kolejnością znaki w poszczeg. listach
for r in matrix:
new = r.copy()
new.reverse()
rlist.append(new)
flatt_reversed_matrix = list(it.chain.from_iterable(rlist))
# prawy górny trójkąt
list_of_diagonals = []
iter_count = len(matrix)
i=0
while iter_count !=0:
for n in range(i,iter_count):
list_slice_right = list(it.islice(flatt_matrix,i,(len(flatt_matrix)) - (n*len(matrix)),len(matrix)+1))
list_of_diagonals.append(list_slice_right)
print(list_slice_right,'prawa góra matrycy')
i +=1
iter_count -=1
print('#'*80)
# lewy górny trójkąt
iter_count = len(matrix)
i=0
while iter_count !=0:
for n in range(i,iter_count):
list_slice_right = list(it.islice(flatt_reversed_matrix,i,(len(flatt_reversed_matrix)) - (n*len(matrix)),len(matrix)+1))
list_of_diagonals.append(list_slice_right)
print(list_slice_right,'lewa góra matrycy')
i +=1
iter_count -=1
print('#'*80)
# lewy dolny trójkąt
iter_count = len(matrix)
i=1
while iter_count !=1:
for n in range(i,iter_count):
list_slice_right = list(it.islice(flatt_matrix,(len(matrix)*i),(len(flatt_matrix)),len(matrix)+1))
list_of_diagonals.append(list_slice_right)
print(list_slice_right,'lewy dół')
i +=1
iter_count -=1
print('#'*80)
# lewy dolny trójkąt
iter_count = len(matrix)
i=1
while iter_count !=1:
for n in range(i,iter_count):
list_slice_right = list(it.islice(flatt_reversed_matrix,(len(matrix)*i),(len(flatt_reversed_matrix)),len(matrix)+1))
list_of_diagonals.append(list_slice_right)
print(list_slice_right,'prawy dół')
i +=1
iter_count -=1
diagon_string=''
list_of_diagon_strings = []
# zamiana listy z literami na stringi
for i in list_of_diagonals:
for j in i:
diagon_string += j
list_of_diagon_strings.append(diagon_string)
diagon_string = ''
# TESTING AREA AND ENDING
print(list_of_diagon_strings) # czy prawidłowa liczba przekątnych
print(len(list_of_diagon_strings))
# iteracja po liście ze stringami
for i in list_of_diagon_strings:
count_diagonal += count_overlapping(i,'XMAS')
count_diagonal += count_overlapping(i,'SAMX')
# PODSUMOWANIE
whole_amount = count_horizontal + count_vertical + count_diagonal
print(whole_amount,'whole amount of all XMAS and SAMX')
print(count_horizontal,'horizontal',count_vertical,'vertical',count_diagonal,'diagonal')