Untitled
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