Czy to się powtarza

20

Ciąg znaków powtarza się, jeśli zawiera dwa kolejne podciągi, które są równoważne.

Na przykład 2034384538452powtarza się, ponieważ zawiera 3845dwa razy po kolei.

Dlatego Twoim wyzwaniem jest zdecydowanie, czy łańcuch zawiera powtarzający się podciąg. Możesz wziąć dane wejściowe jako ciąg znaków lub tablicę znaków.

Nigdy nie otrzymasz pustego wejścia, a długość podłańcucha (jeśli istnieje) może wynosić 1 lub więcej.

Używam 1i 0tutaj jako moich prawdomównych i fałszywych wartości, ale możesz używać różnych wartości, o ile są one prawdziwe i fałszywe w twoim języku.

Przykłady:

abcab -> 0
bdefdefg -> 1
Hello, World! -> 1
pp.pp/pp -> 1
q -> 0
21020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021012102012101202102012021012102012021020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020120210201210120210201202101210201210120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120 -> 0

(Ostatni przykład został wygenerowany z liczby jedynek między każdym zerem w sekwencji Thue-Morse)

Okx
źródło
2
Czy mogę stosować niespójne wartości, o ile są one odpowiednio zgodne z prawdą lub falsey?
Erik the Outgolfer,
@EriktheOutgolfer Oczywiście
Okx,
@trichoplax Myślę, że ma na myśli kolejne podsekwencje długości> = 1.
Erik the Outgolfer
@EriktheOutgolfer „kolejne” to słowo, które mi umknęło. Dziękuję - teraz ma to sens.
trichoplax
Czy zamiast tego możemy wyprowadzić 1 dla falsey i 0 dla prawda?
Kritixi Lithos

Odpowiedzi:

12

Siatkówka , 6 bajtów

(.+)\1

Wypróbuj online!

Pozytywna wartość dla prawdy; zero dla falsey.

Jak to działa

Zwraca liczbę dopasowań wyrażenia regularnego /(.+)\1/g.

Leaky Nun
źródło
10

Brachylog , 3 bajty

s~j

Wypróbuj online!

s~j
s    exists a sublist of input
 ~j  which is the result of a juxtaposition of something
Leaky Nun
źródło
7

Galaretka , 6 5 bajtów

Ẇµ;"f

To jest pełny program. TIO nie może obsłużyć ostatniego przypadku testowego bez jego obcięcia.

Wypróbuj online! (ostatni przypadek testowy obcięty do 250 cyfr)

Jak to działa

Ẇµ;"f  Main link. Argument: s (string)

Ẇ      Words; generate all substrings of s.
 µ     New chain. Argument: A (substring array)
  ;"   Vectorized concatenation; concatenate each substring with itself.
    f  Filter; keep "doubled" substrings that are also substrings.
       This keeps non-empty string iff the output should be truthy, producing
       non-empty output (truthy) in this case and empty output (falsy) otherwise.
Dennis
źródło
5

Mathematica, 32 bajty

StringMatchQ[___~~x__~~x__~~___]
alephalpha
źródło
Czy nie wymaga to, aby powtarzające się podciągi ciągów sąsiadowały ze sobą?
DavidC
1
@Svetlana, masz rację! Nie wziąłem pod uwagę abcab-> 0.
DavidC
1
StringContainsQ[x__~~x__]i !StringFreeQ[#,x__~~x__]&oba są krótsze.
ngenisis
5

Java, 27 bajtów

a->a.matches(".*(.+)\\1.*")

Prawie duplikat odpowiedzi Retina , ale nie ma mowy, żeby Java była krótsza.

Nathan Merrill
źródło
5

05AB1E , 5 bajtów

Œ2×åZ

Wypróbuj online!

Wyprowadza 1 jako wartość prawdy i 0 jako wartość fałszu

Wyjaśnienie

Œ2×åZ
Π    # Substrings of input
 2×   # duplicate them (vectorized)
   å  # Is the element in the input? (vectorized)
    Z # Maximum value from list of elements
Datboi
źródło
4

Python , 38 bajtów

import re
re.compile(r'(.+)\1').search

Wypróbuj online!

Ziew, regex. Sprawdza, czy ciąg zawiera ciąg jednego lub więcej znaków, .+a następnie ten sam, który właśnie został przechwycony. Wyjściowym obiektem wyszukiwania jest Prawda, jeśli istnieje co najmniej jedno dopasowanie, co można sprawdzić za pomocą bool.

Użycie compiletutaj pozwala zaoszczędzić na pisaniu lambdy:

lambda s:re.search(r'(.+)\1',s)

Python , 54 bajty

f=lambda s:s>''and(s in(s*2)[1:-1])|f(s[1:])|f(s[:-1])

Wypróbuj online!

Wyszukuje podciąg składający się z dwóch lub więcej równych ciągów połączonych, sprawdzonych przez s in(s*2)[1:-1]jak w tej odpowiedzi . Podciągi są generowane rekurencyjnie poprzez wybranie odcięcia pierwszego lub ostatniego znaku. Jest to wykładnicze, więc przekracza limit czasu dla dużego przypadku testowego.

Niedaleko:

f=lambda s,p='':s and(s==p)*s+f(s[1:],p+s[0])+f(s[:-1])
f=lambda s,i=1:s[i:]and(2*s[:i]in s)*s+f(s[1:])+f(s,i+1)

Pierwszy nie używa Pythona indo sprawdzania podciągów i dlatego może być dostosowany do innych języków.

xnor
źródło
4

Pyth - 10 9 8 bajtów

f}+TTQ.:

