Est-ce que ça se répète?

20

Une chaîne de caractères se répète si elle contient deux sous-chaînes consécutives équivalentes.

Par exemple, se 2034384538452répète car il contient 3845deux fois de suite.

Par conséquent, votre défi consiste à décider si une chaîne contient une sous-chaîne répétitive. Vous pouvez prendre l'entrée comme une chaîne ou un tableau de caractères.

Vous ne recevrez jamais une entrée vide et la longueur de la sous-chaîne (si elle existe) peut être 1 ou plus.

J'utilise 1et 0ici comme mes valeurs de vérité et de fausseté, mais vous pouvez utiliser des valeurs différentes, tant qu'elles sont véridiques et fausses dans votre langue.

Exemples:

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

(Le dernier exemple a été généré à partir du nombre de uns entre chaque zéro dans la séquence Thue-Morse)

Okx
la source
2
Puis-je utiliser des valeurs incohérentes, tant qu'elles sont toujours correctement véridiques ou falsey?
Erik the Outgolfer
@EriktheOutgolfer Bien sûr
Okx
@trichoplax Je pense qu'il veut dire des sous-séquences consécutives de longueur> = 1.
Erik the Outgolfer
@EriktheOutgolfer "consécutif" était le mot que j'ai manqué. Merci - c'est tout à fait logique maintenant.
trichoplax
Pouvons-nous produire 1 pour falsey et 0 pour véridique à la place?
Kritixi Lithos

Réponses:

12

Rétine , 6 octets

(.+)\1

Essayez-le en ligne!

Valeur positive pour véridique; zéro pour falsey.

Comment ça fonctionne

Renvoie le nombre de correspondances de l'expression régulière /(.+)\1/g.

Leaky Nun
la source
10

Brachylog , 3 octets

s~j

Essayez-le en ligne!

s~j
s    exists a sublist of input
 ~j  which is the result of a juxtaposition of something
Leaky Nun
la source
7

Gelée , 6 5 octets

Ẇµ;"f

Ceci est un programme complet. TIO ne peut pas gérer le dernier cas de test sans le tronquer.

Essayez-le en ligne! (dernier cas de test tronqué à 250 chiffres)

Comment ça fonctionne

Ẇµ;"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
la source
5

Mathematica, 32 octets

StringMatchQ[___~~x__~~x__~~___]
alephalpha
la source
Cela ne nécessite-t-il pas que les sous-segments de chaînes répétitives soient adjacents?
DavidC
1
@Svetlana, vous avez raison! Je n'avais pas pris en compte abcab-> 0.
DavidC
1
StringContainsQ[x__~~x__]et !StringFreeQ[#,x__~~x__]&sont tous deux plus courts.
ngenisis
5

Java, 27 octets

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

Quasiment un double de la réponse Retina , mais il n'y a aucun moyen que Java raccourcisse.

Nathan Merrill
la source
5

05AB1E , 5 octets

Œ2×åZ

Essayez-le en ligne!

Sorties 1 comme valeur vraie et 0 comme valeur fausse

Explication

Œ2×åZ
Œ     # Substrings of input
 2×   # duplicate them (vectorized)
   å  # Is the element in the input? (vectorized)
    Z # Maximum value from list of elements
Datboi
la source
4

Python , 38 octets

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

Essayez-le en ligne!

Bâillement, une expression régulière. Vérifie si la chaîne contient une chaîne d'un ou plusieurs caractères .+suivie de la même chaîne qui vient d'être capturée. L'objet de recherche en sortie est Truthy s'il y a au moins une correspondance, comme cela peut être vérifié par bool.

L'utilisation compileici permet d'économiser sur l'écriture d'un lambda:

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

Python , 54 octets

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

Essayez-le en ligne!

Recherche une sous-chaîne composée de deux chaînes égales ou plus concaténées, comme vérifié par s in(s*2)[1:-1]comme dans cette réponse . Les sous-chaînes sont générées de manière récursive en choisissant de couper le premier ou le dernier caractère. C'est exponentiel, donc il expire sur le grand cas de test.

Évités de justesse:

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)

Le premier n'utilise pas Python inpour vérifier les sous-chaînes, et pourrait donc être adapté à d'autres langages.

xnor
la source
4

Pyth - 10 9 8 octets

f}+TTQ.:

Renvoie une liste de toutes les sous-chaînes répétitives (qui s'il n'y en a pas, est une liste vide, qui est fausse)

Essayez-le

Explication:

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
la source
1
Si vous supposez que l'entrée entre guillemets f}+TTQ.:fonctionne à partir de 1 octet de moins: lien
KarlKastor
3

Cheddar , 60 octets

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

Essayez-le en ligne!

Leaky Nun
la source
Vous pouvez @.test(/(.+)\1/)
jouer au
@Downgoat Vous devriez simplement soumettre cela comme une autre réponse, vraiment.
Leaky Nun
2

Perl 6 , 11 octets

{?/(.+)$0/}

Essaye-le

Étendu:

{        # 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
la source
2

PHP, 32 octets

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

Exécuter en tant que tuyau avec -F. Désolé Jörg, je n'avais pas remarqué que tu avais posté le même .

version non regex, 84 82 octets

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

quitte avec code retour 0pour une répétition, expire (et quitte avec erreur) pour aucune. Exécuter en tant que tuyau avec -nr.
suppose une entrée ASCII imprimable; remplacer ~par a&pour tout ASCII.

Titus
la source
1

JavaScript (ES6), 19 octets

s=>/(.+)\1/.test(s)
Hirsute
la source
Et alors /(.+)\1/.test?
Luke
C'est ce que j'ai, @Luke.
Shaggy
@Shaggy Je crois qu'il se veut /(.+)\1/.testlui-même la soumission complète.
Leaky Nun
@Luke /(.+)\1/.testn'est pas lié (n'a pas this). f=/(.+)\1/.test;f('aa')ne fonctionnerait pas, par exemple. Vous auriez besoin/./.test.bind(/(.+)\1/)
Artyer
Vous pouvez ::/(.+)\1/.test
jouer
1

V , 6 octets

ø¨.«©±

Essayez-le en ligne!

Suite de tests!

Les résultats du programme 0 génère des valeurs de falsey et un entier positif pour les valeurs positives.

(Notez qu'il y avait un petit bug, donc j'ai dû gagner 1 octet. Maintenant, après la correction du bug, je pourrai le remplacer par\x82 )

Explication

ø                     " 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
la source
1

Japt, 8 + 1 = 9 8 octets

f"(.+)%1

Essayez-le en ligne . Les sortiesnull pour faux, et un tableau contenant toutes les chaînes répétitives pour vérité.

Explication

 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
Luc
la source
Les valeurs de sortie incohérentes sont autorisées, vous pouvez donc utiliser èpour renvoyer le nombre de correspondances et supprimer l'indicateur.
Shaggy
Ouais. Je pourrais également laisser tomber le drapeau pour retourner le match lui-même, car aucun match ne revient null, ce qui est faux.
Luke
Pour l'entrée 00, il sort 00. Êtes-vous sûr que c'est vrai en Japt?
Okx
@Okx La chaîne "00"est.
ETHproductions
@Okx; essayez ceci . Le -Qdrapeau "prettyprints" la sortie afin que vous puissiez voir que c'est un tableau contenant une seule chaîne.
Shaggy
0

Cheddar, 16 octets

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

Ceci est une fonction. Essayez-le en ligne!

Downgoat
la source