AKTUALIZACJA : Zgłoszenie Pyth isaacga jest zwycięzcą!
Wielu z was musiało usłyszeć, że w mieście jest fajniejsza wersja JavaScript (czytaj ES6), która ma metodę, String.prototype.repeat
dzięki której można to zrobić
"Hello, World!".repeat(3)
i dostać
"Hello, World!Hello, World!Hello, World!"
jako wynik.
Twoim zadaniem jest napisanie funkcji lub programu w wybranym języku, który wykrywa, czy łańcuch nie został poddany takiej transformacji.
tzn. Łańcuch wejściowy może być reprezentowany jako dokładne n
powtórzenie razy mniejszego łańcucha. Wyjście (jako instrukcja return funkcji lub STDOUT) powinno być zgodne z prawdą, jeśli łańcuch może być, lub fałszem, jeśli łańcucha nie można przedstawić jako powtórzenia mniejszego łańcucha.
Niektóre przykładowe dane wejściowe:
"asdfasdfasdf" // true
"asdfasdfa" // false
"ĴĴĴĴĴĴĴĴĴ" // true
"ĴĴĴ123ĴĴĴ123" // true
"abcdefgh" // false
Zauważ, że ostatnie wejście jest fałszywe, dlatego n
powinno być większe niż1
Kompletne zasady
- Napisz funkcję / program w dowolnym języku, aby wprowadzić (za pomocą argumentu funkcji / argumentu wiersza poleceń / STDIN) ciąg znaków
- Zwróć / Drukuj prawdziwą wartość, jeśli dany ciąg powstaje przez dokładne powtórzenie mniejszego ciągu, co najmniej dwa razy.
- Maksymalny rozmiar ciągu wejściowego to idealnie Nieskończoność
- Ciąg może mieć wszystkie możliwe znaki ASCII
- To jest golf golfowy, więc wygrywa najmniejszy kod w postaci.
Odpowiedzi:
Pyth , 9
Lub
Są to zarówno bliskie tłumaczenia odpowiedzi python @ xnor, z tym wyjątkiem, że pobierają dane wejściowe ze STDIN i je drukują. Pierwszy jest równoważny z:
0 dla False, 1 dla True.
Druga linia odpowiada:
Fałsz za fałsz, prawda za prawda.
Oficjalny kompilator Pytha miał błąd związany z drugim, który właśnie załatałem, więc pierwszy to moje oficjalne zgłoszenie.
źródło
x
było zbyt długie ...Python (24)
Sprawdza, czy łańcuch jest podciągiem dwukrotnie połączonym, eliminując pierwszy i ostatni znak, aby uniknąć trywialnych dopasowań. Jeśli tak jest, musi to być niebanalna cykliczna permutacja samego siebie, a zatem suma powtarzających się segmentów.
źródło
..+);(;\?)
abcabc
.s+s
zamienia to wabcabcabcabc
. z[1:-1]
kotletów z dwoma końcami z wytworzeniembcabcabcabcab
. a następnies in ...
próbuje znaleźćabcabc
to podciąg. Tego podłańcucha nie można znaleźć w żadnej z pierwotnych połówek, ponieważ oba zostały skrócone, więc musi obejmować obie połówki. W szczególności musi mieć swój własny koniec przed rozpoczęciem, co oznacza, że musi składać się z identycznych (powtarzanych) podciągów.ab
stajeabab
sięba
, więc zwraca fałsz, aaa
stajeaaaa
sięaa
, co zwraca prawdę.qweqweqwe
inweqweqweqweqweqw
isTrue
.Regex (smak ECMAScript), 11 bajtów
Brzmi jak praca dla wyrażeń regularnych!
Sprawdź to tutaj.
Wybrałem ECMAScript, ponieważ jest to jedyny smak (wiem), w którym
[^]
pasuje dowolny znak. We wszystkich innych albo potrzebuję flagi, aby zmienić zachowanie.
lub użycie,[\s\S]
która jest o trzy znaki dłuższa.W zależności od tego, jak liczymy flagę, może to oczywiście być bajt krótszy. Np. Jeśli liczymy wzorzec + flagi (np. Ignorując ograniczniki), odpowiednikiem PCRE / Perla byłoby
Co oznacza 10 bajtów, ignorując ograniczniki.
Sprawdź to tutaj.
Dopasowuje tylko ciągi, które składają się z co najmniej dwóch powtórzeń niektórych podciągów.
Oto pełna 26-bajtowa funkcja ES6, ale uważam, że przesyłanie wyrażeń regularnych jest ogólnie poprawne:
źródło
^(.+)\1+$
działa dla mnie, czyli 9 bajtów. To ci nie działa?asd\nasd\nasd\n
. Działa\
pisaniem\n
CJam, 9
Podobne do pomysłu Xnora.
źródło
)
? Myślę, że uzasadnione jest, aby -1 oznaczało FAŁSZ, a> = 0 oznaczało PRAWDAg
i?
.#
operatorem wyszukiwania? Z pewnością wynik tego jest również „prawdomówny” z perspektywy sukcesu kontra porażki?APL, 11
Objaśnienie
⍞
pobiera ciąg znaków zx←
przypisań ekranowych do zmiennejx
,⍨
łączącej ciąg, który samx⍷
szukax
w ciągu wynikowym. Zwraca tablicę składającą się z 1 w początkowej pozycji meczu i 0 w innym miejscu.+/
sumuje2<
sprawdzenie tablicy, czy suma jest większa niż 2 (ponieważ będą 2 trywialne dopasowania)źródło
CJam, 10 bajtów
Złapałem błąd CJam. Moja pierwsza odpowiedź, więc prawdopodobnie można jeszcze zagrać w golfa:
Wyjścia -1 dla FAŁSZ i liczba> = 0 dla PRAWDA
źródło
GolfScript, 10 bajtów
Kolejna implementacja sprytnego pomysłu xnor.
źródło
)
Mimo to w twoim kodzie brakuje ; gdy nie pasuje, zostanie wydrukowane-1
. Jeśli masz zamiar wysłać to jako odpowiedź, chętnie usunę moje.)
tuż przed opublikowaniem odpowiedzi (edytowałem komentarz)q__+)@+#)
. Nie działa w GolfScript.Python -
5957źródło
Pure Bash, 30 bajtów
Prosty port sprytnej odpowiedzi @ xnor :
Kod zakończenia to 0 dla PRAWDA i 1 dla FAŁSZ:
Uwaga:
=~
w wyrażeniu bash[[ ... ]]
znajduje się operator wyrażenia regularnego . Jednak „można zacytować dowolną część wzorca, aby wymusić dopasowanie go jako łańcucha” . Tak więc, jak to często bywa w przypadku bash, poprawne cytowanie jest bardzo ważne - tutaj chcemy po prostu sprawdzić przesłanie ciągu, a nie dopasowanie wyrażenia regularnego.źródło
TI-BASIC - 32
Myślałem, że spróbuję tokenizowanego języka. Uruchom z ciągiem w Ans, zwraca 0, jeśli false, a długość powtarzanego ciągu, jeśli true.
Niesamowite, jak to jest jedna linijka.
źródło
ECMAScript 6 (189)
Czy to jedyne prawidłowe rozwiązanie? Na przykład słowo (ciąg)
nana
niekoniecznie jest tworzone z"na".repeat(2)
źródło
"nana"
nie jest, ale pytaniem nie jest sprawdzenie, czy.repeat
został użyty, czy nie. Raczej, czy ciąg jest powtórzony, czy nieECMAScript 6 (34
36)Kolejna odpowiedź ES6, ale bez używania
repeat
i korzystania sztuczkę XNOR za :Musi być uruchomiony w konsoli przeglądarki obsługującej ES6, takiej jak Firefox.
źródło
C 85
Okazało się, że jest dość długi, ale funkcje zewnętrzne są zawsze takie. Przyszło mi do głowy, że mogę przepisać każdą funkcję łańcuchową, zastępując je pętlą lub funkcją rekurencyjną. Ale z mojego doświadczenia wynika, że okaże się to dłuższe i szczerze mówiąc nie chcę tego wypróbowywać.
Po kilku badaniach zobaczyłem rozwiązania o wysokiej wydajności, ale nie tak sprytne (i krótkie) jak xnor. żeby być oryginalnym ... przepisałem ten sam pomysł w ok.
wyjaśnienie:
źródło
ECMAScript 6 (59
626773)Nie jest zwycięzcą, ale wydaje się, że w ES6 powinna być przynajmniej jedna odpowiedź na to pytanie, które faktycznie korzysta z
repeat
funkcji:Musi być uruchomiony w konsoli przeglądarki obsługującej ES6, takiej jak Firefox.
Robi wiele niepotrzebnych iteracji, ale po co wydłużać czas, aby tego uniknąć, prawda?
źródło
[...i]
zamiasti.split('')
0..N
. Dzięki!.slice(0,j)
jest jedną postacią krótszą niż.substr(0,j)
. Ponadto konwersja na liczbę całkowitą wydaje się niepotrzebna,|0
można ją usunąć (użycie|0
faktycznie zmniejsza przydatność metody, ponieważ zakończy się niepowodzeniem w przypadku powtórzeń przekraczających 2 ^ 31).Galaretka , 3 bajty
Wypróbuj online!
Taki sam jak ta odpowiedź (może późniejsze wyzwanie jest uogólnieniem tego?).
źródło
Java 8, 28 bajtów
Wypróbuj online.
Wyjaśnienie:
Sprawdza, czy ciąg wejściowy pasuje do wyrażenia regularnego, gdzie
String#matches
niejawnie dodaje się,^...$
aby dopasować cały ciąg.Objaśnienie samego wyrażenia regularnego:
Więc w zasadzie sprawdza, czy podciąg jest powtarzany dwa lub więcej razy (obsługując nowe wiersze).
źródło