Parfois, il arrive qu'en tapant une phrase, je suis distrait et je finis par taper deux fois de suite le même couple de mots deux fois de suite.
Pour vous assurer que les autres personnes ne sont pas gênées par cela, votre tâche consiste à écrire un programme qui résout ce problème!
Tâche
Étant donné une chaîne d'entrée (si cela est important pour votre langue, vous pouvez supposer une entrée ASCII uniquement qui ne contient pas de sauts de ligne.) str
, Qui contient quelque part en son milieu une sous-chaîne qui se produit deux fois de suite immédiatement, renvoyez la chaîne avec une instance de ceci sous-chaîne supprimée.
Dans le cas de plusieurs possibilités, renvoyez la réponse la plus courte possible (c'est-à-dire, choisissez la sous-chaîne répétitive consécutive la plus longue et supprimez-la).
Dans le cas de plusieurs sous-chaînes répétitives consécutives de longueur égale, supprimez la première (c'est-à-dire la première rencontrée lors de la lecture de la chaîne d'avant en arrière).
Vous pouvez supposer que l'entrée est correcte (c'est-à-dire qu'elle contient toujours une sous-chaîne répétée consécutive), ce qui pourrait aider à la réduire.
Exemples
- Entrée:
hello hello world
-> Sortie:hello world
. - Entrée:
foofoo
-> Sortie:foo
. (Donc: oui, la chaîne peut ne se composer que de la partie répétée deux fois). - Entrée:
aaaaa
-> Sortie:,aaa
car la plus longue sous-chaîne répétée consécutive est iciaa
. - Entrée:
Slartibartfast
-> Ce n'est pas une entrée valide, car elle ne contient pas de sous-chaîne répétitive consécutive, vous n'avez donc pas besoin de gérer ce cas. - Entrée:
the few the bar
-> Ceci est une autre entrée non valide, car la partie répétitive doit suivre immédiatement la partie d'origine. Dans ce cas,the
etthe
sont séparés par quelque chose d'autre entre eux, donc cette entrée n'est pas valide. - Entrée:
ababcbc
-> Sortie:abcbc
. Les deux sous-chaînes répétitives consécutives les plus longues possibles sontab
etbc
. Commeab
on le rencontre plus tôt dans la chaîne, celle-ci est la bonne réponse. - Entrée:
Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo
. Sortie:Buffalo buffalo buffalo buffalo Buffalo buffalo
. (Le remplacement effectué doit être sensible à la casse). - Entrée:
Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.
-> Sortie:Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.
. Seule la plus longue sous-chaîne répétée consécutive est supprimée.
Votre code doit être aussi court que possible, car il s'agit de code-golf , donc la réponse la plus courte en octets l'emporte. Bonne chance!
Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.
en entrée, la sortie doit êtreSometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.
. Seule la duplication trouvée la plus longue est supprimée.p
enhappens
Réponses:
Perl 6 , 40 octets
Essayez-le
la source
Rétine ,
3533 octetsLe nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne!
Explication
Étant donné que les moteurs d'expression régulière recherchent des correspondances de gauche à droite, il n'est pas trivial de trouver la correspondance la plus longue quelle que soit la position. Cela peut être fait avec les groupes d'équilibrage de .NET, mais le résultat est plutôt désagréablement long:
J'ai donc pensé que j'essaierais d'éviter cela en utilisant d'autres fonctionnalités Retina.
Nous commençons par appliquer essentiellement toutes les substitutions possibles, une sur chaque ligne. Pour ce faire, nous faisons correspondre la position devant une correspondance (au lieu de la correspondance elle-même), pour permettre des correspondances qui se chevauchent. Cela se fait en mettant le vrai regex dans une anticipation. Ce lookahead capture ensuite le reste, sauf le doublon que nous voulons supprimer dans le groupe 2. Nous réécrivons le groupe 2 (suppression du doublon), un saut de ligne, puis toute l'entrée jusqu'à la correspondance, ce qui nous donne essentiellement une nouvelle ligne pour être substitué.
À la fin, nous aurons une ligne pour chaque correspondance, le doublon correspondant étant supprimé. À la fin, il y aura également une entrée complète à nouveau sans aucune substitution.
Maintenant que nous avons toutes les substitutions possibles, nous voulons le résultat le plus court (ce qui correspond à la répétition supprimée la plus longue).
Nous trions donc d'abord les lignes par longueur.
Et puis on ne garde que la première ligne.
la source
Gelée ,
2219 octets-2 octets grâce à Dennis (éviter une inversion d'argument, supprimer l'incrément subtilement redondant)
Essayez-le en ligne!
Programme complet (un bug a été trouvé avec le fait de
ÐṀ
ne pas agir avec l'arité correcte sur les dyades, qui sera bientôt corrigé; bien que je ne suis pas sûr que cela puisse rendre le code plus court ici).Comment?
Recherche la première des tranches les plus longues de l'entrée de sorte qu'une répétition existe dans l'entrée et la supprime de l'entrée.
la source
JavaScript (ES6),
8174 octetsEdit: sauvé 7 octets en volant le
m[r.length]
truc de @ Arnauld .la source
PowerShell , 87 octets
Essayez-le en ligne! (tous les cas de test)
Explication
En partant de l'intérieur, nous exécutons
Matches
avec l'(.+)\1
expression régulière, pour renvoyer tous les objets de correspondance pour la chaîne spécifiée. L'expression régulière correspond à n'importe quelle séquence de caractères qui est suivie par elle-même.Les objets de correspondance résultants sont ensuite redirigés
sort
pour être triés selon leurLength
propriété (raccourci en caractère générique). Il en résulte un tableau de correspondances triées par longueur, croissant, donc indexez avec[-1]
pour obtenir le dernier élément (le plus long). La valeur de cette correspondance est cependant la correspondance, pas le groupe, donc elle inclut la répétition, nous récupérons donc l'objet Group (|% Gr*
), puis la valeur de that (|% V*
) pour obtenir la plus grande chaîne répétée. La chose est que l'objet groupe est en fait un tableau parce que le groupe 0 est toujours la correspondance, mais je veux le groupe réel (1), donc la valeur résultante est en fait la valeur s , donc l'indexation pour obtenir le deuxième élément[1]
. Cette valeur est convertie en un objet regex lui-même, puis leReplace
est appelée par rapport à la chaîne d'origine, en la remplaçant par rien, et seule la première correspondance est remplacée (|% Re* $s '' 1
).la source
Haskell , 101 octets
La fonction principale est
f
, il prend et retourne aString
.Essayez-le en ligne!
Quand j'ai commencé, j'importé
Data.List
et utilisémaximum
,tails
,inits
etisPrefixOf
. D'une manière ou d'une autre, cela s'est transformé en ceci. Mais je n'ai réussi à raser que 11 octets ...Remarques
splitAt
/a
divise une chaîne à un index donné.s
est la chaîne d'entrée.i
est la liste des nombres[0 .. length s - 1]
,-1
c'est de contourner cela quisplitAt
se divise à la fin si on lui donne un index trop grand.n
estlength s
moins l'objectif de longueur actuel pour la partie répétée, il est choisi de cette façon afin que nous n'ayons pas à utiliser deux listes de nombres et / ou la syntaxe de liste décroissante détaillée.p
,r
Ett
sont une fraction à trois voies des
, avecr
la partie destinée répétée. Lefmap
il utilise le(,) String
Functor
pour éviter une variable pour un fractionnement intermédiaire.!!0
sélectionne le premier élément de la liste des correspondances.la source
Gelée ,
2321 octetsMerci à @JonathanAllan pour son
Ṭœp
idée qui a permis d'économiser 2 octets.Essayez-le en ligne!
la source
Mathematica,
636059 octets4 octets enregistrés grâce à Martin Ender .
Fonction anonyme. Prend une chaîne en entrée et renvoie une chaîne en sortie.
la source
~SortBy~StringLength
trie les chaînes par ordre alphabétique si leurs longueurs sont les mêmes ...SortBy
et à envelopperStringLength
dans une liste pour obtenir un tri stable.JavaScript (ES6), 70 octets
Cas de test
Afficher l'extrait de code
la source
aaaabaaab
, mais bonne utilisation dereduce
.Cela devrait être un commentaire, mais je n'ai pas assez de réputation pour commenter. Je veux juste dire à @Neil que son code peut être réduit à 77 octets. Vous n'avez pas besoin d'utiliser l'assertion directe dans l'expression régulière. Voici la version réduite:
la source
aabab
est l'exemple le plus court de l'échec de votre suggestion.C #, 169 octets
Explication
C'est l'approche par force brute: essayez toutes les sous-chaînes possibles jusqu'à ce que nous trouvions la sous-chaîne répétitive la plus longue. Sans aucun doute, Regex est plus efficace, mais traiter avec Regex en C # a tendance à être assez verbeux.
la source
PHP,
8482 octetsRemarque: utilise le codage IBM-850.
Courez comme ceci:
Explication
Tweaks
la source