Wejście
Pierwszy wiersz będzie pewnym ciągiem powtarzanym dowolną liczbę razy. Na przykład, może to być abcabcabcabc
, [];[];[];
itp mogą być odcięte; na przykład: 1231231231
. Zawsze znajdź najkrótszy ciąg; Na przykład, jeśli linia jest 22222
, to ciąg jest 2
, nie 22
lub 22222
czy cokolwiek innego. Ciąg zawsze będzie powtarzany co najmniej 2 razy.
Wszystkie kolejne wiersze będą wzorami przesuniętymi o dowolną liczbę. Może to być na przykład:
abcabcabc
cabcabcab
bcabcabca
(przesunięty o 1) lub może to być:
abcdefabcdefabcdefabc
cdefabcdefabcdefabcde
efabcdefabcdefabcdefa
(przesunięty o 4).
Jeden ze znaków na wejściu będzie niepoprawny. (Gwarantujemy, że nie będzie w pierwszym wierszu.) Na przykład w tym danych wejściowych:
a=1a=1a=1
=1a=1a=1a
1a=11=1a=
a=1a=1a=1
=1a=1a=1a
1
na linii 3 jest dziwne jeden.
Wynik
Musisz wyprowadzić (od zera, zaczynając od lewego górnego) współrzędne nieparzystej. Na przykład w powyższym wejściu odpowiednie wyjście to 4,2
. Możesz także wyprowadzać dane wyjściowe 4 2
, a "4""2"
nawet [[4],[2]]
, nawet w dowolnym innym formacie, pod warunkiem, że wiesz, jaki powinien być wynik.
Przypadki testowe
Wejście:
codegolfcodegolfco
egolfcodegolfcodeg
lfcodegolfcodegoff
odegolfcodegolfcod
golfcodegolfcodego
fcodegolfcodegolfc
Wynik: 16,2
Wejście:
][[][][[][][[][][[][][[
[][][[][][[][][[][][[][
[][[][][[][][[][][[][][
[[][][[]]][[][][[][][[]
Wynik: 8,3
Wejście:
...
. .
...
Wynik: 1,1
Wejście:
ababa
babab
ababb
babab
Wynik: 4,2
abc/cab/abc
- i wydrukować0 2
tutaj?Odpowiedzi:
BashPerl,231229218178164166138106 10674 bajtówSkrypt wymaga użycia
-n
przełącznika, który odpowiada za dwa bajty.Pomysł dołączenia dwóch kopii wszystkich pełnych powtórzeń wzorca wziął się z odpowiedzi MT0 .
W przeciwieństwie do wszystkich innych odpowiedzi, podejście to próbuje wyodrębnić wzór bieżącej linii wejściowej w każdej iteracji; nie powiedzie się na linii zawierającej znak nieparzysty (i zamiast tego użyje wzoru z poprzedniej linii). Odbywa się to w celu uwzględnienia ekstrakcji wzorca w pętli, co pozwala zaoszczędzić kilka bajtów.
Wersja bez golfa
Przykład
Do przypadku testowego
wyjście z wersji golfowej jest
co oznacza, że nieparzysty znak ma współrzędne
16,2
.To
rażąco nadużywanewykorzystuje liberalny format wyjściowy.Tuż przed wyjściem zawartość niektórych zmiennych specjalnych Perla to:
(
$n
zawiera dopasowanie wzorca dostępnego poprzez odnośnik wsteczny\n
).źródło
^((.*?)(.*?))(?=\1+\2$)
Perl,
212191181168 bajtówchomp
zamiast tegochop
należy użyć.Stara wersja, 212 bajtów:
Wersja bez golfa:
źródło
chop
jest niepotrzebny - należy go usunąć. finałexit print
można zastąpićdie
(dodaj,,$/
aby ukryć dodatkowe rzeczy (w razie potrzeby)). równieżlength$_
można zastąpićy///c
chop
, ponieważ$
dopasowania przed znakiem nowej linii na końcu łańcucha. Ukrywanie dodatkowych rzeczydie
za pomocą dodanego nowego wiersza wydaje mi się konieczne.y///c
Jest także znacznie krótszy niżlength$_
i jeden bajt krótszy niżlength
bez niepotrzebnego$_
.C, 187 bajtów
Ograniczenia
Wersja golfowa
Wersja bez golfa
źródło
Python,
303292Wejście przechodzi przez standardowe wejście. Wyjaśnię to, jeśli będzie jakieś zapotrzebowanie, ale i tak nie wygląda na to, że wygram.
źródło
Perl,
157154Edycja : -3 dzięki sugestii ardnew.
Zajęło mi to trochę czasu (włączanie i wyłączanie, oczywiście, nie 5 dni ;-)), a pomysł na algorytm był początkowo nieuchwytny (choć czułem, że tam był), ale w końcu (i nagle) wszystko stało się jasne.
Jeśli długość łańcucha jest wielokrotnością długości wzoru, a nawet jeśli łańcuch nie zaczyna się od początku wzoru, łańcuch konkatenujący ze sobą wytworzy wzór zamiast konkatenacji (wyobraź sobie nieskończone powtarzanie słowa na okrągłej wstążce - miejsce spawanie nie jest ważne). Pomysł polega więc na przycięciu linii do wielu jednostek długości i połączeniu z nią oryginału. Wynik, nawet w przypadku łańcucha zawierającego niewłaściwy znak, gwarantuje dopasowanie do wzorca co najmniej raz. Odtąd łatwo jest znaleźć pozycję obrażającej się postaci.
Pierwsza linia jest bezwstydnie zapożyczona z odpowiedzi Heiko Oberdiek :-)
źródło
/.{$n}/;$_=$&.$_;
zs/.{$n}/$&$&/;
JavaScript (ES6) -
147133136 znakówOczekuje, że łańcuch, który ma zostać przetestowany, znajduje się w zmiennej
s
i przekazuje wynik do konsoli.Przypadek testowy 1
Wyjścia
Przypadek testowy 2
Wyjścia
Przypadek testowy 3
Wyjścia
Przypadek testowy 4
Wyjścia
Przypadek testowy 5
Wyjścia
Przypadek testowy 6
Wyjścia
źródło
s="xyxy\nyyxy"
. Dla drugiej liniimatch[4]
będzieyy
; powinno być po prostuy
.abab
wzórababaababa
; musisz użyć^…$
./^…\n/
działa lub/^…$/m
^
(przynajmniej nie dla żadnego z 6 przypadków testowych, które wymieniłem - ale prawdopodobnie istnieje przeciwny przykład, w którym to zrobił, więc zostawiłem go).