Wyzwanie
Najkrótszy kod pod względem liczby znaków, aby wprowadzić reprezentację 2D płytki i wyprowadzić „prawda” lub „fałsz” zgodnie z danymi wejściowymi .
Plansza składa się z 4 rodzajów płytek:
# - A solid wall
x - The target the laser has to hit
/ or \ - Mirrors pointing to a direction (depends on laser direction)
v, ^, > or < - The laser pointing to a direction (down, up, right and left respectively)
Jest tylko jeden laser i tylko jeden cel . Ściany muszą tworzyć jednolity prostokąt o dowolnej wielkości, w którym umieszczony jest laser i cel. Możliwe są ściany wewnątrz „pokoju”.
Promień lasera wystrzeliwuje i przemieszcza się od początku do kierunku, w którym wskazuje. Jeśli promień lasera uderzy w ścianę, zatrzymuje się. Jeśli promień lasera uderza w lustro, odbija się o 90 stopni w kierunku, na który wskazuje lustro. Lustra są dwustronne, co oznacza, że obie strony są „odblaskowe” i mogą odbijać promień na dwa sposoby. Jeśli promień lasera trafi w sam laser ( ^v><
), jest traktowany jak ściana (promień lasera niszczy promień, więc nigdy nie trafi w cel).
Przypadki testowe
Wejście: ########## # / \ # # # # \ x # #> / # ########## Wynik: prawdziwe Wejście: ########## # vx # # / # # / # # \ # ########## Wynik: fałszywe Wejście: ############# # # # #> # # # # # # # x # # # # ############# Wynik: fałszywe Wejście: ########## # / \ / \ / \ # # \\ // \\\ # # // \ / \ / \\ # # \ / \ / \ / x ^ # ########## Wynik: prawdziwe
Liczba kodów obejmuje wejście / wyjście (tj. Pełny program).
źródło
Odpowiedzi:
Perl,
166160znakówPerl,
251248246222214208203201193190180176173170166 -> 160 znaków.Rozwiązanie miało 166 uderzeń po zakończeniu tego konkursu, ale A.Rex znalazł kilka sposobów, aby zgolić 6 dodatkowych znaków:
Pierwsza linia ładuje dane wejściowe do
%t
tabeli tablicy, w której$t{99*i+j}
znajduje się znak w wierszu i , kolumnie j . Następnie,wyszukuje elementy lub pod
%t
kątem znaku, który pasuje> ^ <
lubv
, i jednocześnie ustawia$d
wartość z zakresu od 0 do 3, która wskazuje początkowy kierunek wiązki laserowej.Na początku każdej iteracji w głównej pętli aktualizujemy,
$d
czy wiązka jest aktualnie na lustrze. XOR o 3 daje prawidłowe zachowanie\
lustra, a XOR o 1 daje prawidłowe zachowanie/
lustra.Następnie aktualna pozycja
$r
jest aktualizowana zgodnie z aktualnym kierunkiem.Znak na bieżącej pozycji przypisujemy
$_
do, aby wygodnie używać operatorów dopasowania.Kontynuuj, jeśli jesteśmy na pustej przestrzeni lub postaci lustrzanej. W przeciwnym razie zakończymy,
true
jeśli jesteśmy w miejscu docelowym ($_ =~ /x/
) lub wfalse
przeciwnym razie.Ograniczenie: może nie działać w przypadku problemów z więcej niż 99 kolumnami. To ograniczenie mogłoby zostać usunięte kosztem 3 dodatkowych znaków,
źródło
s!.!$t{$s++}=$&!ge,$s=$r+=99for<>;
zmień kolejność pierwszej linii jako , zmień%d=split//,.." to
% d = .. = ~ /./ g, and change
grep {..}% t` nagrep..,%t
Perl, 177 znaków
Pierwszy podział linii można usunąć; pozostałe dwa są obowiązkowe.
Wyjaśnienie:
Jeśli belka poruszająca się w prawo wpada na {pustą przestrzeń, lustro skierowane w górę, lustro odchylone w dół}, staje się {wiązką poruszającą się w prawo, wiązką poruszającą się w górę, wiązką poruszającą się w dół}. Inicjalizuj
$/
po drodze - na szczęście „6” nie jest prawidłowym znakiem wejściowym.Przeczytaj tablicę do
$_
.$s
jest symbolem tego, na czym obecnie znajduje się belka. Ponieważ emiter laserowy ma być traktowany jak ściana, ustaw ją jako ścianę.Jeśli promień lasera wskazuje w jakikolwiek sposób poza prawą, obróć jego symbol, a następnie obróć całą tablicę w miejscu (również obracając symbole luster). Jest to obrót w lewo o 90 stopni, osiągnięty efektywnie poprzez odwrócenie rzędów podczas transpozycji wierszy i kolumn, z nieco diabelskim
s///e
efektem ubocznym. W kodzie golfowym tr jest zapisany w formie,y'''
która pozwala mi pominąć jeden lewy ukośnik.Zakończ odpowiednią wiadomością, jeśli trafimy w cel lub ścianę.
Jeśli przed laserem jest wolne miejsce, przejdź do przodu. Jeśli przed laserem znajduje się lustro, przejdź do przodu i obróć wiązkę. W obu przypadkach umieść „zapisany symbol” z powrotem w lokalizacji starej belki i umieść rzecz, którą właśnie nadpisaliśmy, w zapisanym symbolu.
Powtarzaj do zakończenia.
{...;redo}
to o dwa znaki mniej niżfor(;;){...}
i trzy mniej niżwhile(1){...}
.źródło
C89 (209 znaków)
Wyjaśnienie
Prawdopodobnie trudno będzie śledzić tę potworność, jeśli nie zrozumiesz C. To tylko ostrzeżenie.
To małe makro sprawdza, czy bieżący znak (
*p
) jest równy temu, coa
znajduje się w postaci znakowej (*#a
). Jeśli są równe, ustaw wektor ruchu nab
(m=b
), zaznacz ten znak jako ścianę (*p=1
) i ustaw punkt początkowy na bieżące położenie (q=p
). To makro zawiera część „else”.Zadeklaruj niektóre zmienne. *
q
to aktualna lokalizacja światła. *G
to plansza jako tablica 1D. *p
to bieżąca lokalizacja odczytu podczas wypełnianiaG
. *w
to szerokość deski.To oczywiste
main
.m
jest zmienną przechowującą wektor ruchu. (Jest to parametr służący domain
optymalizacji).Zapętlaj przez wszystkie znaki, wypełniając
G
za pomocąp
. PomińG[0]
jako optymalizację (nie musisz ponownie marnować pisania znakówp
w trzeciej częścifor
).Jeśli to możliwe, użyj wspomnianego wyżej makra, aby zdefiniować lazer.
-1
i1
odpowiadają odpowiednio lewej i prawej stronie oraz-w
oraz ww
górę i w dół.Jeśli bieżący znak jest znacznikiem końca linii (ASCII 10), ustaw szerokość, jeśli nie została jeszcze ustawiona. Pominięte
G[0]
pozwala nam pisaćw=p-G
zamiastw=p-G+1
. To również kończy?:
łańcuch odM
.Przesuń światło za pomocą wektora ruchu.
Odzwierciedlaj wektor ruchu.
Jeśli jest to ściana lub
x
, zakończ z odpowiednim komunikatem (m=0
przerywa pętlę). W przeciwnym razie nic nie rób (noop;m=m
)źródło
g.c:3: declaration expected
:(puts
deklaracji pomogło, ale nie wystarczyło, aby zmniejszyć ją poniżej 170. 209 jest jednak całkiem niezłe, więc myślę, że zostawię to na tym. Dzięki za pomoc, chłopaki. Bardzo to doceniam. =] (Cokolwiek, aby zdetronizować te wiedźmy Perla!)Założę się, że ludzie czekali na to DUŻO DŁUGO. (Co masz na myśli mówiąc, że wyzwanie się skończyło i nikogo to już nie obchodzi?)
Spójrz ... Przedstawiam tutaj rozwiązanie w
Befunge-93!
Waży aż 973 znaków (lub 688, jeśli jesteś na tyle charytatywny, aby ignorować białe znaki, które są używane tylko do formatowania i nie robią nic w rzeczywistym kodzie).
Zastrzeżenie : Napisałem własną befunge-93 tłumacza w Perlu krótką chwilę temu i niestety to wszystko ja naprawdę miałem czasu, z którym go przetestować. Jestem dość pewny, że ogólnie jest poprawny, ale może mieć dziwne ograniczenie w odniesieniu do EOF: Ponieważ
<>
operator Perla zwraca wartość undef na końcu pliku, jest to przetwarzane jako 0 w kontekście liczbowym. W przypadku implementacji opartych na języku C, w których EOF ma inną wartość (powiedzmy -1), ten kod może nie działać.Wyjaśnienie
Jeśli nie znasz składni i działania Befunge, zajrzyj tutaj .
Befunge to język oparty na stosie, ale istnieją polecenia, które pozwalają na pisanie znaków w kodzie Befunge. Korzystam z tego w dwóch miejscach. Najpierw skopiowałem całe dane wejściowe na płytę Befunge, ale umieściłem kilka wierszy poniżej rzeczywistego napisanego kodu. (Oczywiście nigdy nie jest to widoczne po uruchomieniu kodu).
Drugie miejsce znajduje się w lewym górnym rogu:
W tym przypadku obszar, który zaznaczyłem powyżej, to miejsce, w którym przechowuję kilka współrzędnych. Pierwsza kolumna w środkowym rzędzie to miejsce, w którym zapisuję współrzędną x dla aktualnej "pozycji kursora"; druga kolumna to miejsce, w którym przechowuję współrzędną y; następne dwie kolumny służą do przechowywania współrzędnych x i y źródła wiązki laserowej, gdy zostanie znalezione; a ostatnia kolumna (ze znakiem „a”) jest ostatecznie nadpisywana, aby zawierała aktualny kierunek wiązki, który oczywiście zmienia się w miarę śledzenia ścieżki wiązki.
Program rozpoczyna się od umieszczenia (0,27) jako początkowej pozycji kursora. Następnie wejście jest odczytywane po jednym znaku na raz i umieszczane w pozycji kursora; znaki nowej linii powodują jedynie zwiększenie współrzędnej y i powrót współrzędnej x do 0, tak jak prawdziwy powrót karetki. Ostatecznie interpreter odczytuje wartość undef i ta wartość znaku 0 jest używana do zasygnalizowania końca wprowadzania i przejścia do kroków iteracji lasera. Kiedy odczytywany jest znak lasera [<> ^ v], jest on również kopiowany do repozytorium pamięci (nad znakiem „a”), a jego współrzędne są kopiowane do kolumn po lewej stronie.
Końcowym rezultatem tego wszystkiego jest to, że cały plik jest w zasadzie kopiowany do kodu Befunge, trochę poniżej rzeczywistego kodu, przez który przeszedł.
Następnie położenie belki jest kopiowane z powrotem do lokalizacji kursora i wykonywana jest następująca iteracja:
Jeśli jest na to wystarczające zapotrzebowanie, spróbuję wskazać dokładnie, gdzie w kodzie to wszystko jest osiągane.
źródło
F #, 36 linii, bardzo czytelne
Ok, żeby uzyskać odpowiedź:
Próbki:
źródło
Golfscript - 83 znaki (połączenie mojego i stragera)
Nowa linia jest tutaj tylko do zawijania
Golfscript - 107 znaków
Nowa linia jest tam tylko dla przejrzystości
Jak to działa.
Pierwsza linia określa początkową lokalizację i kierunek.
Druga linia przechodzi przez obracanie się, gdy laser uderza w lustro.
źródło
353 znaki w Rubim:314277znaków teraz!OK, 256 znaków w Rubim i gotowe. Ładny okrągły numer, na którym można się zatrzymać. :)247 znaków. Nie mogę przestać.223203201 znaków w języku RubyZ białymi znakami:
Lekko refaktoryzowany:
źródło
ch
naC
lub dowolną inną 1-znakową literę, aby zapisać 2 znaki!i++
(zamiasti+=1
)?Pyton
294277253240232 znaków ze znakami nowej linii:(pierwszy znak w liniach 4 i 5 to tabulator, a nie spacje)
Zapomniałem, że Python ma nawet opcjonalne średniki.
Jak to działa
Kluczową ideą tego kodu jest użycie liczb zespolonych do reprezentowania pozycji i kierunków. Rzędy są wyimaginowaną osią, rosnącą w dół. Kolumny są rzeczywistą osią, rosnącą w prawo.
l='>v<^';
lista symboli lasera. Kolejność jest tak dobrana, aby indeks znaku kierunku lasera odpowiadał potędze sqrt (-1)x={'/':'^<v>','\\':'v>^<',' ':l};
tabela transformacji określająca, jak zmienia się kierunek, gdy belka opuszcza różne płytki. Kafelek jest kluczem, a nowe kierunki to wartości.b=[1];
trzyma planszę. Pierwszym elementem jest 1 (jest oceniany jako prawda), więc pętla while zostanie uruchomiona co najmniej raz.r=p=0
r
bieżący numer wiersza wejścia,p
to bieżąca pozycja wiązki lasera.while b[-1]:
przestań ładować dane tablicy, gdy raw_input zwróci pusty ciągb+=[raw_input()];r+=1
dołącz następny wiersz wejścia do tablicy i zwiększ licznik wierszyfor g in l:
odgadnij po kolei każdy kierunek laserac=b[r].find(g)
ustaw kolumnę na lokalizację lasera lub -1 jeśli nie znajduje się w linii (lub wskazuje w innym kierunku)if-1<c:p=c+1j*r;d=g
jeśli znaleźliśmy laser, ustaw aktualną pozycjęp
i kierunekd
.d
jest jednym ze znaków wl
Po załadowaniu płytki
b
, aktualna pozycjap
i kierunekd
zostały ustawione zgodnie ze źródłem lasera.while' '<d:
spacja ma niższą wartość ASCII niż którykolwiek z symboli kierunku, więc używamy go jako flagi zatrzymania.z=l.find(d);
indeks bieżącego kierunku znaku wl
ciągu.z
jest później używany zarówno do określenia nowego kierunku belki za pomocąx
tabeli, jak i do zwiększania pozycji.p+=1j**z;
zwiększyć pozycję za pomocą potęgi i. Na przykładl.find('<')==2
-> i ^ 2 = -1, co spowoduje przeniesienie do lewej kolumny.c=b[int(p.imag)][int(p.real)];
przeczytaj znak w bieżącej pozycjid=x.get(c,' '*4)[z]
poszukaj nowego kierunku belki w tabeli transformacji. Jeśli bieżący znak nie istnieje w tabeli, ustawd
na spację.print'#'<c
print false, jeśli zatrzymaliśmy się na czymkolwiek innym niż cel.źródło
p+=1j**z
: Jakie to słodkie.To
jestbył bezpośredni port rozwiązanie Briana do C # 3, minus interakcje konsoli. To nie jest wpis w wyzwaniu, ponieważ nie jest to kompletny program, po prostu zastanawiałem się, jak niektóre z konstrukcji F #, których użył, mogą być reprezentowane w C #.Edytować: po pewnym eksperymentowaniu następujący raczej szczegółowy kod wyszukiwania:
został zastąpiony bardziej kompaktowym kodem LINQ to Objects:
źródło
F #, 255 znaków (i nadal raczej czytelne!):
Ok, po nocnym odpoczynku bardzo to poprawiłem:
Porozmawiajmy o tym linijka po linijce.
Najpierw zrzuć wszystkie dane wejściowe do dużej jednowymiarowej tablicy (tablice 2D mogą być złe dla golfa kodu; po prostu użyj tablicy 1D i dodaj / odejmij szerokość jednej linii do indeksu, aby przesunąć w górę / w dół o linię).
Następnie obliczamy „w”, szerokość wiersza wejściowego i „c”, pozycję początkową, poprzez indeksowanie w naszej tablicy.
Teraz zdefiniujmy „następną” funkcję „n”, która przyjmuje bieżącą pozycję „c” i kierunek „d”, który wynosi 0, 1, 2, 3 dla góra, lewo, prawo, dół.
Indeks-epsilon „e” i „co-nowy-kierunek-jeśli-uderzymy-ukośnik” są obliczane przez tabelę. Na przykład, jeśli bieżący kierunek „d” wynosi 0 (w górę), to pierwszy element tabeli mówi „-w, 2”, co oznacza, że zmniejszamy indeks o w, a jeśli trafimy ukośnik, nowy kierunek wynosi 2 (dobrze).
Teraz przechodzimy do następnej funkcji 'n' z (1) następnym indeksem ("c + e" - bieżący plus epsilon) i (2) nowym kierunkiem, który obliczamy patrząc w przyszłość, aby zobaczyć, co jest w tablicy ta następna komórka. Jeśli znak wyprzedzenia jest ukośnikiem, nowy kierunek to „s”. Jeśli jest to odwrotny ukośnik, nowy kierunek to 3-s (nasz wybór kodowania 0123 sprawia, że to działa). Jeśli jest to przestrzeń, po prostu idziemy w tym samym kierunku „d”. A jeśli jest to jakikolwiek inny znak „c”, gra się kończy, wypisując „true”, jeśli znak był „x”, a w przeciwnym razie - fałsz.
Na początek nazywamy funkcję rekurencyjną „n” z początkową pozycją „c” i kierunkiem początkowym (który wykonuje początkowe kodowanie kierunku na 0123).
Myślę, że prawdopodobnie mogę jeszcze zgolić kilka znaków więcej, ale jestem z tego całkiem zadowolony (a 255 to niezła liczba).
źródło
Ważenie 18203 znaków to rozwiązanie w Pythonie, które może:
Nadal wymaga trochę uporządkowania i nie wiem, czy fizyka 2D narzuca, że wiązka nie może się przeciąć ...
Skrypt bash pokazujący raportowanie błędów kolorów:
Unittesty użyte w rozwoju:
źródło
Ruby, 176 znaków
Użyłem prostej maszyny stanowej (jak większość plakatów), nic nadzwyczajnego. Po prostu starałem się to łagodzić, używając każdej sztuczki, o której mogłem pomyśleć. Bitowy XOR używany do zmiany kierunku (przechowywany jako liczba całkowita w zmiennej
c
) był dużym ulepszeniem w stosunku do warunków warunkowych, które miałem we wcześniejszych wersjach.Podejrzewam, że kod, który się powiększa
x
iy
mógłby zostać skrócony. Oto sekcja kodu, która wykonuje inkrementację:Edycja : udało mi się nieco skrócić powyższe:
Aktualny kierunek lasera
c
jest zapisywany w następujący sposób:Kod opiera się na tym fakcie w celu zwiększenia
x
iy
o odpowiednią kwotę (0, 1 lub -1). Próbowałem przestawić, które liczby odwzorowują się w każdym kierunku, szukając układu, który pozwoliłby mi wykonać jakąś bitową manipulację w celu zwiększenia wartości, ponieważ mam dokuczliwe wrażenie, że byłby krótszy niż wersja arytmetyczna.źródło
C # 3.0
259 znaków
Nieco bardziej czytelne:
Wydaje się, że głównym marnotrawstwem znaków jest znalezienie szerokości mapy i położenia źródła lasera. Jakieś pomysły, jak to skrócić?
źródło
while(1)
C + ASCII, 197 znaków:
To rozwiązanie C zakłada zestaw znaków ASCII, co pozwala nam użyć sztuczki lustrzanej XOR. Jest również niesamowicie delikatny - na przykład wszystkie linie wejściowe muszą mieć tę samą długość.
Łamie się poniżej znaku 200 znaków - ale do diabła, nadal nie pokonałem tych rozwiązań Perla!
źródło
Golfscript (83 znaki)
Cześć, gnibbler!
źródło
Python - 152
Odczytuje dane wejściowe z pliku o nazwie „L”
Aby odczytać ze stdin, zamień pierwszą linię na this
Jeśli potrzebujesz małych liter prawda / fałsz, zmień ostatnią linię na
źródło
True
natrue
iFalse
nafalse
? ;-)D<5
” na „print D <5”? Czy jest coś, czego mi brakuje?JavaScript - 265 znaków
Aktualizacja IV - Szanse są to ostatnia runda aktualizacji, udało się uratować jeszcze kilka postaci, przełączając się na pętlę do-while i przepisując równanie ruchu.
Aktualizacja III - Dzięki sugestii stragera dotyczącej usunięcia Math.abs () i umieszczenia zmiennych w globalnej przestrzeni nazw, co w połączeniu z pewnym przestawieniem przypisań zmiennych spowodowało, że kod został zmniejszony do 282 znaków.
Aktualizacja II - Trochę więcej aktualizacji kodu, aby usunąć użycie! = -1, a także lepsze wykorzystanie zmiennych dla dłuższych operacji.
Aktualizacja - Po przejściu i dokonaniu pewnych zmian, tworząc odniesienie do funkcji indexOf (dzięki LiraNuna!) I usuwając nawiasy, które nie były potrzebne.
To mój pierwszy raz, kiedy gram w code-golfa, więc nie jestem pewien, o ile mogłoby to być lepsze, każda informacja zwrotna jest mile widziana.
W pełni zminimalizowana wersja:
Wersja oryginalna z komentarzami:
Strona internetowa do przetestowania z:
źródło
index != -1
sięindex > 0
proszę! (Miejmy nadzieję, że nikt nie umieści lazera w lewym górnym rogu, aby0
nie został zwrócony. =]) Możeszvar
połączyć instrukcje w łańcuch lub całkowicie się ich pozbyć (umieszczając zmienne w globalnej przestrzeni nazw). Myślę, żeMath.abs(m)==1
można go zastąpićm==-1|m==1
. Czymovement = ...; location += movement
można zoptymalizowaćlocation += movement =
?function(a){return g.indexOf(a)}
można zastąpićfunction(a)g.indexOf(a)
w najnowszych wersjach JavaScript.Dom Luster
Nie jest to faktyczne wejście do wyzwania, ale napisałem grę opartą na tej koncepcji (nie tak dawno temu).
Jest napisany w Scali, open-source i dostępny tutaj :
Robi trochę więcej; zajmuje się kolorami i różnymi typami luster i urządzeń, ale wersja 0.00001 zrobiła dokładnie to, czego wymaga to wyzwanie. Straciłem jednak tę wersję i i tak nigdy nie została zoptymalizowana pod kątem liczby znaków.
źródło
c (K&R) 339 niezbędnych znaków po większej liczbie sugestii od stragera.
Fizyk we mnie zauważył, że operacje propagacji i odbicia są niezmienne w czasie, więc ta wersja wyrzuca promienie z celu i sprawdza, czy dotarły do emitera laserowego.
Reszta implementacji jest bardzo prosta i jest mniej więcej dokładnie zaczerpnięta z moich wcześniejszych działań.
Sprężony:
Nieskompresowany (ish):
Nie ma sprawdzania poprawności danych wejściowych, a złe dane wejściowe mogą wysłać je do nieskończonej pętli. Działa poprawnie z wejściem nie większym niż 99 na 99. Wymaga kompilatora, który połączy standardową bibliotekę bez dołączania żadnego z nagłówków. I myślę, że skończyłem, strager mnie pokonał znacznie, nawet z jego pomocą.
Raczej mam nadzieję, że ktoś zademonstruje subtelniejszy sposób wykonania zadania. Nie ma w tym nic złego, ale nie jest to głęboka magia.
źródło
=0
na globale, ponieważ są one domyślnie inicjowane na 0. Zastąp stałe znakowe ich odpowiednikami w postaci dziesiętnej. Użyj>0
zamiast,!=EOF
aby sprawdzić pod kątem EOF (i\0
). Prawdopodobnie możesz usunąć#define
część kodu wcase
taki sam sposób, jak ja zrobiłem zif
. Nie ma potrzeby umieszczania dodatkowego\n
wputs
as i takputs
musi drukować nowy wiersz.for(;;)
jest krótszy niżwhile(1)
. Mam nadzieję że to pomoże. =]"There is no input validation"
- Nie powinno być żadnych. Aby ułatwić grę golfistom, zakłada się, że dane wejściowe są zawsze „czyste”, chyba że określono inaczej.Ruby - 146 znaków
źródło
Postscriptum , 359 bajtów
Pierwsza próba, dużo miejsca na ulepszenia ...
źródło
Haskell,
395391383361339 znaków (zoptymalizowanej)Nadal używa generycznej maszyny stanów, zamiast czegokolwiek sprytnego:
Czytelna wersja:
źródło
Wierzę w ponowne wykorzystanie kodu, użyłbym jednego z twoich kodów jako API :).
32 znaki \ o / ... wohoooo
źródło
C ++: 388 znaków
( 318 bez nagłówków)
Jak to działa:
Najpierw wczytywane są wszystkie linie, a następnie znajduje się laser. Poniższe zostaną ocenione
0
tak długo, jak długo nie znaleziono strzały laserowej, a jednocześnie zostaną przypisane dox
pozycji poziomej.Następnie sprawdzamy, w jakim kierunku znaleźliśmy i zapisujemy
i
. Parzyste wartościi
to góra / lewo („malejące”), a nieparzyste to dół / prawo („rosnące”). Zgodnie z tym pojęciem ustalane sąd
(„kierunek”) ir
(„orientacja”). Indeksujemy tablicę wskaźnikówz
z orientacją i dodajemy kierunek do otrzymanej liczby całkowitej. Kierunek zmienia się tylko wtedy, gdy uderzymy cięciem, podczas gdy pozostaje taki sam, gdy uderzymy w back-slash. Oczywiście, gdy trafimy w lustro, zawsze zmieniamy orientację (r = !r
).źródło
Groovy @ 279 znaków
źródło
DO#
1020 znaków.1088 znaków (dodane wejście z konsoli).925 znaków (zmienne refaktoryzowane).875 znaków (usunięto nadmiarowy inicjator słownika; zmieniono na Binary i operatory)
Postanowiłem nie patrzeć na niczyjego przed wysłaniem. Jestem pewien, że może być trochę LINQ. A cała metoda FindLaser w wersji do odczytu wydaje mi się strasznie podejrzana. Ale działa i jest późno :)
Zauważ, że czytelna klasa zawiera dodatkową metodę, która drukuje bieżącą arenę, gdy laser się porusza.
Wersja do odczytu (nie do końca ostateczna wersja golfowa, ale to samo założenie):
źródło
Perl 219
Moja wersja Perl jest
392342 znaków (miałem obsłużyć przypadek wiązki uderzanie laser):Aktualizacja , dzięki Hobbs za przypomnienie mi
tr//
, to teraz 250 znaków:Aktualizacja , usuwając
m
wm//
zmieniając dwiewhile
pętle wniesionych kilka oszczędności; teraz wymagane jest tylko jedno miejsce.(
L:it;goto L
ma taką samą długość jakdo{it;redo}
):Ogoliłem trochę, ale z niektórymi z nich
ledwokonkuruje, choć późno.Wygląda trochę lepiej jako:
Cóż ... Szczerze mówiąc, powinno to być oczywiste, jeśli zrozumiesz, że
@b
jest to tablica tablic znaków w każdym wierszu i możesz odczytać prostetr
wyrażenie regularne i instrukcje.źródło
$_=$s;tr/^v<>/<>^v/
i$_=$s;tr/v^<>/<>^v/
odpowiednio. Nie potrzebujesz też plikum
inm//
.$_=$s;tr/v^></<>^v/;
if m/.../
które mogąif/.../
zaoszczędzić dwie postacie na pop.y///
zamiast,tr///
aby zapisać dwie postacie.F # - 454 (lub mniej więcej)
Trochę za późno do gry, ale nie mogę się powstrzymać przed wysłaniem mojej próby 2d.
Aktualizacja nieznacznie zmodyfikowana. Teraz zatrzymuje się poprawnie, jeśli nadajnik zostanie trafiony. Uchwyciłem pomysł Briana na IndexOfAny (szkoda, że wiersz jest tak rozwlekły). Właściwie nie udało mi się wymyślić, jak sprawić, aby ReadToEnd powrócił z konsoli, więc biorę to trochę na zaufanie ...
Jestem zadowolony z tej odpowiedzi, jakby była dość krótka, ale nadal dość czytelna.
źródło