L'entrée est un mot de lettres minuscules non séparées par des espaces. Une nouvelle ligne à la fin est facultative.
Le même mot doit être sorti dans une version modifiée: pour chaque caractère, doublez-le la deuxième fois qu'il apparaît dans le mot d'origine, triplez-le une troisième fois, etc.
Exemple d'entrée:
bonobo
Exemple de sortie:
bonoobbooo
Les règles d'E / S standard s'appliquent. Le code le plus court en octets gagne.
Tests fournis par @Neil:
tutu -> tuttuu
queue -> queuuee
bookkeeper -> boookkkeeepeeer
repetitive -> repeetittiiveee
uncopyrightables -> uncopyrightables
abracadabra -> abraacaaadaaaabbrraaaaa
mississippi -> misssiisssssssiiipppiiii
Pyth, 6 octets
Merci à @Doorknob d'avoir enlevé 1 octet.
Merci à @Maltysen d’avoir supprimé 5 octets.
Essayez-le en ligne!
Comment ça fonctionne
Par exemple, prenez la chaîne
"bonobo"
.._
fait une liste:['b', 'bo', 'bon', 'bono', 'bonob', 'bonobo']
VQ._
signifie "la fonction précédente vectorisée (appliquée en parallèle) surQ
et._
", ce qui signifieQ
(l'entrée évaluée) sera traitée comme une liste:,['b', 'o', 'n', 'o', 'b', 'o']
puis ils seront appariés par ce qui@
suit:Par conséquent,
@VQ._
produira['b', 'o', 'n', 'oo', 'bb', 'ooo']
.Le
s
tout les réunit alors ensemble, créant une chaîne'bonoobbooo'
, qui est ensuite implicitement imprimée pour devenirbonoobbooo
.la source
VQ
signifie seulementfor N in Q
quand ce n'est pas dans une fonction. Dans ce cas, ce qui se passe réellement est que cela@V
signifie que la@
fonction vectorisée (appliquée en parallèle) sur ses deux arguments suivants,Q
et._
. Cela manque dans la documentation, alors je vais le réparer.Retina ,
3419 octetsÉconomisez 15 octets en vous inspirant de la solution isaacg.
Le nombre d'octets suppose un codage ISO 8859-1.
Les lignes vides de début et de fin sont significatives.
Essayez-le en ligne!
Explication
C'est une étape de remplacement qui correspond à l'expression rationnelle vide (c'est-à-dire chaque position de largeur nulle dans la chaîne) et la remplace
$`¶
, où$`
est le préfixe de la correspondance et¶
insère un saut de ligne. Cela calcule tous les préfixes et les place sur une ligne séparée avec le dernier caractère de ce préfixe:Il y aura des sauts de ligne en tête et en queue, mais nous pouvons les ignorer.
Pour chacun de ces préfixes, nous voulons conserver les caractères égaux au dernier caractère. Pour cela nous utilisons une autre étape de remplacement:
Cela correspond à tout ce que nous ne voulons pas conserver et le remplace par un rien. Nous faisons correspondre tout caractère (en utilisant,
\D
car nous savons qu'il n'y aura pas de chiffres dans l'entrée), puis nous nous assurerons qu'il n'y a pas d' autre copie de ce caractère à la fin de la ligne.la source
Python, 56 octets
Il me semble que je suis coincé avec deux réponses de la même longueur:
Edit: Voir la réponse de @ pacholik pour une approche alternative plus courte en Python.
la source
+1
assez prioritaire pour que les parens ne soient pas nécessairesHaskell, 39 octets
Exemple d'utilisation:
f "bonobo"
->"bonoobbooo"
.Assez différent de la réponse de @ Damien . Construit la chaîne à partir de la droite en extrayant toutes les occurrences du dernier caractère de la chaîne et en ajoutant un appel récursif à tous les caractères sauf le dernier.
la source
> <> , 27 octets
Requiert l’interprète officiel qui se termine en essayant d’imprimer le point de code -1. Essayez-le en ligne!
Le code lit l'entrée d'un caractère à la fois et utilise la première ligne de la boîte de code comme un grand tableau qui stocke le nombre de fois que chaque caractère a été vu jusqu'à présent (> <> initialise les cellules non programmées à 0). La deuxième ligne est une boucle permettant de générer plusieurs fois un caractère.
Alternativement, voici une version qui sort proprement (37 octets, pas correctement joué au golf):
la source
chr(-1)
. L'interprète animé est excellent pour les visualisations, mais malheureusement, certaines divergences par rapport à l'interprète officiel sont un peu gênantes: /JavaScript (ES6),
4845 octetsEdit: 3 octets sauvegardés grâce à @ user81655.
la source
Haskell,
504241 octetsSauvegardé 8 octets grâce à Lynn
la source
f t=[c|(i,c)<-zip[0..]t,j<-[0..i],c==t!!j]
MATL , 8 octets
Essayez-le en ligne! Ou vérifiez tous les cas de test à la fois .
Explication
la source
Labyrinthe ,
54 à25 octetsUn autre collab avec @ MartinBüttner, qui a effectivement fait
plusla quasi - totalité du golf pour celui - ci. En réaménageant l'algorithme, nous avons réussi à réduire de beaucoup la taille du programme!Essayez-le en ligne!
Explication
Un rapide apprêt de Labrinth:
Labyrinth est un langage 2D basé sur des piles. Il y a deux piles, une pile principale et une pile auxiliaire, et le décompression d'une pile vide donne zéro.
À chaque jonction, où il existe plusieurs chemins pour le pointeur d'instruction à déplacer vers le bas, le haut de la pile principale est vérifié pour voir où aller ensuite. Le négatif est à gauche, le zéro est droit et le positif à droite.
Les deux piles d'entiers de précision arbitraire ne sont pas très flexibles en termes d'options de mémoire. Pour effectuer le comptage, ce programme utilise en fait les deux piles en tant que bande, le déplacement d’une valeur d’une pile à l’autre revenant à déplacer un pointeur de mémoire vers la gauche ou la droite d’une cellule. Ce n’est pas tout à fait la même chose, car nous devons faire glisser un compteur de boucles avec nous vers le haut.
Tout d’abord, les boutons
<
et>
à chaque extrémité créent un décalage et font pivoter la ligne de code qui est décalée d’un côté à l’autre. Ce mécanisme est utilisé pour que le code soit exécuté en boucle: le<
zéro s'affiche et la ligne actuelle est pivotée à gauche, en plaçant l'adresse IP à droite du code, puis>
un autre zéro et la ligne est corrigée.Voici ce qui se passe à chaque itération, par rapport au diagramme ci-dessus:
la source
Perl, 17 ans
(Code de 16 octets, +1 pour -p)
Usage:
la source
Pyth, 7 octets
Suite de tests
Suite de test grâce à DenkerAffe
Explication:
la source
Python 3, 52
la source
f=lambda s:s and f(s[:-1])+s[-1]*s.count(s[-1])
PowerShell v2 +,
5247 octetsConstruit une hashtable vide et la stocke
$b
. Ceci est notre "compteur" des lettres que nous avons vues. Nous prenons ensuite l’entrée$args[0]
, la convertissons en tableau de caractères et l’envoyons à travers une boucle. Chaque itération, nous prenons le caractère actuel"$_"
et le multiplions par le compteur pré-incrémenté à la valeur donnée, ce qui fera que la première occurrence sera multipliée par1
, la seconde par2
et ainsi de suite. Nous encapsulons cela avec un-join
mot donc tout est en sortie.5 octets sauvés grâce à TessellatingHeckler en utilisant une table de hachage au lieu d’un tableau, nous n’avions donc pas besoin de décrémenter le caractère ASCII
97
pour atteindre l’index approprié. Cela fonctionne car la pré-incrémentation de l'index de hachage appelle implicitement.Add()
en arrière-plan si cet index n'existe pas, car les hashtables sont mutables.la source
Dyalog APL , 6 octets
TryAPL!
4 fonctions est un au sommet (2 trains) d'une fourche (3 trains):
Premier
⊢
(à droite - non-op) sur la chaîne donnée, donnant'bonobo'
Puis
,\
(scan de concaténation) sur la chaîne en donnant'b' 'bo' 'bon' 'bono' 'bonob' 'bonobo'
Les deux sont entrelacés avec (donnés comme arguments de droite et de gauche)
∩¨
(intersection chaque), c’est('b'∩'b') ('bo'∩'o') ('bon'∩'n') ('bono'∩'o') ('bonob'∩'b') ('bonobo'∩'o')
-à- dire'b' 'o' 'n' 'oo' 'bb' 'ooo'
Enfin,
∊
(enlist) est appliqué au résultat pour l’aplatir, en donnant'bonoobbooo'
Hé, au moins ça correspond à Pyth ! De toute évidence, Jelly est plus courte car il s’agit d’une version golf de J, qui est à son tour un dialecte avancé de 2 caractères par fonction d’APL.
la source
Pyth, 11 octets
Essayez-le ici!
Explication
la source
J, 11 octets
C'est un verbe monadique. Essayez ici. Usage:
Explication
la source
05AB1E , 10 octets
Code:
Explication:
Utilise le codage CP-1252 . Essayez-le en ligne!
la source
CJam, 14
Essayez-le en ligne
Explication:
la source
Perl 6, 37 octets
la source
> <> , 52 octets
Il empile chaque lettre lue, les imprime une fois de plus pour chaque lettre similaire de la pile.
Il utilise le
&
registre, car devoir gérer 3 variables sur la pile (lettre lue actuelle, position dans la pile, lettre à cette position) est une douleur.Vous pouvez l'essayer ici !
la source
Rouille, 176 octets
Cela utilise une carte pour stocker une chaîne pour chaque caractère de l'entrée. Pour chaque caractère, la chaîne sera supprimée de la carte, concaténée avec le caractère, insérée dans la carte et ajoutée à la sortie.
J'aurais aimé utiliser
get(...)
au lieu deremove(...)
, mais le vérificateur d'emprunt m'a fait changer d'avis.la source
Mathcad, 66 octets
Malheureusement, Mathcad ne gère pas très bien les chaînes. J'ai donc converti la chaîne d'entrée en un vecteur, puis utilisé un vecteur (code de caractère indexé) pour suivre le nombre de fois qu'un caractère est rencontré, en ajoutant le caractère nombre de fois à un vecteur de résultat. Enfin, le vecteur de résultat est reconverti en chaîne. Assez long malheureusement.
Notez que Mathcad utilise une interface "tableau blanc" 2D, combinant du texte normal et des opérateurs; les opérateurs sont normalement entrés via une barre d’outils ou un raccourci clavier; par exemple, ctl- # entre l'opérateur de boucle for, qui comprend le mot clé for, l'élément-of symbol et 3 "espaces réservés" vides pour les expressions de variable d'itération, de plage et de corps, respectivement. Saisie [après que le nom de la variable passe en mode d’index de tableau, Saisie 'entre une paire de parenthèses correspondante (la plupart du temps ... il existe des exceptions qui dépendent de ce qui se trouve dans l’expression environnante )
la source
Javascript ES6 44 octets
ancienne réponse
Javascript ES6 46 octets
la source
x
dans le tableau d'entrée ->q=>(x=[...q]).map(a=>x[a]=(x[a]||'')+a).join``
Julia,
3835 octetsI / O est dans le début des tableaux de caractères. Essayez-le en ligne!
Comment ça fonctionne
On (re) définit l'opérateur monadique ! pour nos fins.
Lorsque ! est appelé, il vérifie si son argument s est vide. Si c'est le cas, il retourne son argument.
Si s n'est pas vide, nous intersectons s avec son dernier caractère (
s[end]
), ce qui donne toutes les occurrences de ce caractère dans s . Ce résultat est concaténé avec la valeur de retour d'un appel récursif à ! avec s moins son dernier caractère (s[1:end-1]
) comme argument.la source
PHP,
54515047 octetsCourez comme ça:
Tweaks
null
dansint
de chaîne de décalage, en tant que chaîne de décalage est coulé à toute façon int$argn
place de$argv
(merci Titus)la source
$argn
avec-R
pour enregistrer trois octets supplémentaires.-n
devrait faire la même chose que votre-d error_reporting
:n
signifieno config file
, et les avis sont désactivés dans la configuration par défaut; so-nr
(respectivement-nR
) devrait suffire.Mathematica, 57 octets
Nous utilisons
c[x]
comme table de correspondance la fréquence à laquelle un personnagex
s'est déjà produit. Ceci est incrémenté chaque fois qu'il est récupéré dansx~StringRepeat~++c[x]
. Malheureusement, pour rendre la fonction réutilisable, nous devons réinitialiser la table de consultation à chaque foisClear@c;c@_=0;
, ce qui est assez coûteux.la source
awk, 72 octets
L'idée est de stocker le nombre de caractères apparaissant dans un tableau associatif et d'imprimer le caractère multiplié par le nombre de caractères.
la source
Poutre, 32
3342octetsCela aurait dû être plus petit, mais j'ai perdu quelques octets lors de l'initialisation des emplacements de mémoire sur 0. L'échange de certaines directions de flux a permis d'éliminer beaucoup d'espace vide.
Essayez-le dans cet extrait
Explication générale
la source
Python,
6662 octetsEssayez-le ici
Golfé
Ungolfed
la source