Untitled

 avatar
unknown
plain_text
20 days ago
3.0 kB
4
Indexable
import time

# Zmienna przechowująca dane wejściowe
input_data = []

winning_rooms = []  # zbiór kluczowy do wygranej - X
lista_polozen = []  # gdzie jest dziecko w danym kroku, lista ta zawiera słowniki licząc dzieci
siatka = []         # siatka polega na liście 2 wymiarowej :)

# Odczyt danych z pliku
with open('input_0', 'r') as data_in:
    for i in data_in:
        line = []
        for element in i.split():
            line.append(int(element) if element.isdigit() else element)  # Konwersja elementów na liczby całkowite oprocz drzwi ABCD
        input_data.append(line)
print(input_data)

rooms = int(input_data[0][0])   # liczba pokoi
kids = int(input_data[1][0])    # liczba dzieci
input_pattern = str(input_data[4][0]) # Cały ciąg wprowadzonego patternu czyli np CAD
pattern = [] # tu przechowywane są odzielne kroki potem zamieniane na przypisane krokom wartości

for i in range(len(input_pattern)):
    pattern.append(input_pattern[i])        # kroki drzwi np CAD zamieniane na 'C' 'A' 'D'
    if pattern[i] == 'A':           # od tego momentu zamieniamy na wartości liczbowe
        pattern[i] = 0
    elif pattern[i] == 'B':
        pattern[i] = 1
    elif pattern[i] == 'C':
        pattern[i] = 2
    elif pattern[i] == 'D':
        pattern[i] = 3
print(pattern)

for i in input_data[3]:  # wrzucamy do listy kluczowe pokoje zapewniające wygraną
    winning_rooms.append(int(i))

for i in range(kids):  # pętla elegancko przypisuje każdemu dziecku numer pokoju startowego
    lista_polozen.append({i: int(input_data[2][i])})

print(lista_polozen)

# tworzenie siatki
for i in range(5, 5 + rooms):  # od piątego wiersza zaczyna się definicja siatki
    siatka.append(input_data[i])
print(siatka)

# Używamy patternu ABCD, pokoi id w zwiazku z połozeniem dzieci na siatce
step = 1
pattern_choice = 0 #sledzi i pilnuje aby pattern był pokolei C -> A -> D (i od poczatku)
timeout = time.time() + 5  # 5 sekund od tego momentu w programie
while True:
    output = 0  # pokazuje czy gra się skończy sukcesem
    zmiany = []  # lista przechowująca zmienione miejsca

    for kid_movement in range(kids):
        x = lista_polozen[kid_movement] #x to zmienna pomocnicza ktora przechowuje słownik aktualnego dziecka
        current_room = x[kid_movement]  #numer pokoju w ktorym aktualnie jest
        next_room = siatka[current_room - 1][pattern[pattern_choice]]  # -1 bo indexy zaczynają się od 0, a pokój jest oznaczany od 1
        x[kid_movement] = next_room

        # Sprawdzenie, czy dziecko dotarło do pokoju wygrywającego
        if next_room in winning_rooms:
            output += 1

    if output == kids or time.time() > timeout:
        break

    pattern_choice += 1
    if pattern_choice >= len(pattern):
        pattern_choice = 0
    step += 1

if output == kids:
    print("\nGra została wygrana po",step, "krokach.")
else:
    print("\nNIE")
Leave a Comment