Il y a l'encodage et le décodage classiques.
input output
a3b2c5 aaabbccccc
Et c'est assez simple et fait avant.
Le défi consiste également à prendre en compte un comportement non standard lorsque plusieurs caractères précèdent la longueur d'exécution (un seul chiffre de 0 à 9). Chaque caractère avant le chiffre de la longueur d'exécution (le dernier chiffre avant un non-chiffre ou la fin de la chaîne) a cette valeur qui lui est appliquée individuellement et imprimé dans l'ordre.
Quelques entrées et sorties de test, y compris certains cas de bord:
input output
ab3c5 aaabbbccccc
a0b3 bbb
13b1 111b
a13b1 aaa111b
a123b1 aaa111222b
aa2a1b1 aaaaab
- Une séquence de caractères (
[a-zA-Z0-9]+
) doit être suivie de sa longueur de longueur ([0-9]
) - Seule une entrée valide doit être prise en compte (
([a-zA-Z0-9]+[0-9])*
)- oui, une chaîne vide est une entrée valide.
- L'entrée se fait via une entrée standard, la sortie via une sortie standard
Il s'agit du code golf, le nombre d'octets détermine le gagnant.
Réponses:
Pip, 22 + 1 = 23 octets
Utilise le
-r
drapeau. Notez que cela vous oblige à 1) entrer un EOF après l'entrée (Ctrl-D sous Linux, Ctrl-Z sous Windows) ou 2) diriger l'entrée depuis un autre endroit.Explication:
Le résultat de l'opération de mappage est en fait une liste de listes, mais par défaut, les listes sont simplement concaténées ensemble lors de l'impression, donc aucune conversion manuelle en chaîne n'est nécessaire.
Exemple, avec entrée
a13b1
:Pip a un support regex de base en date de ... il y a 2 jours . Bon timing!
la source
-r
drapeau. (La question spécifie que l'entrée doit provenir de STDIN.)q
au lieu dea
sans drapeaux supplémentaires, mais il semble y avoir un bug et il demande l'entrée deux fois.Perl / Bash
5440 + 1 = 41 octetsC'est fondamentalement une expression régulière dans une expression régulière. Et un peu de magie.
Explication
L'expression régulière externe
/(\D*\d*)(\d)/g
extrait chaque groupe codé de longueur d'exécution. Nous capturons les éléments à répéter$1
et le nombre de répétitions$2
. Maintenant, nous substituons chacun de ces groupes à l'expansion de ce groupe. Pour cela, nous évaluons le code"\$1=~s/./\$&x$2/egr"
deux fois (comme par le/ee
drapeau sur la substitution externe).La première évaluation n'interpole que le nombre de répétitions dans la chaîne - les autres variables sont protégées par une barre oblique inverse. En supposant donc l'entrée
a14
, nous aurions maintenant le code$1=~s/./$&x4/egr
, qui sera à nouveau évalué.Cela appliquera la substitution au contenu de
$1
(le truc à répétera1
). La substitution correspond à chaque caractère.
. La$&
variable contient la correspondance entière, que nous répétonsx4
fois. Nous faisons cela de manière/g
lobaire pour chaque correspondance et/r
retournons la chaîne substituée plutôt que de modifier la$1
variable (qui est en lecture seule). Le résultat de la substitution intérieure est doncaaaa1111
.L'
-p
indicateur applique la substitution à chaque ligne d'entrée et imprime le résultat.la source
-p
modificateur. Je compte 45 octets. De plus, vous devriez pouvoir utiliser à la\D
place de[a-z]
, ce qui a également éliminé le besoin dei
.CJam,
33 3127 octetsUghh, le manque d'expressions régulières rend cela assez long ...
Comment ça fonctionne
Nous parcourons tous les caractères de la chaîne d'entrée et à chaque itération, gardons une trace du dernier caractère rencontré (en commençant par un caractère vide pour la première fois). Ensuite, nous vérifions si le caractère actuel n'est pas numérique et le dernier caractère est numérique. Si c'est le cas, nous répétons chaque caractère précédent (qui n'a pas déjà été répété), le nombre de fois.
(Expansion de code un peu dépassée)
Essayez-le en ligne ici
la source
rs ,
4371 caractèresEh bien, cela a tourné longtemps rapidement. Des nombres stupides ...
Essayez-le ici!
Version originale (ne fonctionnait pas avec une entrée comme
123
):Explication
Les premiers espaces de lieux de ligne entre séries contenant des nombres, par exemple transformer
a313
ena3 13
.La deuxième ligne développe en continu les encodages compressés comme
aa5
poura5a5
.La troisième ligne convertit chaque instance de
a5
enaaaaa
utilisant l' opérateur de répétition .La dernière ligne supprime les espaces.
la source
a123b1
?Javascript ( ES6 ),
8683 octetsCommenté:
la source
alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(c+1).join(b)))
la même chose? Il ne fait que 71 octets de long.Array(6).join('12')
et il reviendra'1212121212'
.alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(-~c).join(b)))
(même 71 octets de long, testé sur es6fiddle.net/ia7gocwg )CJam,
2725 octetsEssayez-le en ligne dans l' interpréteur CJam .
Comment ça fonctionne
la source
Pyth,
333228 octetsEssayez-le en ligne: démonstration ou test de harnais
Explication
Je vais expliquer le code en utilisant l'exemple d'entrée
aa1a23b2
. J'espère que c'est un peu plus facile à suivre que sans.la source
Rubis 73
Tests: http://ideone.com/L1fssb
la source
JavaScript 112
la source
Python 2.7, 98 octets
Cela fait juste une recherche regex simple pour les chiffres qui ne sont pas suivis par un chiffre, puis fait l'arithmétique des chaînes sur chaque groupe et les regroupe tous.
la source
raw_input
devientinput
mais aprint
besoin de parenthèses.Julia,
105999587 octetsCela crée une fonction sans nom qui prend une chaîne en entrée et renvoie une chaîne. Pour l'appeler, donnez-lui un nom, par exemple
f=s->...
.Deux compréhensions de tableau sont utilisées ici, l'une imbriquée dans l'autre. La compréhension externe agit sur chaque correspondance de la chaîne d'entrée contre l'expression régulière
\D*\d*\d
. La compréhension intérieure répète chaque caractère de la correspondance en fonction du chiffre de fin. Les éléments du tableau interne sont joints en une chaîne, donc le tableau externe est un tableau de chaînes. Ceux-ci sont joints et retournés.Dans Julia, les chaînes peuvent être traitées comme des tableaux de caractères. Cependant, notez que les types
Char
etString
dans Julia n'ont pas les mêmes méthodes définies; en particulier, il n'y a pas de méthode de répétition utilisant^
des caractères for. Cela utilise une solution de contournement:chop()
.string()
.int('4')
ne renvoie pas 4. Il renvoie plutôt le point de code, qui dans ce cas est 52. Ainsi, nous pouvons soustraire 48 pour récupérer l'entier réel.string(b)
selonint(p[end]) - 48
.Exemples:
la source
Python 3,
148144136135 135 octetsMerci à Pietu1998 et mbomb007 pour les suggestions.
Python 2,
161151147 147139138 octetsPeut-être que la journée d'aujourd'hui a été longue au travail, mais je n'arrive pas à comprendre comment jouer au golf.
la source
raw_
out, parenthèses toprint
).len(d)>0
peut être remplacé pard
car une liste vide est fausse et une liste non vide véridique.list(...)
peut aller directement aufor
. Les crochets new([...])
sont pas nécessaires car c'est le seul argument. Vous pouvez supprimer l'espace dedans) for
. C'est toutes les petites choses que j'ai trouvées jusqu'à présent.list()
car les chaînes sont itérables. Vous pouvez utiliserw=r=''
. Si vous êtes prêt à changer beaucoup de choses, voyez ma solution. :)if c.isdigit()
peut devenirif'/'<c<':'
, si je ne me trompe pas.Java 7, 175 octets
Le défi est plus difficile qu'il n'y paraît, imo ..
Code non testé et testé:
Essayez-le ici.
Production:
la source