Untitled
unknown
plain_text
9 months ago
3.6 kB
6
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.")Editor is loading...
Leave a Comment