Untitled

 avatar
unknown
plain_text
9 days ago
3.6 kB
3
Indexable
import time
import numpy as np
from datetime import datetime, timedelta

# Lista 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 numery pokoi dla dzieci
siatka = []  # siatka polega na liście 2 wymiarowej

# Odczyt danych z pliku
with open('02.in', '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 oprócz drzwi ABCD
        input_data.append(line)

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, np. CAD
pattern = []  # tu przechowywane są odrębne 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

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 przypisuje każdemu dziecku numer pokoju startowego
    lista_polozen.append(int(input_data[2][i]))

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

# Konwersja siatki na numpy array
siatka = np.array(siatka)

# Funkcja obliczająca kroki
def oblicz_korki(liczba_pokoi, liczba_dzieci, pokoje_startowe_dzieci, pokoje_docelowe, zaplanowane_kroki, konfiguracja_pokoi):
    pokoje = konfiguracja_pokoi
    kroki = zaplanowane_kroki
    max_number_kroku = len(kroki)
    pokoje_dzieci = pokoje_startowe_dzieci
    prev_iteration = ""
    prev_prev_iteration = ""
    numer_kroku = 0
    calkowita_ilosc_krokow = 1
    ilosc_sukcesow = 0
    end_time = datetime.now() + timedelta(minutes=1)

    while True:
        if numer_kroku == max_number_kroku:
            if datetime.now() >= end_time:
                return "TIMEOUT"
            else:
                current_iteration = " ".join(map(str, pokoje_dzieci))
                if prev_iteration == current_iteration or prev_prev_iteration == current_iteration:
                    return "NIE"

                prev_prev_iteration = prev_iteration
                prev_iteration = current_iteration

                numer_kroku = 0

        for dziecko in range(liczba_dzieci):
            pokoj_zajmowany_przez_dziecko = pokoje_dzieci[dziecko]
            pokoje_dzieci[dziecko] = pokoje[pokoj_zajmowany_przez_dziecko - 1, kroki[numer_kroku]]
            ilosc_sukcesow += 1 if pokoje_dzieci[dziecko] in pokoje_docelowe else 0

        if ilosc_sukcesow == liczba_dzieci:
            break

        calkowita_ilosc_krokow += 1
        numer_kroku += 1
        ilosc_sukcesow = 0

    return str(calkowita_ilosc_krokow)

# Wywołanie funkcji z odpowiednimi argumentami
result = oblicz_korki(rooms, kids, lista_polozen, winning_rooms, pattern, siatka)

if result == "NIE":
    print("\nNIE")
elif result == "TIMEOUT":
    print("\nCzas się skończył.")
else:
    print("\nGra została wygrana po", result, "krokach.")
Leave a Comment