Wprowadzenie
Syzyf miał ostatnio kłopoty w pracy. Wygląda na to, że on po prostu nigdy nic nie robi i chciałby znaleźć rozwiązanie tego problemu.
Jego obecne zatrudnienie wymaga stoczenia skały pod górę. Zwykle dobrze wykonuje swoją pracę, ale za każdym razem, gdy jest blisko szczytu wzgórza, znów się stacza.
Staje się naprawdę sfrustrowany swoją pracą i chce rozwiązać problem naukowo poprzez komputerową symulację skały staczającej się ze wzgórza.
Zdarza się, że Syzyf nie jest szczególnie dobry w programowaniu, więc może możesz mu pomóc?
Wyzwanie
Po tym głupim wprowadzeniu przejdźmy do sprawy. Twój program otrzyma ilustrację wzgórza i skały, która wygląda podobnie do tego:
#o
##
###
######
########
Gdzie #
reprezentuje część wzgórza i o
skałę.
Teraz musisz wdrożyć program, który przesuwa skałę o 1 warstwę w dół. Na przykład wynik powyższego powinien wynosić:
#
##o
###
######
########
Jeśli jest tam równy poziom, wzgórze tylko toczy się poziomo, więc ...
o
########
... to spowodowałoby, że kamień przewróciłby się na bok.
o
########
Jeśli jest obszar pionowy, skała spada o jeden stopień, więc ...
#o
#
#
#####
... dałby ...
#
#o
#
#####
Otrzymasz również szerokość i wysokość obrazu odpowiednio w jednym wierszu nad obrazem. Podsumowując, nasze przykładowe dane wejściowe wyglądałyby następująco:
10 5
#o
##
###
######
#########
(Zauważ, że białe znaki tutaj to spacje. Wybierz tekst i zobacz, co mam na myśli).
Trochę szczegółów
- Gdy kamień znajduje się już w ostatnim wierszu podczas uruchamiania programu, możesz albo zakończyć program, albo wyprowadzić niezmienione wejście
- Wzgórze zawsze schodzi tylko w dół
Twój program powinien sformatować dane wyjściowe dokładnie tak samo jak dane wejściowe (w tym wymiary), więc jeśli potokujesz dane wyjściowe programu do siebie, oblicza następny krok.
Możesz założyć, że zawsze jest droga na dół, więc dane wejściowe, w których ścieżka jest „blokowana”, mogą powodować niezdefiniowane zachowanie
Możesz założyć, że w ostatnim wierszu zawsze znajduje się spacja. Skała powinna tam „odpocząć”, więc po kilkukrotnym wywołaniu programu, zawsze przesyłając swoje wyjście do siebie, powinieneś skończyć ze skałą w ostatnim wierszu, leżąc tam, gdzie wcześniej była przestrzeń.
Możesz zaakceptować dane wejściowe w dowolnej formie (standardowe, plik, ...). Musisz opublikować CAŁY program (więc wszystkie wstępnie zainicjowane zmienne liczą się jako kod).
Linie są zakończone za pomocą
\n
.Możesz dostać kilka przykładowych wejść tutaj (upewnij się, że kopia spacje prawidłowo!)
To jest golf golfowy , więc wygrywa działające zgłoszenie z najmniejszą liczbą bajtów .
Zwycięzca zostanie wybrany 26 lipca 2014 r. Możesz opublikować rozwiązania, ale nie możesz wygrać
Jeśli masz jakieś pytania, daj mi znać w komentarzach.
Miłej gry w golfa!
#
s, więc na końcu jest jedna spacja, ponieważ szerokość wynosi 10. W tym przypadku (po kilku iteracjach) skała położyłaby się w miejscu spacji (czyli na dole -prawy róg).Odpowiedzi:
Regex (.NET, Perl, PCRE, JavaScript, ... smaki), 25 bajtów
Tak, to spowoduje kolejną debatę, czy wyrażenie regularne jest poprawnym programem, ale uprzedzę to i powiem, że to przesłanie jest dla zabawy i nie trzeba brać pod uwagę zwycięzcy. (W przeciwieństwie do 31-bajtowego wariantu Perl na dole;).)
Oto rozwiązanie zastępujące wyrażenia regularne.
Wzór (zwróć uwagę na spację końcową):
Zastąpienie (zwróć uwagę na spację wiodącą):
Liczba bajtów jest sumą dwóch.
Możesz to przetestować na stronie http://regexhero.net/tester/ . Pamiętaj, aby wybrać zakończenia linii w stylu uniksowym i „zachować wklejone formatowanie” podczas wklejania. Jeśli nadal nie działa, nadal masz wklejone zakończenia linii w stylu Windows. Najprostszym poprawka w tym przypadku jest zastąpienie
\n
z\r\n
we wzorcu, aby zobaczyć, że to działa.Oto 48-bajtowa funkcja ECMAScript 6 używająca tego
Wreszcie mam też aktualny program. To 31 bajtów Perla (w tym dwa bajty dla
p
i0
flagi; dzięki Ventero za sugestię!).Jeśli chcesz to przetestować, nawet nie zapisuj go w pliku, po prostu zrób to
źródło
\n
z\r\n
)Python - 190
Horror krojenia i konkatenacji, a także zbyt wiele zmiennych. Jestem pewien, że można bardziej grać w golfa, ale nie mogę teraz wymyślić żadnych sprytnych funkcji Pythona. Dane wejściowe są przechowywane w postaci ciągu
s
.Ponieważ ciągi Pythona są niezmienne, zastępuję znak łącząc wszystkie znaki przed, mój nowy znak i wszystkie znaki po. Używam szerokości wzgórza i indeksowania, aby określić, gdzie skała powinna się toczyć.
źródło
Ruby, 65/55 znaków
Pomyślałem, że zobaczę, jak długie jest rozwiązanie, które nie tylko rzuci regex na problem.
Zgodnie z oczekiwaniami nie jest tak krótki jak rozwiązanie regularne m.buettner - ale też niewiele dłużej.
Podczas korzystania z flag interpretera można to skrócić do 55 znaków (53 dla kodu, 2 dla flag):
Uruchom kod w następujący sposób:
źródło
HTML JavaScript - 251 znaków
( 251, jeśli policzymy kod w pojedynczych cudzysłowach, które odczytują dane wejściowe i zwracają dane wyjściowe. 359 jeśli policzymy pole wprowadzania, ciąg wejściowy, przycisk itp. 192, jeśli policzysz tylko to działa.)
Kod golfa:
http://goo.gl/R8nOIK
Kliknij „Idź” w kółko.
metoda
Używam String.match (), aby podzielić wzgórze na 5 części, a następnie zmieniam jedną lub dwie części. Uczę się JavaScript, więc wszelkie sugestie będą mile widziane.
Kod czytelny
źródło
Python 2 -
289252 bajtyWprowadziłem kilka znaczących ulepszeń, ale wciąż jest to okropne. Jeszcze kilka bajtów można zaoszczędzić, konwertując to na Python 3, ale nie mogę się rozwiać.
Najpierw znajduję kamień. Jeśli znak bezpośrednio pod nim jest
'#'
, wymienić każde wystąpienie'o '
z' o'
. Ponieważ na końcu jest zapewnione dodatkowe miejsce, zawsze przesunie to kamień w prawo.Niezależnie od tego, czy właśnie to zrobiłem, czy nie, transponowałem całą siatkę
zip(*m)
. Następnie zrobić kolejną wymianę'o '
z' o'
. Jeśli po prawej stronie skały znajduje się przestrzeń, oznacza to, że w prawdziwej siatce znajduje się przestrzeń pod nią, więc się porusza. Następnie transponuję z powrotem i drukuję.źródło
#
, i wykonuję to sprawdzenie, zanim wykonam sprawdzenie, aby przejść w pionie.Python (201)
źródło
awk, 152
Bardziej czytelny
źródło
php
485484 znakówWiem, że jest to ogromne w porównaniu do wejścia autorstwa m.buettner, ale na razie mogę to zrobić najlepiej. Myślę, że musi istnieć szybszy sposób na przekształcenie łańcucha wejściowego w tablicę wielowymiarową, ale jest już bardzo późno.
I chociaż to niekonkurencyjne, podobała mi się ta łamigłówka. Chciałby, aby rozszerzenie pokazywało, gdzie kończy się kula, lub po określonej liczbie kroków, być może dodane po szerokości i wysokości w linii wprowadzania. Można to bardzo łatwo dodać do tej wersji.
Oto mój kod: Dane wejściowe znajdują się w pierwszej zmiennej.
Możesz to zobaczyć tutaj w akcji na codepad
Edycja: Zmieniono powyższy kod i kod, ponieważ wyświetlał 0 zamiast o, co powodowało problem, gdy próbowałem przekazać dane wyjściowe z powrotem do programu. Naprawiono teraz i zapisano jeden znak!
źródło
Groovy -
263261256 znakówGrał w golfa Wczytaj plik do ciągu i użyj funkcji
p
do emulacji funkcjiString.putAtIndex(index,value)
:Niegolfowany (nieco):
źródło
try{
zamiasttry {
icatch(Exception
zamiastcatch (Exception
.R 234
Manipulacja łańcuchem nie jest najsilniejszym punktem R.
Bardziej czytelnie:
źródło
C (182)
Lub, jeśli naprawdę chcesz przeczytać kod:
źródło
Clojure - 366 znaków
Bez wyrażenia regularnego. Wymagany plik wejściowy o nazwie „d”. Gra w golfa:
Nie golfowany:
Przykładowy przebieg (tylko jedna sprawa, dla zwięzłości):
Jestem nowicjuszem. Sugestie mile widziane.
źródło
MATLAB, 160
Bolesną częścią jest wprowadzanie pliku. Rzeczywiste obliczenia miałyby tylko 114 bajtów:
źródło