Łańcuch x
generuje łańcuch, y
jeśli y
jest podciągiem nieskończonego powtórzenia x
. Na przykład abc
generuje bcabcab
.
Napisz program, aby znaleźć najkrótszy, najmniejszy leksykograficznie ciąg znaków, który wygeneruje dane wejściowe. Przy standardowym wprowadzaniu podawany jest pojedynczy wiersz tekstu. Powinieneś wydrukować ciąg generujący na standardowe wyjście. Na przykład:
Wejście
bcabcabca
wynik
abc
Najkrótszy kod wygrywa. Możesz założyć, że dane wejściowe zawierają tylko znaki az (i końcowy znak nowej linii, jeśli chcesz).
code-golf
kolmogorov-complexity
subsequence
Keith Randall
źródło
źródło
bac
w twoim przykładzie, a nieabc
?bac
s.(bca)^n
, co oznacza, żebca
jest tak samo ważne dla podanego przykładu, jakabc
.bca
nie jest najmniejszym leksykograficznie.Odpowiedzi:
Ruby 1.9, 40 znaków
Zakłada, że wejście nie jest zakończone znakiem nowej linii. Prawdopodobnie jest też absurdalnie powolny dla większych wyników.
źródło
Python
88185 znakówWynik:
źródło
bacabac
poprawnie.Haskell,
299128 znakówDzięki jloy! Teraz wersja jest znacznie krótsza i uważam, że jest poprawna.
źródło
cabcabcabc
generowaneabcabc
, więc tego rozwiązania nie ma. Myślę, że musisz zmodyfikowaćq++q++q
, aby uzyskać pożądany wynik. Jednak moja szybka próba naprawienia podskoczyła do 145 znaków. (Spoilery są tutaj: gist.github.com/1035161 )(/=)""
warunku? Wydaje się, że nic nie robi. Ponadto pomaga pozbyć się lambdas: możesz całkowicie pozbyć się w za pomocą.
operatora i zmienić główną funkcję,main=interact s
aby zapisać kilka znaków.permutations
zamiasttails
.Python,
121137129 znakówEDYCJA: naprawiono błąd wykryty przez JiminP
źródło
aabab
dla łańcuchaababa
... :(Ruby 1.9, 36
Stosuje to samo podejście, co rozwiązanie Ventero.
źródło
Pyton,
161 159 166 140 141 141 134132 znakiEDYCJA : Odczytałem kod po przeczytaniu komentarza Julesa Olléona. Usunięto błąd, który
bcdabcdab
powodujeabbc
.EDYCJA 2 : Naprawiono błąd (
abaa
wyniki waaa
) zauważony przez Julesa Olléona.Nie znam dobrze Pythona, więc ten kod prawdopodobnie nie jest „golfem”.
Uwielbiam tę zasadę:
Możesz założyć, że dane wejściowe zawierają tylko znaki az ...
Wejścia wyjścia
źródło
i-=1
zamiasti=i-1
. Podobnie dla przyrostu.Matematyka 124 bajty
Białe znaki i znaki nowej linii (w obecności średników na końcach wierszy) nie mają znaczenia w Mathematica i zostały tutaj uwzględnione dla czytelności.
Dane wejściowe znajdują się między znakami cudzysłowu w pierwszym wierszu. W przypadku przekształcenia jako funkcji, pobiera ciąg znaków w następujący sposób:
to jest 128 bajtów.
For
Pętla zajmuje pierwszei
znaki wejścia i powtarza je co najmniej do długości wejściowych, a następnie sprawdza, czy wejście jest podciąg wyniku. Po znalezieniu długości okresu łańcucha,StringPartition
polecenie konkatenuje dwie kopie tego okresu i pobiera z niego wszystkie podciągi o tej długości (w zasadzie pobiera wszystkie permutacje cykliczne), a następnieFirst@Sort
wyszukuje pierwszy z nich, gdy jest uporządkowany leksykograficznie.źródło
javascript 96 znaków.
Working Plunkr
źródło