Dzięki temu pytaniu o inspirację
W tym starciu będziemy reprezentować linię domina jako ciąg |
, /
a \
. Otrzymasz ciąg domino jako dane wejściowe i musisz określić, jak będą wyglądać, gdy się osiedlą. Oto zasady upadku domina
Domino stojące
|
, na lewo od domina upadłego po lewej\
, stanie się również domino upadłym po lewej stronie.Domino stojące
|
, na prawo od domina upadłego/
, również stanie się domino upadłym.Jeśli domino stojące znajduje się między lewą,
\
a prawą,/
domino, pozostanie w pozycji stojącej.
Reguły te są stosowane wielokrotnie, dopóki układ się nie zmieni.
Oto przykład, w jaki sposób jedno wejście może dojść do wniosku
|||||||\/|||||||\||\|||/||||||\|||||
||||||\\//|||||\\|\\|||//||||\\|||||
|||||\\\///|||\\\\\\|||///||\\\|||||
||||\\\\////|\\\\\\\|||////\\\\|||||
|||\\\\\////|\\\\\\\|||////\\\\|||||
||\\\\\\////|\\\\\\\|||////\\\\|||||
|\\\\\\\////|\\\\\\\|||////\\\\|||||
\\\\\\\\////|\\\\\\\|||////\\\\|||||
Twoim zadaniem jest napisanie kodu, który znajdzie i wyprowadzi końcowy wynik danych wejściowych. Możesz założyć, że dane wejściowe są zawsze prawidłowe i zawierają co najmniej 2 znaki.
To jest golf golfowy, więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.
Przypadki testowe
|||/|||| -> |||/////
|||\|||| -> \\\\||||
|/||||\| -> |///\\\|
||/|||\| -> ||//|\\|
||\|||/| -> \\\|||//
źródło
Odpowiedzi:
Siatkówka , 32 bajty
Wypróbuj online!
Wyjaśnienie
+
Mówi Retina uruchomić wymianę w pętli, dopóki nie uda się zmienić ciąg. Każda wymiana oblicza jeden krok spadających domino. Sam zamiennik to tak naprawdę trzy zamienniki w jednym, ale zapewnia to, że są one wykonywane jednocześnie:To po prostu pasuje
/|\
(jak/\\
i/\\
, ale te nie mają znaczenia) i ponownie wprowadza je bez zmian. Ma to na celu ominięcie|
upadłych domino po obu stronach, ponieważ jest to krótsze niż wykluczenie tych przypadków z osobnymi opisami w pozostałych dwóch przypadkach.To pasuje
/|
i zamienia to w//
.To pasuje
|\
i zamienia to w\\
.źródło
$1$2$2$3$3
aby pokonać języki gry w golfa.Python 2 ,
1151141111089895 bajtów-1 bajt dzięki ovs
Wypróbuj online!
źródło
b=0;
i zastąpić wystąpieniab
by,id
aby zapisać dwa bajty!V , 23 bajty
Wypróbuj online!
Naprawdę jest to bardzo podobne do odpowiedzi na siatkówkę, tylko że wygląda brzydiej. Wykorzystuje kompresję wyrażeń regularnych.
Hexdump:
Wyjaśnienie:
ò
każe V działać, dopóki łańcuch się nie zmieni. Reszta to skompresowane wyrażenie regularne. Przekształćmy go w ekwiwalent vima ...źródło
SNOBOL4 (CSNOBOL4) ,
117115112111 bajtówWypróbuj online!
Kredyt dla Roda Pythona odpowiedź na pomysł na zatrzymanie stanie z drugiej zmiennej, aby zobaczyć zmiany, zamiast testów
D '/|' | '|\'
.źródło
Haskell ,
114107 bajtówWypróbuj online!Pierwszy wiersz definiuje anonimową funkcję.
Wyjaśnienie:
until=<<((==)=<<)$g
jest funkcją punkt fix (patrz tutaj o wyjaśnienie), który stosuje się funkcjęg
do ciągu wejściowego aż wynik nie zmienia już.zip3('|':s)s(tail s++"|")
tworzy dla każdego domina, czyli znaku w ciągus
, trzykrotnie z domino przed i po nim, wypełnienie|
na krawędziach. Np./\|
Staje się[(|,/,\),(/,\,|),(\,|,|)]
(ignorując ucieczkę).t
jest stosowana do każdej z trzech potrójnych w celu obliczenia nowej pozycji środkowego elementu potrójnego.źródło
Perl 5 , 39 + 1 (
-p
) = 40 bajtówWypróbuj online!
źródło
Prolog (SWI) , 132 bajty
Wypróbuj online!
Ten program określa predykat,
+/2
który jest prawdziwy, jeśli drugi argument jest ustaloną wersją pierwszego. Oba argumenty są listami kodów znaków.Wyjaśnienie
To rozwiązanie wykorzystuje DCG, aby dowiedzieć się, jaki jest następny krok, a następnie wielokrotnie oblicza następny krok, aż następny krok będzie taki sam jak bieżący krok.
DCG
Te pięć wierszy kodu definiuje regułę DCG (gramatyka klauzuli określonej),
+
która jest używana w programie do obliczania pojedynczego kroku obalenia domina. DCG w Prologu pracują, znajdując pierwszy przypadek reguły, której prawa strona pasuje do ciągu i określając argument reguły po lewej stronie w tym procesie. Jeśli sprawa się nie zgadza, cofnie się i spróbuje później.Ta linia reprezentuje podstawowy przypadek
+
reguły. Po prostu stwierdza, że jeśli obecnie nie ma domino, w następnym kroku nadal nie będzie domino.Ponieważ program ten dotyczy wyłącznie listami kodów znakowych ważne jest, aby pamiętać, że kody dla znaków
/
,\
i|
są 47, 92, i 124 odpowiednio. Ten przypadek+
reguły obsługuje/|\
ciąg znaków.Ta obudowa obsługuje przewrócone domino przewracające domino po jego prawej stronie. Ponieważ pojawia się po skrzynce do obsługi
/|\
, nie zostanie wykorzystana do tej możliwości.Obsługuje skrzynkę domina przewracającego się po lewej stronie, przewracając domino po jego lewej stronie.
To jest przypadek wieloznaczny. Ponieważ nic innego się nie zmienia poza tym, co opisano powyżej, dopóki tekst pozostanie w ciągu wejściowym, po prostu skopiuje go na wyjście, o ile nie pasuje do żadnego z powyższych przypadków.
Predykat
Główny predykat przyjmuje dwa argumenty, pierwszy to wstępna konfiguracja domina, drugi to ustalone domino. Ponieważ jest to Prolog, nie można ustalić drugiego, a program go obliczy. Predykat sam w sobie jest dość prosty,
+(N,X,[])
wywołuje DCG i oblicza następny etap przechowywania w dominoN
.(X=N,Y=N;N+Y)
sprawdza, czy następny krok domina jest taki sam jak bieżący i czy jestY
ustawiony, ponieważ domina musiała się ustabilizować, a jeśli nie, to powtarza się, wywołując ten sam predykat z następnym krokiem dominoN
zamiastX
.źródło
APL (Dyalog) , 36 bajtów
Wypróbuj online!
-3 częściowo dzięki Cows Quack .
Czuje się taki nie golfowy ... :(
źródło
twarz , 166 bajtów
Pobiera dane wejściowe jako argument wiersza poleceń i wysyła do STDOUT. Działa to tylko w zatwierdzeniu 86494f6 i późniejszych z powodu poprawki błędu w tym zatwierdzeniu.
Opakowane dla estetyki:
I nieprzyznany / skomentował:
Jest tu kilka subtelnych sztuczek, które usuwają kilka dodatkowych bajtów, takich jak
nazewnictwo zmiennych | i /, do których wartości ASCII są dostępne poprzez introspekcję w dalszej części kodu
w
'|
pierwszym wierszu głównej pętli, który jest tam wywoływany zamiast w drugim wierszu w celu ustawienia | wskaźnik do użycia w drugiej części głównej pętliźródło
Perl 5 , 52 + 1 (-p) = 53 bajty
-6 bajtów dzięki mik
Prawdopodobnie nie najlepszy z możliwych dla Perla, ale to właśnie mogłem wymyślić.
Wyjaśnienie
Wypróbuj online!
źródło
-p
zamiast-a
eliminuje potrzebęprint;
; użyciewhile
sufiksu do wyrażenia fikcyjnego (np.0
) pozwoli zaoszczędzić kolejne 2 bajtyPerl 5 , 44 (kod) + 1 (
-p
) = 45 bajtówWypróbuj online!
Wyjaśnienie
źródło
Czysty , 98 bajtów
Wypróbuj online!
źródło
Rubinowy , 83 bajty
Technicznie do oszukania
9.times
, a nawet po prostu,999.times
ale nie mam ochoty być tani :)Nadal ma ogromny potencjał golfowy. (Uwaga:
y while undone
jest znacznie dłuższy niżx.size.times
)Wypróbuj online!
źródło
R , 114 bajtów
Wypróbuj online!
Zwraca łańcuch znaków ucieczki.
źródło
C (gcc) , 183 bajtów
Wypróbuj online!
źródło