Plansza 2D będzie zawierać następujące obiekty:
^
,>
,v
, Lub<
: Laser emiter skierowaną do góry, w prawo, w dół, w lewo lub odpowiednio. Może być ich więcej niż jeden. Lasery będą podróżować w linii prostej w pustej przestrzeni (pusta przestrzeń jest reprezentowana kropką.
). Lasery nie przechodzą przez emitery.*
: Cel. Lasery przechodzą przez cele. Może być ich więcej niż jeden.
Plansza może również zawierać następujące obiekty:
@
: Solidna ściana. Laser nie przejdzie tutaj.\
: Reflektor pochylony w lewo . Zmienia kierunek laserów zgodnie z następującą tabelą:Direction laser is travelling Direction of laser after hitting reflector Up Left Right Down Down Right Left Up
Powinno być dość intuicyjne w działaniu reflektorów. Wyobraźcie sobie je jako rzeczywiste dwustronne lustro, a wskazówki powinny być jasne.
/
: Prawy reflektor. Zmienia kierunek laserów zgodnie z następującą tabelą:Direction laser is travelling Direction of laser after hitting reflector Up Right Right Up Down Left Left Down
1
,2
,3
...9
: a portal . Liczba wskazuje kanał portalu - będą dokładnie dwa portale tego samego kanału (na przykład nie będzie trzech1
). Portal zmienia pozycję laserów na pozycję innego portalu tego samego kanału. Na przykład:> 1 @ 1 *
Laser uderzy w cel, ponieważ gdy trafi pierwszy
1
, zostaje teleportowany do drugiego1
po drugiej stronie. Lasery zachowują ten sam kierunek, w którym były wcześniej.Portal nie teleportuje lasera do portalu innego kanału (tzn.
1
Nie teleportuje lasera do9
.
Twój program otrzyma dwuwymiarową reprezentację tablicy jako dane wejściowe. Tablica zawsze będzie miała prostokątny kształt. Wynik powinien być taki, True
że wszystkie cele mają lasery przechodzące przez nie, lub w False
inny sposób.
Oto kilka przypadków testowych:
Wkład
>....\ ..*... >./../ ..*...
Wydajność
True
Wkład
>..........\ 1........../ 2..........1 3..........2 4..........3 5..........4 6..........5 7..........6 8..........7 9..........8 *..........9
Wydajność
True
Wkład
>.@............* >..@...........* >...@..........* >....@.........* >.....@........* >...*..@........ >.......@......*
Wydajność
False
Wkład
../\. >./**
Wydajność
False
Wkład
/.......*.......\/3..... @..............//\.\.... *.............2\.1\/\... \..............///.....< .........*...//\\/.....\ >.............\.1.///.4. 4.......*/...\2\/3/\/..^
Wydajność
True
Wkład
vvvvvvvvvvvvvvvvv \\\\\\\\\\\\\\\\\ ///////////////// \\\\\\\\\\\\\\\\\ ///////////////// \\\\\\\\\\\\\\\\\ ///////////////// *****************
Wyjście (zwróć uwagę na cel po prawej stronie)
False
Odpowiedzi:
Pyton,
310302287278277260Nie różni się radykalnie od istniejącego postu w Pythonie, ale myślę, że ma jedną lub dwie godne uwagi sztuczki.
Obsługuje również dane wejściowe „nieterminujące”, takie jakEDYCJA : Ups! emitery blokują lasery.1>1
.t
pobiera listę ciągów (wiersze wejściowe) i zwraca wynik logiczny.Oto fajny gif kodowania gry w golfa:
EDYCJA : Niesamowity gif dzięki uprzejmości Willa. Dzięki Will!
źródło
1>1
się skończy. Nie udało mi się znaleźć czegoś, co się nie kończy, ale nie włożyłem w to wiele wysiłku i prawie zakładałem, że tak się nie stanie z moją implementacją. Oczywiście ponownie zastanowię się, czy ktoś może go przedstawić..find(d)
zwraca -1, jeśli nie zostanie znalezione. Jeśli usunieszif-1<d:
instrukcję i zamiast tego zrobiszj+=[-1,1,w,-w,-i][d]
na górze pętli while, nie znaleziono -1 zmieni się w dodanie ostatniego elementu w tej tablicyj
, co spowodujej
0, o którym wiemy, że jest@
...?Perl, 647
To jest moja pierwsza próba gry w golfa kodowego i jestem trochę zawstydzona, że nawet nie pobiłam wyniku C #, ale pomyślałam, że byłoby to interesujące (lub zabawne lub po prostu masochistyczne), aby zrobić to wszystko jako seria podstawień wyrażeń regularnych. (Pomyślałem również, że fajnie byłoby odświeżyć mój Perl, ale pod koniec głęboko żałowałem, że nie wdrożyłem go w Ruby ani Python).
Nie przeprowadziłem wielu testów, ale myślę, że powinno poradzić sobie z każdą sprawą.
Siatka jest wprowadzana przez STDIN. Na wejściu musi znajdować się co najmniej jedna nowa linia (tzn. Pojedynczy wiersz bez nowej linii nie będzie działać).
Objaśnienie: kod iteracyjnie aktualizuje ciąg siatki, gdy lasery przez niego przechodzą.
-
przedstawia poziomy laser,|
pionowy laser,+
skrzyżowane laserówK
do\
lustra za pomocą lasera odbijając się od górnej,k
jak/
lustro za pomocą lasera odbija się od dna,Z
na\
zwierciadło laserem odbijając się od dołu iW
z/
lustra z laserem odbijając szczyt.%
jest/
lustrem z laserami po obu stronach, podczas gdyX
jest\
lustrem z laserami po obu stronach. (Rozróżniana jest wielkość liter. Próbowałem wybrać litery, które wyglądają nieco odpowiednio - na przykładk
iK
są dość oczywistymi wyborami - ale niestety efekt naprawdę nie jest taki pomocny. Powinienem naprawdę umieścić te informacje w tabeli, ale jestem teraz wyczerpany).Obsługa portali w ten sam sposób (tj. Przypisanie każdej cyfrze zestawu dodatkowych znaków na podstawie możliwych pozycji lasera wejściowego / wyjściowego) wymagałaby 144 znaków (w tym oryginalnej 9), więc zamiast tego, gdy laser uderzy w portal „wejściowy”, Dodam znak portalu „wyjściowy” do zestawu znaków, które emitują laser we właściwym kierunku. (Wymaga to rozróżnienia między portalami wejściowymi i wyjściowymi; użyłem
qwertyuio
do tego liter .)Nieco golfa, z drukowanymi instrukcjami, dzięki czemu można zobaczyć, że zachodzą podstawienia (każde zastąpienie reprezentuje jedną „rundę” postępu laserowego), a
g
flaga jest dodana do głównej,s///
aby nie wymagała tylu iteracji:źródło
Python 338
351Moja niezminimalizowana wersja faktycznie kreśli ścieżki lasera na planszy, co jest ładne:
źródło
C # -
515414400 bajtówKompletny program w języku C #, bez ładnych wyników takich jak Will. Działa poprzez podążanie ścieżką lasera dla każdego emitowanego osobno i utrzymywanie szeregu komórek, które odwiedziliśmy, abyśmy mogli sprawdzić, czy odwiedziliśmy wszystkie gwiazdy na końcu. Edycja: rozłożył dużą liczbę bajtów, robiąc wszystko 1D i używając znaku zamiast int do przechowywania bieżącego znaku
w0lf przypomniał mi, że miałem niedostatecznie wykorzystaną pętlę for w samym środku mojego kodu, więc pomyślałem, że powinienem zrobić ostatni wysiłek i uruchomić to, a teraz sprowadzam się do absolutnej minimalnej liczby kręconych szelki Nie będę udawał, że podoba mi się zwinięcie drugiej pętli for, kod jest teraz strasznie nieuporządkowany, ale zaoszczędził kilka bajtów. W trakcie tego procesu ponownie napisałem obsługę portalu. Znalazłem również krótszą metodę wykonywania „przenoszenia” za pomocą zagnieżdżonej, a nie zagregowanej operacji warunkowej.
Kod do gry w golfa:
Kod mniej golfowy:
Nowy kod obsługi portalu wykorzystuje fakt, że funkcja String.IndexOf szczęśliwie zwraca -1 (tzn. Nie znaleziono znaku), jeśli poprosisz, aby zaczął szukać 1 znaku poza ciągiem (zgłasza wyjątek, jeśli poprosisz, aby zaczął dalej). To była dla mnie nowość, ale w tym przypadku była okropnie wygodna.
źródło
m+=(d>0?d-2:0)+(d<3?d-1:0)*W;
i wpakować go wfor
następujący sposób:for(char c;i-->0;m+=(d>0?d-2:0)+(d<3?d-1:0)*W)
. W ten sposób uratujesz jeden znak, ponieważ stracisz średnik.