Écrivez le code le plus court dans la langue de votre choix pour effectuer le décodage de la longueur d'exécution de la chaîne donnée.
La chaîne sera fournie en entrée sur stdin sous la forme
CNCNCNCNCNCNCNCN
où chacun C
pourrait être n'importe quel caractère ASCII imprimable et chaqueN
est un chiffre 1
à 9
(inclus).
Exemple d'entrée:
:144,1'1
Sortie correspondante:
:4444,'
Langage de programmation Shakespeare , 406 octets
Version non golfée:
J'utilise le compilateur SPL Python drsam94 , qui a quelques bugs ( ce qui explique pourquoi, par exemple, je l' utilise au
Open your mind
lieu deOpen thy mind
la version golfed).Pour exécuter ce programme, utilisez:
Comment ça fonctionne
SPL est un langage de programmation ésotérique conçu pour que les programmes ressemblent à des pièces de Shakespeare. Il le fait en utilisant des caractères comme variables, et le traitement est effectué en demandant aux personnages de se dire des choses.
C'est le titre de la pièce; il est ignoré par le compilateur.
Ici, nous déclarons les variables utilisées dans le reste du programme. Tout entre
,
et.
est ignoré par le compilateur. Dans ce cas, nous déclaronsRomeo
, utilisé pour contenir le caractère en cours de décodage, etJuliet
, utilisé pour contenir la longueur du caractère.Nous déclarons ici le premier et le seul acte du programme. Les actes et les scènes sont comme des étiquettes; ils peuvent être sautés à tout moment en utilisant
let us return to scene II
ou une variante de cela. Nous n'utilisons qu'un seul acte, car il suffit à nos besoins. Encore une fois, tout ce qui se trouve entre:
et.
est ignoré par le compilateur.Ici, nous déclarons la première scène. Les scènes sont numérotées en chiffres romains: la première est
Scene I
, la secondeScene II
, etc.Ceci est une mise en scène; on y raconte
Romeo
Juliet
variables et de venir sur la "scène". Seules deux variables peuvent être sur la "scène" à la fois; l'étape est utilisée pour que le compilateur puisse déterminer quelle variable s'adresse à qui quand ils parlent. Parce que nous n'avons que deux variables, Roméo et Juliette resteront sur scène pendant toute la durée du programme.Une autre déclaration de scène. La scène II sera sautée afin de décoder une autre longueur d'exécution.
Cette forme de déclaration signifie que Juliette va commencer à parler. Tout jusqu'à la prochaine
Romeo:
, mise en scène ou déclaration de scène / acte sera une phrase prononcée par Juliette, et donc "moi" fera référence à Juliette, "vous" / "tu" à Roméo, etc.Cette commande stocke la valeur ordinale d'un caractère unique de STDIN dans
Romeo
.En SPL, les noms se traduisent par 1 ou -1 selon qu'ils sont positifs ou négatifs. Dans ce cas,
my mother
traduit par 1. Les adjectifs (positifs ou négatifs) multiplient leur nom par 2.C'est une question; Juliet y demande si
my mother
(AKA 1) est "plus joyeux" que Roméo. Les comparatifs se traduisent parless than
(s'ils sont négatifs, commeworse
) ougreater than
(s'ils sont positifs, commejollier
). Par conséquent, cette question se résume àIs 1 greater than you?
.La raison pour laquelle nous posons cette question est de détecter la fin de l'entrée. Étant donné que la valeur de
EOF
varie selon la plate-forme, mais est généralement inférieure à 1, nous l'utilisons pour la détecter.Si la question précédente est évaluée
true
, nous passons à la scène IV - qui est tout simplement la fin du programme. En bref, si nous détectons un EOF, nous terminons le programme.C'est maintenant la ligne de Roméo: «moi» et «vous» se réfèrent respectivement à Roméo et Juliette.
Encore une fois, cette instruction place la valeur ordinale d'un seul caractère de STDIN dans Juliet, qui dans ce cas est la longueur du caractère stocké dans
Romeo
.Celui-ci est trop long pour être détaillé, mais croyez-moi, cela se traduit par
Juliet -= 48
. Nous faisons cela parce que Juliette détient la valeur ASCII d'un chiffre, etord('0') == 48
; en soustrayant 48, nous traduisons de la valeur ASCII d'un nombre au nombre lui-même.Une autre déclaration de scène. Celui-ci est pour la boucle dans laquelle nous imprimons à plusieurs reprises la valeur de caractère de
Romeo
,Juliet
times.Cette déclaration fait que Roméo imprime sa valeur en tant que personnage; c'est-à-dire que la valeur de caractère précédemment stockée dans Romeo est maintenant sortie.
Un porc est un nom négatif, donc se
a hog
traduit par -1; par conséquent, cette déclaration est évaluéeJuliet -= 1
.Roméo demande ici si Juliette est "aussi pourrie que" ou égale à 0.
Si la valeur de Juliette est 0, nous rebouclons vers la scène II pour décoder la durée de vie d'un autre personnage.
Sinon, nous retournons à la scène III pour sortir à nouveau le personnage de Roméo.
Cette déclaration de scène finale n'est qu'un marqueur de la fin du programme. La
[Exeunt]
direction de la scène est nécessaire pour que le compilateur génère réellement la scène finale.la source
GolfScript, 10 caractères
la source
perl, 27 caractères
la source
print<>=~s/(.)(.)/$1x$2/ger
. Je suis aussi assez sûr que vous vouliez dire$1x$2
, et non l'inverse./r
est documenté dans perlop et a été ajouté dans v5.14.0-p
drapeau vous laisse tomberprint
et<>
, donc la réponse deviendra simplement:s/(.)(.)/$1x$2/ge
-> 17chars +1 pour-p
-> 18 .R 67
la source
rep
forcertimes
automatiquement l' argument des caractères aux entiers. Brillant.Python 3, 52
Python 3 me permet de fusionner les approches de mes deux solutions python2.
la source
raw_input
correspond à Python 3input
. Donc la première ligne doit êtres=input()
s=input() while s:a,b,*s=s;print(a*int(b),end='')
APL (22)
Explication:
T←⍞
: stocker l'entrée dansT
T⊂⍨~⎕D∊⍨T
: DiviséT
sur les caractères qui ne sont pas des chiffres↑
: le transformer en matrice2
-par-N/2
{⍺/⍨⍎⍵}/
: sur chaque ligne de la matrice (/
), réplique (/
) le premier caractère (⍺
) par l'eval (⍎
) du deuxième caractère (⍵
),/
: concaténer la sortie de chaque lignela source
Rubis, 30 octets
27 octets de code + 3 octets pour l'exécuter avec le
-p
drapeau:la source
Assemblage 8086,
10698 caractèresSi les chiffres étaient avant les caractères dans le flux d'entrée, deux lignes (18 caractères) pourraient être supprimées.
la source
dq 21cdc38821cd08b4 d888ed30c188482c e8ebfce210cd14b4
pour 53 personnages? Je ne vois pas où il gère les caractères non majuscules ou eof ...GNU SED, 122 + 2 (-r)
Doit être exécuté avec le
-r
drapeauPeut être réduit à 110 + 2 en remplaçant
\v
par l'imprimable0x0B
et\a
par0x07
la source
\2.{9}
c'est une excellente idée) splendide!C, 65 caractères
Obtient l'entrée en tant que paramètre.
la source
error: first parameter of 'main' (argument count) must be of type 'int'
. Y a-t-il un commutateur de ligne de commande?Perl,
1918 caractèresLes règles de comptage des commutateurs sur la ligne de commande sont ici .
la source
Quatrième, 45 caractères
Testé avec pforth sur OS X.
la source
Python,
6362 caractèresla source
iter
ça ... Je pense que je vais l'utiliser moi-même!Windows PowerShell, 55 caractères
J'ai l'impression que cela peut être approfondi, en particulier avec les transtypages de char à string et int, mais je n'ai pas le temps de continuer à travailler dessus pour le moment.
la source
C, 68 caractères
La réponse de @ ugoren en C est légèrement plus courte, mais cette réponse est conforme à l'exigence selon laquelle "la chaîne sera fournie en entrée sur stdin ".
la source
main(c,n){ ... }
qui seront passés 1 par défaut lorsque le programme est exécuté.int
argument, mais les compilateurs que j'utilise se plaignenterror: second parameter of 'main' (argument array) must be of type 'char **'
donc je ne peux pas m'en tirermain(c,n)
; Je dois utilisermain(int c,char **n)
. Cela pourrait être une plate-forme ou une chose gcc.n;main(c)
mais pasmain(n,c)
- assez bien! :)Haskell,
5856 caractèresMa première vraie tentative de jouer au golf, donc il y a probablement des améliorations à faire ici.
la source
read[y]
enregistre deux caractèresreplicate x y
par[1..x]>>[y]
. Ainsi, votre deuxième ligne peut être remplacée parf(x:y:s)=(['1'..y]>>[x])++f s
, ce qui la ramène à 53 octets.Japt
-P
, 8 octetsEntrez sous forme de tableau de caractères, sortez sous forme de chaîne.
Essayez-le
la source
ò crÏ°îX
si vous le trouvez trop effrayant!Malbolge Unshackled (variante de rotation de 20 trits), 4 494e6 octets
La taille de cette réponse dépasse la taille maximale du programme (eh), le code est donc trouve dans mon référentiel GitHub .
Comment faire ça?
Cela pourrait être une partie délicate, car un interprète naïf de Haskell prendra des âges pour exécuter cela. TIO a un interprète Malbogle Unshackled décent, mais malheureusement je ne pourrai pas l'utiliser (limitations).
Le meilleur que j'ai pu trouver est la variante de largeur de rotation fixe de 20 trits, qui fonctionne très bien, décompresse 360 octets par heure .
Pour rendre l'interprète un peu plus rapide, j'ai supprimé toutes les vérifications de l'interpréteur Malbolge Unshackled de Matthias Lutter.
Ma version modifiée peut fonctionner environ 6,3% plus rapidement.
Ça marche!
la source
05AB1E ,
65 octets-1 octet grâce à @Grimy .
Sorties sous forme de liste de caractères.
Essayez-le en ligne.
Réponse de 6 octets sans décodage intégré:
Essayez-le en ligne.
Explication:
la source
2ι`ÅΓ
est de 5 octets. Ce serait triste si le RLE intégré n'a pas remporté un défi RLE.Python,
787266 caractèresla source
GolfScript (10 caractères)
la source
J - 24
Le point de cette soumission est d'utiliser l'adverbe infixe.
la source
Befunge, 49 caractères
la source
K, 35
la source
,/{(. y)#x}.'0N 2#
pour 18 octets .Python 2, 58
Ceci est inspiré par la solution python de Darren Stone - abus d'itérateur!
Ceci est ma solution d'origine (60 caractères)
Une approche différente prend 3 caractères de plus:
la source
Java: 285 charas
la source
Befunge-98, 22 caractères
la source
Espace, 135
(Remplacez S, T, L par des espaces, des tabulations et des sauts de ligne.)
Essayez-le en ligne [ici] .
Explication:
la source
Clojure (107)
Cela semble exceptionnellement long pour être Clojure, si quelqu'un peut faire mieux, veuillez le poster.
la source