Mam poważny problem. Mam kilka plików tekstowych, w których trzymam moje bardzo ważne liczby - wszystkie ważne! I dwójki i trójki ..
Liczby te były tak ważne, że nie mogłem powierzyć ich nowym systemom liczb dziesiętnych lub binarnych. Zachowałem każdy numer zakodowany w jednym, ponieważ:
+--+
| |
+---+ +----+ |
| | | |
+---+ +-------+
~/two.txt
Prosty i niezawodny: dwie pętle ASCII dla liczby 2. Niestety, te rzeczy z czasem się zaplątują i teraz trudno mi ustalić, ile pętli znajduje się w każdym pliku. Oto kilka przykładów, które opracowałem ręcznie:
Jeden:
+---+
| |
+--+ |
| |
+--+ |
| |
| |
| |
+--+ +--+
| |
+---------+
Trzy:
+---------+
| +-----+ |
| | +-+ | |
| | | | | |
| | +-+ | |
| +-----+ |
+---------+
Cztery:
+--------------+
| +--+ +--+ |
| | | | | |
+-|-----|-----|----+
| | | | | | | |
| +--+ +--+ +--+ |
+------------------+
+------------+
| |
+-----+ +-----+ |
| | | |
+-----|-----------+ | |
| | +--+ | | | |
+-+ +--|--|--+ +---------+
| | +-+ | | |
+------+ | | | |
+-------+ | |
|| | |
|+-----+
| |
+---+
Pięć:
+--------+ +--------+ +--------+
| | | | | |
| +--|-----+ +--|-----+ |
| | | | | | | | | |
+-----|--+ +-----|--+ +--------+
| | | |
+--------+ +--------+
Czy możesz mi pomóc policzyć moje pętle?
Oto zasady:
- Ponieważ przechowuję wszystko w unarskim kodowanym przez ASCII, wydajność przestrzeni jest dla mnie bardzo ważna. Dlatego jest to kod golfowy. Najmniejszy program w bajtach wygrywa.
- Pętle są rysowane za pomocą znaków +, -, |. Każdy róg w pętli jest rysowany jednoznacznie: dokładnie jeden ze znaków powyżej i poniżej + będzie |, a dokładnie jeden po prawej lub lewej stronie będzie -. Dwa znaki + nigdy nie sąsiadują ze sobą.
- Pasemka mogą przechodzić nad i pod sobą. Kiedy nici się skrzyżują, natychmiast zobaczysz pasmo „pod” po obu stronach pasma „nad”.
- Twój program powinien pobrać ciąg znaków reprezentujący pętlę (od standardowego wejścia lub jako parametr funkcji) i wygenerować liczbę (do standardowego wyjścia lub jako wartość zwracaną).
- Długości linii mogą nie być jednolite na rysunku pętli, a na każdej linii mogą znajdować się spacje końcowe.
- Możesz założyć, że na wejściu jest co najmniej jedna pętla.
Liczę na Ciebie!
+
?Odpowiedzi:
SnakeEx - 98 bajtów z Javascriptem, 44 bez
Wyglądało to na dobry problem, aby wypróbować mój język z dwutygodniowego wyzwania na:
Najlepszym miejscem do wypróbowania tego jest mój tłumacz online .
SnakeEx dopasowuje wzorce w tekście, używając „węży”, które poruszają się po tekście dopasowując wyrażenia regularne. Kod brzmi jak wyrażenie regularne, z wyjątkiem:
<T>
Instrukcja. To polecenie kierunku, które rozgałęzia węża w lewo i prawo od bieżącego kierunku.{e<>PE}
jest jak wywołanie podprogramu. Odradza węża z definicjąe
poruszającą się do przodu (<>
) i parametramiP
(barana - wąż spawnujący podąża za nowym wężem) iE
(wyłącznie - nie pasuje do niczego, co już zostało dopasowane). Ta ekskluzywna kontrola jest jedyną rzeczą, która powstrzymuje węża przed nieskończonym zapętleniem.`
na końcu wskazuje, że poniższe elementy powinny być dopasowane tylko wtedy, gdy zostały już dopasowane, co możemy wykorzystać do wymuszenia zamknięcia pętli.Ponieważ SnakeEx jest jak wyrażenie regularne i technicznie nie generuje wyników zgodnie z oczekiwaniami, myślę, że musimy zawinąć go w JavaScript wywołujący interpreter:
Edycja : poprawiono, aby działał z dodatkowymi przypadkami testowymi blutorange
źródło
[^ ]
z[|\-]
;)C # - 338
388433bajtówZaoszczędzono kilka bajtów, zmieniając na jednowymiarową tablicę.
Najpierw odczytuje dane wejściowe i czyni je ładnymi i prostokątnymi, z obramowaniem, więc nie musimy wykonywać żadnych sprawdzeń w poziomie (tańsze jest sprawdzanie w pionie niż wstawianie dodatkowej linii) . Następnie spogląda wstecz przez prostokąt, więc zawsze uderza w prawy dolny róg. Kiedy trafi w któreś z nich, kieruje się w górę, podążając za znakiem +, który napotka, i usuwając je w miarę upływu czasu (spacją). Przestaje podążać, gdy napotka spację. Testowany na pięciu podanych przykładach.
źródło
Poślizg ,
5141 + 2 = 43 bajty(Teraz zaktualizowany do pracy z przypadkiem testowym @ blutorange za znaczny koszt)
Ponieważ @BMac użyło SnakeEx do tego wyzwania, pomyślałem, że spróbuję użyć mojego przesłania języka dopasowanego do wzorca 2D , Slip. Ale ponieważ Slip nie miał funkcji niezbędnych do rozwiązania tego problemu, dodawałem je w ciągu ostatnich kilku dni. Innymi słowy, to zgłoszenie nie kwalifikuje się do wygrania .
Uruchom z
n
flagą dla liczby dopasowań, npWypróbuj online .
Wyjaśnienie
Ze względu na mnóstwo nowych funkcji w tym zgłoszeniu jest to dobra okazja do ich zaprezentowania.
Slip próbuje dopasować zaczynając od każdej pozycji i zwraca tylko unikalne dopasowania. Zauważ, że używamy
[^ +]
- podczas używania[-|]
teoretycznie zaoszczędziłby dwa bajty, nieskalowany-
na początku / końcu klas znaków nie jest jeszcze zaimplementowany w Slipie.źródło
three
ma też+
s, które nie są jedno-
, jeden|
i 2 spacjami, więcRubin 295
Spróbuj go online: http://ideone.com/kIKELi ( dodałem
#to_a
połączenia na pierwszej linii, bo ideone.com używa Ruby 1.9.3, która nie obsługuje#size
dlaEnumerable
S w Ruby 2.1.5+ kod działa OK. . )Podejście jest następujące:
+
znaków na wejściu i uznać każdy z nich za odrębny kształt+
znaki i łączą ich kształty w jedenOto bardziej czytelna wersja:
źródło
JavaScript (ES6) 190
197 202 215 235 289 570Edytuj tablicę jednowymiarową zamiast 2 wymiarów, maksymalny rozmiar wiersza 999 znaków (ale może być więcej bez kosztów, np. 1e5 zamiast 999)
Edytuj Dodany fragment animowanego kodu, patrz poniżej
Pierwsza próba bez golfa
Animowany fragment kodu
Pokaż fragment kodu
Przetestuj w konsoli Firefox / FireBug
źródło
Ruby, 178
187199212Lepsza wersja ruby, tworzy funkcję F. Teraz z coraz smaczniejszymi ostrzeżeniami interpretera.
Przetestuj online: ideone
Zasadniczo funkcja
b
zaczyna się od dowolnej+
, rekurencyjnie przechodzi przez pętlę, ustawiając wszystko+
nau
. W ten sposób jedna pętla jest usuwana za każdym razem, gdyb
jest wywoływana. Funkcja sprawdzaF
tylko, jak często musimy dzwonić,b
dopóki nie zostaną żadne pętle.źródło
Python 2 - 390
Pobiera ciąg z nowymi wierszami ze standardowego wejścia. Jest to dość prosta metoda gry w golfa, ale jestem pewien, że nie tak bardzo, jak mogłoby to być biorąc pod uwagę, jak długo to trwa.
źródło
Python 2 - 346 bajtów
Zaimplementowano jako funkcję,
c
która pobiera dane pliku jako dane wejściowe i zwraca liczbę pętli.Po pierwsze, funkcja rozkłada dane na mapowanie lokalizacji elementów pętli na typ elementu w tej lokalizacji (np
{(0,0): '+'}
.). Następnie wykorzystuje dwie wzajemnie rekurencyjne funkcje wewnętrzne. Pierwszy usuwa segment pętli z mapowania i decyduje, które lokalizacje sprawdzić dla następnego segmentu. Drugi sprawdza, jaki rodzaj elementu pętli znajduje się w wybranych lokalizacjach i, jeśli jest zgodny z oczekiwanymi, wywołuje pierwszy, aby usunąć nowo znalezioną sekcję.źródło