Zostałeś zatrudniony jako asystent naukowy i poproszony o stworzenie małego programu, który zbuduje labirynty szczurów. Pudełko szczura ma zawsze wymiary 62 x 22 i ma wejście (a) i wyjście (A) dla szczura, takie jak to (wejście 1):
#######a######################################################
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
#################################################A############
Twój program musi wypełnić pole blokami (#) pozostawiając ścieżkę dla szczura, tak jak to (wynik 1):
#######a######################################################
####### ######################################################
####### ######################################################
####### ######################################################
####### ######################################################
####### ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
#################################################A############
To łatwe, myślisz! Zaczynasz pisać mały, pełen zaufania program. Jednak główny naukowiec wpadł na nowy pomysł - chce, aby dwa szczury poruszały się jednocześnie po labiryncie. Dr Rattanshnorter wyjaśnia, że mają różne drzwi i różne wyjścia (wkład 2):
#b#####a######################################################
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# B
# #
#################################################A############
Szczury zostały wytrenowane, aby poruszać się prosto przez skrzyżowania, ale przecięcia w T pozostawiają je beznadziejnie zdezorientowane i unieważnią eksperyment. Zaczynasz od nowego, bardziej złożonego zadania, gdy dobry Doktor wyjaśnia jeden końcowy wymóg: szczury są wobec siebie dzikie, więc jeśli zobaczą się w dowolnym momencie, wybuchnie walka na szczurach i oboje staniecie przed komisją etyki. Teraz zdajesz sobie sprawę, że twój program powinien wypisać labirynt coś takiego (wynik 2):
#b#####a######################################################
# ##### ######################################################
# ##### ######################################################
# ##### ####################################### ####
# ##### ####################################### ######### ####
# ##### ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# # ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### B
################################################# ############
#################################################A############
Zanim szczur B dotrze do skrzyżowania, szczur A będzie podróżował korytarzem do wyjścia A i uniknie się walki ze szczurami.
Zasady:
Twój program powinien wczytywać (STDIN lub plik) dane wejściowe takie jak te powyżej i wyprowadzać (STDOUT lub plik) te same dane, z tym wyjątkiem, że wiele spacji będzie teraz skrótami (#). Możesz zastąpić dowolny pojedynczy znak (np.
;
) Zamiast\n
w ciągu wejściowym, ale ciąg wyjściowy nadal wymaga\n
znaków. AKTUALIZACJAŚcieżka szczura musi mieć szerokość jednego znaku, z wyjątkiem skrzyżowań (każde miejsce musi mieć zero lub dwa prostopadle sąsiadujące
#
znaki). Każdy szczur musi mieć wyraźną pojedynczą ścieżkę, z wyjątkiem skrzyżowań. Niedozwolone są przecięcia w kształcie litery T.Szczury są wypuszczane jednocześnie i poruszają się ze stałą prędkością. W żadnym momencie dwa lub więcej szczurów nie powinno się widzieć (znajdować się w tej samej kolumnie lub rzędzie bez jednego lub więcej
#
znaków pomiędzy nimi).Jeśli żadne rozwiązanie nie jest możliwe (takie jak sąsiednie punkty wejścia), wydrukuj
Impossible\n
i wyjdź.Wejścia i wyjścia mogą być po każdej stronie, jednak nigdy nie będą na rogach.
Jeśli dopasowane wejście i wyjście sąsiadują ze sobą (np .
##aA##
:), szczur nie może przejść bezpośrednio oda
doA
. W obszarze labiryntu musi znajdować się mały 2-kosmiczny korytarz.W turze, w której szczur osiąga punkt wyjścia (lub w dowolnym późniejszym czasie), nie jest już widoczny dla innych szczurów.
Twój program może być zaprojektowany do obliczania labiryntów dla 1, 2, do 26 szczurów.
Standardowe luki są niedozwolone.
Wynik:
Za pomocą swojego rozwiązania określ, ile szczurów na labirynt (N) może rozwiązać Twój program. Twój wynik to długość kodu w bajtach podzielona przez tę liczbę N.
W odpowiedzi podaj przykładowy wynik, abyśmy mogli zobaczyć, co produkuje Twój program.
Odpowiedzi:
Haskell, 26 szczurów ?, ~ 5000 bajtów
Teoretycznie ten kod powinien działać dla dowolnej liczby szczurów, ale nie oferuję żadnej gwarancji, że zakończy się przed śmiercią wszechświata. Opiera się na algorytmie cofania, który próbuje najpierw przejść prostą ścieżkę, a następnie zmienić ścieżkę, jeśli ścieżka nie działa. Liczba alternatyw jest wykładnicza w stosunku do długości ścieżki i liczby szczurów.
Jeszcze nie zadałem sobie trudu gry w golfa, ponieważ jest on tak duży i ponieważ chcę go najpierw przyspieszyć.
Próbka wyjściowa, 6 szczurów:
źródło
b
dojdzie do skrzyżowania z,e
ib
czy go nie widzie
?b
zdaje się docierać do tego miejscat = 11
, które zatrzymałobye
się w tym korytarzu. Czy coś brakuje?Haskell, 1 szczur, 681 znaków
Problem można rozwiązać w trywialny sposób dla wszystkich labiryntów z jednym szczurem. Ten kod „działa” także na dowolną liczbę szczurów, ale nie przestrzega żadnych ograniczeń interakcji między wieloma szczurami i ścieżkami.
Przykładowe dane wyjściowe:
Planuję wspierać wiele szczurów, więc napisałem ogólny kod, ale nie znalazłem jeszcze dobrego algorytmu do tego.
parse
wyodrębnia listę wszystkich wejść i wyjść wraz z ich współrzędnymirats
bierze tę listę i konwertuje ją na pary współrzędnych dla każdego szczura.bnds
bierze współrzędną na krawędzi i przesuwa ją do najbliższej współrzędnej w labiryncie.naive
przyjmuje pozycje początkową i końcową i zwraca prostą ścieżkę między nimi.main
następnie zastępuje całą białą spację nie na ścieżce znakiem „#”źródło