Zwraca listę wszystkich powtarzających się podciągów (która, jeśli ich nie ma, jest pustą listą, co jest fałszem)

Spróbuj

Wyjaśnienie:

f}+TTQ.:
      .:    # All substrings of the input (implicit):
f           # filter the list of substrings T by whether...
  +TT       # ...the concatenation of the substring with itself...
 }   Q      # ...is a substring of the input
Maria
źródło
1
Jeśli f}+TTQ.:
założysz,
3

Cheddar , 60 bajtów

n->(|>n.len).any(i->(|>i).any(j->n.index(n.slice(j,i)*2)+1))

Wypróbuj online!

Leaky Nun
źródło
Możesz grać w golfa:@.test(/(.+)\1/)
Downgoat
@Downgoat Powinieneś po prostu przesłać to jako kolejną odpowiedź.
Leaky Nun
2

Perl 6 , 11 bajtów

{?/(.+)$0/}

Sprawdź to

Rozszerzony:

{        # bare block lambda with implicit parameter 「$_」

  ?      # Boolify the following
         # (need something here so it runs the regex instead of returning it)

  /      # a regex that implicitly matches against 「$_」
    (.+) # one or more characters stored in $0
     $0  # that string of characters again
  /
}
Brad Gilbert b2gills
źródło
2

PHP, 32 bajty

<?=preg_match('#(.+)\1#',$argn);

Uruchom jako potok z -F. Przepraszam, Jörg, nie zauważyłem, że opublikowałeś to samo .

wersja bez wyrażenia regularnego, 84 82 bajtów

    for($s=$argn;++$e;)for($i=0;~$s[$i];)substr($s,$i,$e)==substr($s,$e+$i++,$e)&&die

kończy z kodem powrotu 0dla powtórzenia, kończy się (i kończy się z błędem) dla braku. Uruchom jako potok z -nr.
zakłada wejście ASCII do wydruku; wymienić ~z a&jakiegokolwiek ASCII.

Tytus
źródło
1

JavaScript (ES6), 19 bajtów

s=>/(.+)\1/.test(s)
Kudłaty
źródło
Jak o /(.+)\1/.test?
Luke
To właśnie mam, @Luke.
Kudłaty
@Shaggy Wierzę, że oznacza on /(.+)\1/.testsiebie jako kompletne poddanie.
Leaky Nun
@Luke /(.+)\1/.testjest niezwiązany (nie ma this). f=/(.+)\1/.test;f('aa')na przykład nie działałby. Potrzebujesz/./.test.bind(/(.+)\1/)
Artyer
Możesz grać w golfa do: ::/(.+)\1/.test(15 bajtów)
zagrać w Downgoat
1

V. , 6 bajtów

ø¨.«©±

Wypróbuj online!

Pakiet testowy!

Program generuje 0wartości falsey i dodatnią liczbę całkowitą dla wartości dodatnich.

(Zauważ, że był mały błąd, więc musiałem zyskać 1 bajt. Teraz po poprawce będę mógł zastąpić go \x82)

Wyjaśnienie

ø                     " This is a recent addition to V. This command takes in a regex
                      " and replaces the line with the number of matches of the regex
 ¨.«©±                " The compressed regex. This decompresses to \(.\+\)\1
Kritixi Lithos
źródło
1

Japt, 8 + 1 = 9 8 bajtów

f"(.+)%1

Wypróbuj online . Wyjścia nulldo falsy i tablica zawierająca wszystkie powtarzające się łańcuchy na truthy.

Wyjaśnienie

 f"(.+)%1
Uf"(.+)%1" # Implicit input and string termination
Uf         # Find in the input
  "(.+)%1" #   a sequence followed by itself
 f         # and return the matched substring
           # output the return value
Luke
źródło
Dozwolone są niespójne wartości wyjściowe, więc można użyć èdo zwrócenia liczby dopasowań i upuszczenia flagi.
Kudłaty
Tak. Mógłbym też po prostu upuścić flagę, aby zwrócić sam mecz, ponieważ żaden mecz nie powraca null, co jest fałszem.
Luke
Na wejściu 00wysyła 00. Czy jesteś pewien, że to prawda w Japt?
Okx,
@Okx Ciąg "00"jest.
ETHproductions
@Okx; spróbuj tego . The -QFlag „prettyprints” wyjście, dzięki czemu można zobaczyć, że jest to tablica zawierająca pojedynczy łańcuch.
Shaggy
0

Cheddar, 16 bajtów

@.test(/(.+)\1/)

To jest funkcja. Wypróbuj online!

Downgoat
źródło