MISE À JOUR : La soumission isaacg de Pyth est la gagnante!
Beaucoup d’entre vous ont sûrement entendu dire qu’il existe une version plus fraîche de JavaScript en ville (lisez ES6), qui dispose d’une méthode String.prototype.repeat
permettant de le faire.
"Hello, World!".repeat(3)
et obtenir
"Hello, World!Hello, World!Hello, World!"
comme sortie.
Votre travail consiste à écrire une fonction ou un programme dans la langue de votre choix afin de détecter si une chaîne a été transformée.
C'est-à-dire que la chaîne en entrée peut être représentée comme une n
répétition exacte de l' heure d'une chaîne plus petite. La sortie (en tant qu'instruction return ou STDOUT de la fonction) doit être true si la chaîne peut être ou falsy si la chaîne ne peut pas être représentée sous la forme d'une répétition de chaîne plus petite.
Quelques exemples d'entrées:
"asdfasdfasdf" // true
"asdfasdfa" // false
"ĴĴĴĴĴĴĴĴĴ" // true
"ĴĴĴ123ĴĴĴ123" // true
"abcdefgh" // false
Notez que la dernière entrée est fausse, elle devrait donc n
être supérieure à1
Règles complètes
- Écrivez une fonction / un programme dans n’importe quelle langue pour saisir (via l’argument de la fonction / les arguments de la ligne de commande / STDIN) une chaîne
- Renvoie / Imprime une valeur de vérité si la chaîne donnée est formée via la répétition exacte d'une chaîne plus petite, en répétant au moins deux fois.
- La taille maximale de la chaîne d'entrée est idéalement Infinity
- La chaîne peut avoir tous les caractères ASCII possibles
- C'est un code-golf si le code le plus petit des personnages gagne.
Réponses:
Pyth , 9
Ou
Ce sont deux traductions proches de la réponse python de @ xnor, à la différence près qu'elles prennent l'entrée de STDIN et l'impriment. Le premier est équivalent à:
0 pour faux, 1 pour vrai.
La deuxième ligne est équivalente à:
False pour False, True pour True.
Le compilateur officiel de Pyth avait un bogue lié au second, que je viens de corriger, le premier est donc ma soumission officielle.
la source
x
était trop longue ...Python (24)
Vérifie si la chaîne est une sous-chaîne d'elle-même concaténée deux fois, en éliminant les premier et dernier caractères pour éviter les correspondances triviales. Si c'est le cas, il doit s'agir d'une permutation cyclique non triviale d'elle-même, et donc de la somme de segments répétés.
la source
..+);(;\?)
abcabc
.s+s
le transforme enabcabcabcabc
. les[1:-1]
côtelettes des deux bouts à céderbcabcabcabcab
. ets in ...
essaie ensuite de trouverabcabc
une sous-chaîne de cela. Cette sous-chaîne ne peut être trouvée dans aucune des moitiés d'origine, car elles ont toutes les deux été raccourcies et doivent donc s'étendre sur les deux moitiés. En particulier, il doit avoir sa propre fin avant son début, ce qui implique qu'il doit être composé de sous-chaînes identiques (répétées).ab
devientabab
devientba
, donc il retourne faux, alors queaa
devientaaaa
devientaa
, qui retourne vrai.qweqweqwe
inweqweqweqweqweqw
isTrue
.Regex (saveur ECMAScript), 11 octets
Cela ressemble à un travail pour regex!
Testez-le ici.
J'ai choisi ECMAScript, car c'est la seule saveur (je sais) dans laquelle
[^]
correspond n'importe quel caractère. Dans tous les autres cas, il me faudrait un drapeau pour changer le comportement de.
ou utiliser[\s\S]
trois caractères de plus.Selon la façon dont nous comptons le drapeau, cela pourrait bien sûr être un octet plus court. Par exemple, si nous comptons modèle + drapeaux (par exemple en ignorant les délimiteurs), l’équivalent PCRE / Perl serait
Ce qui correspond à 10 octets, en ignorant les délimiteurs.
Testez-le ici.
Cela correspond uniquement aux chaînes qui consistent en au moins deux répétitions de certaines sous-chaînes.
Voici une fonction ES6 complète de 26 octets, mais je maintiens que les soumissions d’expression régulière sont généralement valides:
la source
^(.+)\1+$
fonctionne pour moi, qui est de 9 octets. Ça ne marche pas pour toi?asd\nasd\nasd\n
. Cela fonctionne\
quand j'écris\n
manuellementCJam, 9
Semblable à l'idée de xnor.
la source
)
? Je pense qu'il est raisonnable d'avoir -1 signifie FAUX et> = 0 signifie VRAIg
et?
.#
opérateur de recherche? Le résultat de cela est sûrement aussi la "vérité" du point de vue du succès vs de l'échec?APL, 11
Explication
⍞
prend une chaîne de caractères à partir desx←
assignations d’ écran à une variablex
,⍨
concatène la chaîne avec elle-mêmex⍷
recherchex
dans la chaîne résultante. Retourne un tableau composé de 1 à la position de départ d'une correspondance et de 0 ailleurs.+/
somme la2<
vérification du tableau si la somme est supérieure à 2 (car il y aura 2 correspondances triviales)la source
CJam, 10 octets
J'ai attrapé le virus CJam. Ma première réponse, donc peut probablement être joué au golf un peu plus:
Sorties -1 pour FALSE et un nombre> = 0 pour TRUE
la source
GolfScript, 10 octets
Encore une autre implémentation de l’idée intelligente de xnor.
la source
)
cependant; quand il n'y a pas de correspondance, ça va imprimer-1
. Si vous voulez y répondre en guise de réponse, je supprimerai volontiers le mien.)
juste avant de poster votre réponse (j'ai modifié le commentaire)q__+)@+#)
. Cela ne fonctionne pas dans GolfScript.Python -
5957la source
Pure bash, 30 octets
Port simple de la réponse intelligente @ xnor :
Le code de sortie est 0 pour VRAI et 1 pour FAUX:
La note en
=~
dedans[[ ... ]]
est l'opérateur de regex dans bash . Cependant "Toute partie du motif peut être citée pour le forcer à correspondre sous forme de chaîne" . Comme c’est souvent le cas avec bash, il est très important d’obtenir des guillemets exacts. Ici, nous voulons simplement vérifier la présence d’une chaîne et non d’une correspondance regex.la source
TI-BASIC - 32
Je pensais que j'essaierais un langage symbolique. Exécuter avec la chaîne dans Ans, renvoie 0 si faux et la longueur de la chaîne répétée si vrai.
Incroyable comme c'est un one-liner.
la source
ECMAScript 6 (189)
C’est sûrement la seule solution valable? Par exemple, le mot (chaîne)
nana
n'est pas nécessairement créé à partir de"na".repeat(2)
la source
"nana"
Ce n’est pas le cas, mais la question n’est pas de savoir s’il a.repeat
été utilisé ou non. Plutôt, que la chaîne soit répétée ou nonECMAScript 6 (34
36)Une autre réponse de ES6, mais sans utiliser
repeat
et utiliser le truc de xnor :Doit être exécuté dans la console d'un navigateur compatible ES6 tel que Firefox.
la source
C 85
Cela s'est avéré être assez long, mais les fonctions externes sont toujours comme ça. Il m'est venu à l'esprit que je pouvais réécrire chaque fonction de chaîne en les remplaçant par une boucle ou une récursive. Mais, selon mon expérience, les résultats seraient plus longs et, franchement, je ne veux pas essayer.
Après quelques recherches, j'ai trouvé des solutions hautes performances mais pas aussi intelligentes (et courtes) que celle de xnor. juste pour être original ... j'ai réécrit la même idée en c.
explication:
la source
ECMAScript 6 (59
626773)Pas un gagnant, mais il semble qu'il devrait y avoir au moins une réponse dans ES6 pour cette question qui utilise réellement la
repeat
fonction:Doit être exécuté dans la console d'un navigateur compatible ES6 tel que Firefox.
Il fait beaucoup d'itérations inutiles, mais pourquoi le prolonger pour éviter cela, non?
la source
[...i]
au lieu dei.split('')
0..N
. Merci!.slice(0,j)
est un caractère plus court que.substr(0,j)
. En outre, la conversion en un entier semble inutile|0
peut être supprimée (l’utilisation|0
réduit en réalité l’utilité de la méthode car elle échouera pour les répétitions dépassant 2 ^ 31).Gelée , 3 octets
Essayez-le en ligne!
Identique à cette réponse (le dernier défi est peut-être une généralisation de celle-ci?).
la source
Java 8, 28 octets
Essayez-le en ligne.
Explication:
Vérifie si la chaîne d'entrée correspond à l'expression régulière, où elle est
String#matches
implicitement ajoutée^...$
pour correspondre à la chaîne entière.Explication de la regex elle-même:
Donc, il vérifie fondamentalement si une sous-chaîne est répétée deux fois ou plus (en prenant en charge les nouvelles lignes).
la source