Rozważ te pięć morskich stworzeń ASCII:
- Ryby standardowe:
><>
lub<><
- Szybka ryba:
>><>
lub<><<
- Solidna ryba:
><>>
lub<<><
- Ryby rozciągliwe:
><<<>
lub<>>><
- Krab:
,<..>,
Napisz program, który akceptuje dowolny ciąg znaków <>,.
. Jeśli istnieje sposób na zinterpretowanie całego łańcucha jako serii nienakładających się stworzeń morskich, łańcuch powinien zostać przedrukowany z pojedynczymi spacjami wstawionymi między stworzenia. Jeśli ta interpretacja jest niemożliwa, nic nie powinno być wyprowadzane (program po cichu się kończy).
Na przykład ciąg <><><>
może być interpretowany jako dwie standardowe ryby jedna po drugiej. Odpowiednim wyjściem byłoby <>< ><>
.
Jako kolejny przykład ciąg ><>><>>
zawiera „wystąpienia” ...
(nawiasy dodane tylko jako wskaźniki)
- kilka standardowych ryb:
[><>][><>]>
- szybka ryba:
><[>><>]>
- solidna ryba na kilka sposobów:
[><>>]<>>
i><>[><>>]
jednak tylko parowanie standardowej ryby i mocnej ryby [><>][><>>]
obejmuje całą długość sznurka bez znaków dzielących ryby (bez nakładania się). Zatem wyjście odpowiadające ><>><>>
jest ><> ><>>
.
Jeśli istnieje wiele sposobów interpretacji ciągu, możesz wydrukować dowolny z nich. (I drukować tylko jedną . Z nich) Na przykład, <><<<><
może być interpretowany jako standardowy ryb i stabilnej ryb: [<><][<<><]
czy jako szybkiego ryb i standardowego ryb: [<><<][<><]
. Więc albo <>< <<><
czy <><< <><
będzie ważne wyjście.
Kraby są po prostu dla zabawy. Ponieważ nie zaczynają się ani nie kończą na <
lub >
, są o wiele łatwiejsze do zidentyfikowania (przynajmniej wizualnie). Na przykład ciąg
,<..>,><<<>,<..>,><>,<..>,<>>><,<..>,><>>,<..>,<<><,<..>,<><,<..>,>><>
wytworzyłby oczywiście wynik
,<..>, ><<<> ,<..>, ><> ,<..>, <>>>< ,<..>, ><>> ,<..>, <<>< ,<..>, <>< ,<..>, >><>
Oto kilka przykładów ciągów (po jednym w wierszu), które nie generują danych wyjściowych:
<><>
,<..>,<..>,
>>><>
><<<<>
,
><><>
,<><>,
<<<><><<<>>><>><>><><><<>>><>><>>><>>><>><>><<><
Ostatni ciąg tutaj można przeanalizować, jeśli usuniesz wiodące <
:
<<>< ><<<> >><> ><> ><> <>< <>>>< >><> >><> >><> ><>> <<><
(Mogą istnieć inne możliwe wyniki.)
Detale
- Łańcuch wejściowy będzie zawierał tylko znaki
<>,.
. - Łańcuch wejściowy będzie miał co najmniej jeden znak.
- Pobieraj dane wejściowe w dowolny typowy sposób (linia poleceń, standardowe wejście) i wysyłaj na standardowe wyjście.
- Najkrótszy kod w bajtach wygrywa. ( Handy byte counter. ) Tiebreaker jest wcześniejszym postem.
źródło
Odpowiedzi:
Pyth,
644850 bajtówPrzypadek testowy.
Wersja, która nie zajmuje wieczności ( ) tutaj , w 52 bajtach.
O(9n/3)
Jest to podejście brutalnej siły, generuj wszystkie sekwencje i sprawdź, czy jakaś suma na wejściu. Diagramy ryb skompresowane jako znaki, których reprezentacjami binarnymi są
>
i<
. Całość jest owinięta blokiem try-catch, aby nie było żadnych wyników, gdy nie znaleziono żadnych wyników.To jest rozwiązanie.
O(9n)
Niektóre znaki są rozebrane powyżej, ponieważ używane są znaki kontrolne. Są one wiernie odtworzone pod powyższym linkiem.
wyjście xxd:
źródło
><>><>>
zajmuje 15 sekund na moim komputerze.Niedeterministyczna maszyna Turinga, 20 stanów, 52 przejścia (może 882 bajty)
Jak przekonwertować to na bajty? Napisałem pliki (absolutnie nie golfa), aby uruchomić tę maszynę za pomocą Alexa Vinokur's Simulator of a Turing Machine 1 .
wc -c
wyświetla następujące dane (z wyjątkiem pliku opisu i plików wejściowych):Tak czy inaczej, przygotowywałem się do matur komputerowych, więc pomyślałem, że to będzie dobre ćwiczenie (nie wiem, o czym myślałem). Oto definicja:
(funkcja przejścia)
Przepraszam za zły obraz, ale nie przejmowałem się przerysowaniem tego na komputerze. Jeśli naprawdę chcesz odszyfrować reguły przejścia, zalecamy przeczytanie pliku reguł, który podłączyłem powyżej.
Użyłem
X
s zamiast spacji, ponieważ spacje są tutaj trudne do wizualizacji, a symulator nie akceptuje spacji w alfabecie.Koncepcja jest dość prosta - od q1 do q4 są używane do chwytania ryb skierowanych w prawo, od q11 do q14 są używane do chwytania ryb skierowanych w lewo, od q15 do q19 dla krabów, a kropla q5 do q10 służy do wstawiania spacji i przenoszenia wszystkich następujące znaki jeden po prawej stronie.
Jeśli ciąg jest interpretowalny, przyjmuje ciąg, a taśma zawiera ciąg ze wstawionymi spacjami. W przeciwnym razie odrzuca ciąg (myślę, że liczy się to jako brak wyjścia - opróżnienie taśmy byłoby dość łatwe, ale wymagałoby wielu reguł przejścia i nie sądzę, aby ładniejsza była funkcja przejścia).
1 Uwaga: Kompilacja jest trudna. Musiałem edytować
src/tape.cpp
plik i zastąpićLONG_MAX
z1<<30
, a następnie przejdź dodemo
katalogu, edytować Makefile do zastąpieniaEXE_BASENAME
zturing.exe
i wykonaniamake
. Następnie przejdź do katalogu z plikami, które napisałem i uruchomiłem/path/to/turing/download/src/turing.exe meta
.źródło
fish (tak, ta ryba), 437 bajtów
Uderza mnie to jako jedno z zadań programistycznych, w których dokładnie jeden język jest odpowiedni.
Poniższa wersja jest wciąż najdłuższą odpowiedzią na wyzwanie,
ale ponieważ zrobiono to głównie dla gry słów (mam nadzieję, że będzie to usprawiedliwienie), lepszym graniem w golfa pozostanie ćwiczenie dla czytelnika.
źródło
printf 'H4sIADSjKlUCA4VPQW6DMBC89xUj5AOocSSOlV1/BHGgjgMrBUPN0kRRHl/jmEg99WBLszM7M7s4BqMw2hQotNHxNy+QkDYJZU7rTJqED/p4NIdCLdFmVOfVW6bJY04DeQGhVteBLg4cVqfYLQxBkD3jQ6HzJwTHa/BRRmf4ibEtBpRfriefXCxKZ4cJghtB7eNqIW2lnqMu9D9N3T7sGtOssDInJCk+982/MlmOHQ+I6rqKRv5UpRxCntN7XSk7eSYfK0f+eR3EmI23qilH3iFCrjIqdyNO8nzJvJH7alMu7jsnlHZafWw5VluD9r/0/c2vQ95+AYBxAwS2AQAA'|base64 --decode|gzip -d>a;fish a
> <>, 602 bajty
Rozwiązanie w Fish, prawdopodobnie bardzo grywalne, ale to mój pierwszy program> <>. Pobiera dane wejściowe ze stosu wejściowego i działa na tłumaczu online> <>.
Jak to działa :
Pętla odczytuje wszystkie dane wejściowe i układa je w stos, odwraca je i umieszcza -1 na dole, co oznacza, że parsowanie jest zakończone (wszystkie znaki pozostają na stosie, dopóki łańcuch nie zostanie uznany za przetwarzalny).
Podczas analizy wykorzystuje się fakt, że wszystkie znaki są różne modulo 5, a wszystkie wzorce są deterministyczne, z wyjątkiem <> << i> <>>. Przetwarzane znaki są umieszczane na dole stosu.
Po zakończeniu wzoru, jeśli -1 jest na górze, wszystkie znaki są drukowane, w przeciwnym razie dodaje się spację i program zapętla się.
W przypadku napotkania <> << lub> <>> rejestr jest zwiększany (0 na początku), a 0 jest umieszczane na stosie przed ostatnim znakiem (tak, że <> <lub> <> pozostaje po wycofaniu) . Jeśli błąd pojawi się później podczas analizowania, rejestr jest zmniejszany, wszystkie znaki po 0 są ponownie umieszczane na wierzchu (z wyjątkiem spacji dzięki testowi% 8 = 0).
Jeśli zostanie wykryty błąd, gdy rejestr ma wartość 0 lub wewnątrz kraba, program natychmiast się kończy.
źródło
Python 3, 156
Strategia polega na generowaniu list ryb i porównywaniu ich konkatenacji z łańcuchem wejściowym.
To trwa niemożliwie długo. Jeśli rzeczywiście chcesz zobaczyć wyjście, wymień
for _ in s
sięfor _ in [0]*3
, gdzie 3 to górna granica dla liczby ryb. Działa,s
ponieważs
zawiera najwyżej jedną rybę na char.Dzięki Sp3000 za poprawki błędów i zapisywanie znaków na wejściu.
Stary 165:
źródło
a and b or c
podaje niewłaściwą wartość, gdyb
może to być Falsey. Wróciłem doif/else
2 znaków, ale może istnieć sposób, aby trójka działała.*l,s=[],input()
Perl, 81 + 1 bajtów
Wypróbuj ten kod online.
Ten kod oczekuje danych wejściowych w
$_
zmiennej; uruchom to za pomocą-n
przełącznika Perla ( liczonego jako +1 bajt ), aby zastosować go do każdej linii wejściowej, np. tak:Ten kod używa silnika wyrażeń regularnych Perla (a zwłaszcza jego funkcji wykonywania kodu osadzonego ) w celu wydajnego wyszukiwania wstecznego śledzenia. Poszczególne znalezione ryby są gromadzone w
@a
tablicy, która jest ryflowana i drukowana, jeśli dopasowanie się powiedzie.Kod ten korzysta także Perl 5.10+
say
funkcji, a więc muszą być prowadzone z-E
lub-M5.010
przełącznika (lubuse 5.010;
), aby umożliwić takie nowoczesne funkcje. Tradycyjnie takie przełączniki używane wyłącznie w celu włączenia określonej wersji języka nie są uwzględniane w liczbie bajtów.Alternatywnie, oto wersja 87-bajtowa, która nie wymaga żadnych specjalnych przełączników wiersza polecenia. Odczytuje jedną linię ze standardowego wejścia i wypisuje wynik (jeśli istnieje) na standardowe wyjście, bez końcowego podawania linii:
Ps. Jeśli zezwolono na drukowanie dodatkowej spacji na początku danych wyjściowych, mogłem w trywialny sposób zapisać jeszcze dwa bajty za pomocą:
źródło
><(>|<<)>
Python 3,
196186 bajtówProsta rekurencja.
g
zwraca listę przeanalizowanych ryb lubNone
łańcuch wejściowy jest nie do rozdzielenia.źródło
Python 2, 234 bajty
Najpierw wypróbowałem rozwiązanie wyrażenia regularnego Python, ale wydaje się, że nie ma sposobu na wyodrębnienie grup po dopasowaniu na wielu wzorach. Poniżej znajduje się wyszukiwanie rekurencyjne, które wydaje się dobrze sprawdzać w przypadkach testowych.
Przykładowy test:
I wersja bez golfa:
źródło
if
może być na jednej linii (tak jak zrobiłeś to gdzie indziej). Ponadto zamiast,if p<len(t)
jak sądzę, możesz zrobić,if t[p:]
aby zaoszczędzić kilka bajtów.C # - 319 bajtów
To rozwiązanie jest haniebnie proste, prawie nic dla Golfa. Jest to kompletny program, pobiera dane wejściowe z linii STDIN i wysyła wynik do STDOUT.
Po prostu próbuje dopasować każdą rybę do pierwszej pozycji po spacji (lub na początku łańcucha) i dopasowuje do niej każdy rodzaj ryby. Jeśli ryba pasuje, to rekurencyjnie wywołuje solver po wstawieniu spacji za rybą lub po prostu zwraca jej dane wejściowe (z \ n ze względów wyjściowych), jeśli niedopasowany ciąg znaków jest dosłownie rybą (tzn. Znaleźliśmy rozwiązanie) .
Nie podjąłem wiele prób, aby dać ciągowi ryb zwykłe leczenie kolmogorovem, ponieważ nie jest to aż tak długie i nie mogę znaleźć taniego sposobu na odwrócenie ciągu w C # (nie sądzę, że LINQ zapłaci), więc może będzie tam jakaś okazja, ale trochę w to wątpię.
źródło
Haskell (Parsec) - 262
źródło
jestem trochę pytonem noob, więc zignoruj dziwność: P
źródło
m
zamiastmsg
,s
zamiaststart
, ...) i używać tylko 1 miejsce za przyrost. I dodaj post liczbę znaków swojego programu (możesz policzyć je tutaj ).Rubinowy, 177 bajtów
Nie najkrótszy, ale pierwszy w rubinie:
Próba polega na rekurencyjnym rozszerzeniu wyrażenia regularnego i dopasowaniu go do danych wejściowych.
Jeśli zostanie znalezione dłuższe dopasowanie, r () powtórzy się, jeśli nie, sprawdzi, czy ostatnie dopasowanie zużywa cały ciąg wejściowy, a dopiero potem wyśle go z dodanymi spacjami.
źródło
CJam,
111 9691 (lub 62 bajty)Powtarzające się chciwe podejście, aby dowiedzieć się, jakie wszystkie kombinacje ryb są możliwe podczas iteracji. Naprawdę nie grałem teraz w golfa.
Kod zawiera niektóre niedrukowalne znaki, więc skorzystaj z linku poniżej w celach informacyjnych.
Aktualizacja Zakodowany ciąg
Dodanie wyjaśnienia po zakończeniu gry w golfa
Wypróbuj online tutaj
62 bajty
Wersja super wolna. To w zasadzie tworzy wszystkie kombinacje i kontrole, które są równe wkładowi.
Zawiera także znaki niedrukowalne, więc skorzystaj z poniższego linku.
Wypróbuj online tutaj
źródło
Haskell,
148146 bajtówTestowanie:
$ echo "> <>> <>>" | runhaskell fishes.hs
Wyjaśnienie
Na podstawie mojej wcześniejszej odpowiedzi na podobne pytanie. Algorytm działa w czasie wykładniczym.
To czyta od prawej do lewej.
Nie spowoduje to wydrukowania łańcucha, który kończy się spacją, nawet jeśli takie łańcuchy również są generowane, ponieważ jego odpowiednik braku spacji jest generowany jako pierwszy.
źródło
JavaScript (ES6), 164
Rekurencyjny, pierwszy skan głębokości.
Jako program z I / O przez wyskakujące okienko:
Jako funkcja do przetestowania:
Pakiet testowy (uruchamiany w konsoli Firefox / FireBug)
Wynik
Ungolfed tylko funkcję k
źródło
Haskell,
148142wykorzystuje to opisy list do iteracji nad rybami, wybiera tych, którzy pasują do początku i kontynuuje rekurencyjnie.
źródło
JavaScript (
122135 bajtów)Nie najbardziej golfowy tutaj, można go trochę rozebrać.
Ten jest oparty na wyrażeniach regularnych i jest trochę trudny do zrozumienia, co się dzieje.
Ten jest jednowarstwowy.
Zasadniczo sprawdzam składnię, a następnie dzielę ciąg znaków na podstawie znaków i łączę go razem.
Zgłasza wyjątek, gdy podasz nieprawidłowe dane wejściowe.
Jeśli nie może zgłaszać wyjątków (
126139 bajtów):Oba są jednowarstwowe.
Oba działają w ten sam sposób.
Dziękuję @ edc65 za wykrycie przypadku krawędzi, który nie działał dobrze.
Możesz to przetestować tutaj (dane wyjściowe zostaną zapisane w dokumencie).
Opiera się na wersji, która wprowadza wyjątki po wprowadzeniu nieprawidłowego kodu.
Pokaż fragment kodu
(Obecnie występuje błąd we fragmentach stosu,
Mam napisanych na metaPytanie zostało już zadane wczoraj. Aby zadziałało, zastąpiłem$
go\x24
, który ma tę samą moc wyjściową. Możesz przeczytać o błędzie tutaj: http://meta.codegolf.stackexchange.com/questions/5043/stack-snippets-messing-with-js )źródło
><>><>>
. Myślę, że nie da się tak łatwo rozwiązać za pomocą Regexp, potrzebujesz trochę wstecz, backtrak lub cokolwiek ...Scala, 299 bajtów
Przypadki testowe
Wynik
źródło
Java, 288 bajtów
Sformatowany:
źródło
Nie zamierzałem wybierać wielkości, ale tutaj jest łatwy do zrozumienia sposób na zrobienie tego w Dart.
źródło
Python 3,
166164 bajtyRozwiązanie rekurencyjne. Późno na imprezę, ale pomyślałem, że i tak to opublikuję, ponieważ wyprzedza Sp3000
2022 bajty bez konieczności brutalnego wymuszania odpowiedzi.źródło