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)


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.



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.

5

Mathematica, 32 octets

StringMatchQ[___~~x__~~x__~~___]

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

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

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.


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

1
Si vous supposez que l'entrée entre guillemets f}+TTQ.:fonctionne à partir de 1 octet de moins: lien
— KarlKastor




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
  /
}

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.


1

JavaScript (ES6), 19 octets

s=>/(.+)\1/.test(s)

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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.