Mon collègue, Jimmy est un peu nouveau pour C / C ++. Il est également un peu lent à apprendre. Maintenant, pour être juste, son code compile toujours, mais il a des habitudes très bâclées. Par exemple, tout le monde sait que vous pouvez définir un tableau comme celui-ci:
int spam[] = {4, 8, 15, 16, 23, 42};
Tout le monde, sauf Jimmy. Il est convaincu que la seule façon de créer un tableau est la suivante:
int spam[6];
spam[0] = 4;
spam[1] = 8;
spam[2] = 15;
spam[3] = 16;
spam[4] = 23;
spam[5] = 42;
Je continue de résoudre ce problème pour lui dans la révision de code, mais il n'apprendra pas. J'ai donc besoin que vous écriviez un outil qui le fasse automatiquement pour lui lorsqu'il s'engage¹.
Le défi
Je veux que vous écriviez un programme complet ou une fonction qui accepte une chaîne multiligne en entrée et génère la version plus compacte du tableau C. L'entrée suivra toujours ce format, espaces inclus:
identifier_one identifier_two[some_length];
identifier_two[0] = some_number;
identifier_two[1] = some_number;
identifier_two[2] = some_number;
...
identifier_two[some_length - 1] = some_number;
En bref, l'entrée sera toujours valide et bien définie C. Plus en détail:
Tous les identifiants seront constitués uniquement de lettres et de traits de soulignement. La longueur sera toujours d'au moins un, et il n'y aura jamais d'index manquant ou hors limites. Vous pouvez également supposer que les index sont en ordre. Par exemple:
foo bar[3];
bar[0] = 1
bar[2] = 9;
foo bar[1];
bar[0] = 1;
bar[1] = 3;
et
foo bar[3];
bar[2] = 9;
bar[0] = 1
bar[1] = 3
sont toutes des entrées non valides et peuvent provoquer un comportement indéfini dans votre soumission. Vous pouvez également supposer que tous les nombres seront des nombres décimaux valides, négatifs ou positifs. L'entrée n'aura pas d'espaces superflus. La sortie doit toujours suivre ce format, les espaces inclus:
identifier_one identifier_two[] = {n1, n2, n3, ...};
Voici quelques exemples de données:
Input:
spam eggs[10];
eggs[0] = 0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;
eggs[4] = 3;
eggs[5] = 7;
eggs[6] = 888;
eggs[7] = 555;
eggs[8] = 0;
eggs[9] = -2;
Output:
spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};
Input:
char ans[2];
ans[0] = 52;
ans[1] = 50;
Output:
char ans[] = {52, 50};
Input:
blah_blah quux[1];
quux[0] = 105;
Output:
blah_blah quux[] = {105};
Vous pouvez prendre vos entrées et sorties dans n'importe quel format raisonnable, tel que STDIN / STDOUT, les arguments de fonction et la valeur de retour, la lecture et l'écriture de fichiers, etc. Des échappatoires standard s'appliquent. La réponse la plus courte en octets gagne!
¹Ceci est passif-agressif et une idée terrible. Vous ne m'avez pas donné cette idée.
Réponses:
Vim,
4336 octetsVous n'avez pas besoin de donner à Jimmy un script, apprenez-lui simplement à utiliser un éditeur de texte approprié. (retours littéraux pour plus de clarté)
la source
<C-a>
est plus court quet]
, ce qui est un petit hack amusant. De plus, je pense que vous avez techniquement besoin de 2,<cr>
car il demande une confirmation.norm df=
est plus court ques/.*=//g
3wC] = {<esc>
est plus court que<C-a>di]$s = {<esc>
.CJam,
4336 octetsExemple en ligne
Explication:
Un grand merci à Martin Ender pour les améliorations apportées à ma première réponse CJam.
la source
JavaScript (ES6),
656463 octetsla source
Rétine ,
3028 octetsLe nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne!
Explication
Nous utiliserons l'entrée suivante comme exemple:
Étape 1
Notez qu'il y a un espace de fin sur la première ligne.
Nous commençons par faire correspondre un nombre suivant par
];
et un saut de ligne, puis tout jusqu'au dernier espace sur la ligne suivante. Cette correspondance ne peut être trouvée qu'à la fin de la première ligne (en raison de];
). Tout cela est remplacé par] = {
. Autrement dit, il transforme notre exemple d'entrée en:Étape 2
Maintenant, nous faisons correspondre tout de a
;
à la=
ligne suivante et nous remplaçons par a,
. Cela transforme la chaîne en:Étape 3
Il ne reste plus qu'à fixer la fin et nous le faisons en remplaçant le seul restant
;
par};
:la source
Julia,
112108105 OctetsExplication
Octets enregistrés en remplaçant collect (eachmatch ()) par [eachmatch () ...] et par une expression rationnelle plus courte
la source
eachmatch
appel de fonction pour une sortie moins jolie et -1 octet. Je n'ai jamais programmé de Julia moi-même, mais vous pourriez trouver ce post intéressant à lire: Conseils pour jouer au golf à Julia . Encore une fois bienvenue et profitez de votre séjour. :)matchall
serait probablement plus courte que les éclaboussureseachmatch
.Lua, 121 octets.
Expliqué
la source
Lot, 160 octets
Remarque: la ligne
set s=,
se termine par un espace. Prend entrée sur STDIN. Cette ligne bizarre 3 prend l'entrée (par exemple ,int spam[6];
et modifie la[
en[] = {&rem
entraînantset s=int spam[] = {&rem 6];
qui obtient ensuite interprété comme deux déclarations,set s=int spam[] = {
etrem 6];
, dont le dernier est un commentaire. Ensuite , pour chaque ligne , nous supprimons le texte jusqu'au premier espace (parce que vous pouvez ne pas utiliser=
dans un modèle et la correspondance n'est pas gourmande) et extraire la valeur.la source
C, 121 octets
la source
Python
112111Très simple pour moi, veuillez suggérer toute amélioration qui vous vient à l'esprit.
la source
[:-1] for
.05AB1E ,
313028 octetsExplication
Essayez-le en ligne!
Un octet enregistré grâce à Adnan
la source
žuDÀÀ
au lieu d'„[]„{}
enregistrer un octet :).Java 7,
159158149154 octetsPlusieurs octets enregistrés grâce à @cliffroot .
Code non testé et testé:
Essayez-le ici.
Sortie:
la source
String c(String[]a){a[0]=a[0].split("\\d")[0]+"]={ \b";for(String i:a)a[0]+=i.split("=[{]*")[1];return a[0].replace(';',',').replaceFirst(".$","};");}
String
dans le paramètre et remplacer le dernier caractère par"};");
au lieu d'un"")+"};";
.Perl, 42 + 2 (
-0p
) = 44 octetsBesoins
-p
et-0
indicateurs pour fonctionner. Par exemple :la source
Gelée , 27 octets
Essayez-le en ligne!
Explication
la source
sed 51
la source
Java, 106 octets
La manipulation des chaînes en Java est un enfer, comme toujours.
Ceci est une pure réponse regex. Faites un single concaténé
String
, puis jouezreplaceXxx
jusqu'à ce que ce soit ok.Test et non golfé:
la source
Gelée , 33 octets
TryItOnline
Comment?
la source
Ruby, 64 octets
la source
JavaScript, 125 octets
Je sais que c'est plus long que les autres, mais je voulais vraiment l'utiliser
eval
. Juste pour le fun.Pour exécuter, collez ce qui suit ici :
la source
Haxe, 234 octets
Les noms de fonction longs ont tué ceci: D
Essayez les testcases ici !
la source
V ,
25, 24 octetsEssayez-le en ligne! Celui-ci contient un
<esc>
caractère non imprimable , voici donc un vidage hexadécimal:Explication:
la source