Dans le langage de programmation C, les tableaux sont définis comme suit:
int foo[] = {4, 8, 15, 16, 23, 42}; //Foo implicitly has a size of 6
La taille du tableau est déduite des éléments d'initialisation, qui dans ce cas sont 6. Vous pouvez également écrire un tableau C de cette façon, en le dimensionnant explicitement, puis en définissant chaque élément dans l'ordre:
int foo[6]; //Give the array an explicit size of 6
foo[0] = 4;
foo[1] = 8;
foo[2] = 15;
foo[3] = 16;
foo[4] = 23;
foo[5] = 42;
Le défi
Vous devez écrire un programme ou une fonction qui étend les tableaux de la première à la seconde. Puisque vous écrivez un programme pour rendre le code plus long et que vous aimez l'ironie, vous devez rendre votre code le plus court possible.
L'entrée sera une chaîne représentant le tableau d'origine et la sortie sera la définition de tableau développée. Vous pouvez sans risque supposer que l'entrée ressemblera toujours à ceci:
<type> <array_name>[] = {<int>, <int>, <int> ... };
"Type" et "array_name" seront entièrement composés de caractères alphabétiques et de soulignés _
. Les éléments de la liste seront toujours un nombre compris entre -2 147 483 648 et 2 147 483 647. Les entrées dans un autre format ne doivent pas être gérées.
Les espaces de votre sortie doivent correspondre exactement à ceux de la sortie de test, même si une nouvelle ligne est autorisée.
Test IO:
#in
short array[] = {4, 3, 2, 1};
#out
short array[4];
array[0] = 4;
array[1] = 3;
array[2] = 2;
array[3] = 1;
#in
spam EGGS[] = {42};
#out
spam EGGS[1];
EGGS[0] = 42;
#in
terrible_long_type_name awful_array_name[] = {7, -8, 1337, 0, 13};
#out
terrible_long_type_name awful_array_name[5];
awful_array_name[0] = 7;
awful_array_name[1] = -8;
awful_array_name[2] = 1337;
awful_array_name[3] = 0;
awful_array_name[4] = 13;
Les soumissions dans toutes les langues sont encouragées, mais des points bonus si vous pouvez le faire en C.
Classement:
Voici un tableau montrant les principales réponses:
foo[0]=1;
acceptable?Réponses:
Pyth, 44 octets
Suite de tests
Expression régulière et coupe de chaîne. Pas particulièrement intelligent.
Explication:
la source
Vim,
54, 52, 4947 frappesExplication:
Maintenant, notre tampon ressemble à ceci:
et notre curseur est sur la dernière ligne.
Deuxième partie:
Maintenant, tout semble aller bien, il suffit d'ajouter la déclaration de tableau d'origine. Donc nous faisons:
la source
int foo[6] = {
et se terminant parint foo[12
(curseur sur le "2")df<space>
pourdW
enregistrer un octet, mais j'ai oublié quedf<space>
cela sortirait de la macro à la ligne 6, mais cedW
n'est pas le cas. Je reviens sur une révision. Merci d'avoir fait remarquer cela!Retina,
10810410069 octetsLe nombre d'octets suppose un codage ISO 8859-1.
Battez ça, PowerShell ...
Explication du code
Première ligne:
].+{((\S+ ?)+)
Premièrement, nous devons conserver le type, le nom du tableau et le crochet d’ouverture (cela enregistre un octet), afin de ne pas les faire correspondre. Nous avons donc correspondre le support de fermeture, un certain nombre de caractères, et une accolade d' ouverture:
].+{
. Ensuite, nous correspondons à la liste de numéros. Shortest Je suis en mesure de trouver est jusqu'à présent ceci:((\S+ ?)+)
. Nous faisons correspondre un nombre de caractères non-espace (ce qui inclut les chiffres, signe négatif possible, et par des virgules possible), suivi d'un espace, qui peut ou ne peut pas être là:\S+ ?
. Ce groupe de caractères est ensuite répété autant de fois que nécessaire:(\S+ ?)+
et placé dans le grand groupe de capture. Notez que nous ne correspondons pas à l'accolade ou au point-virgule de fermeture. La troisième ligne explique pourquoi.Deuxième ligne:
$#2];$1
Comme nous n'avons associé qu'une partie de l'entrée, les parties non appariées seront toujours là. Nous avons donc la longueur de la liste après le support d'ouverture inégalée:
$#2
. Le modificateur de remplacement#
nous aide dans cette tâche , car il nous donne le nombre de correspondances créées par un groupe de capture donné. Dans ce cas, groupe de capture2
. Ensuite, nous mettons un crochet de fermeture et un point-virgule, et enfin toute notre liste.Avec entrée
short array[] = {4, 3, 2, 1};
, la représentation interne après ce remplacement est la suivante:(notez l'accolade et le point-virgule fermants)
Troisième ligne:
+`((\w+[).+;(\S+ )*)(-?\d+).+
Ceci est une section en boucle. Cela signifie qu'il fonctionne jusqu'à ce qu'aucune étape de la boucle ne modifie l'entrée. Tout d' abord nous faisons correspondre le nom du tableau, suivi d'un support d'ouverture:
(\w+\[)
. Ensuite , un nombre arbitraire de tous les caractères et un point - virgule:.+;
. Ensuite , nous avons à nouveau correspondre à la liste, mais cette fois que le nombre et la virgule après chaque numéro, qui ont un espace qui suit:(\S+ )*
. Ensuite , nous saisissons le dernier numéro dans la liste:(-?\d+)
et tous les caractères restants derrière elle:.+
.Quatrième ligne:
$1¶$2$#3] = $4;
Nous remplaçons ensuite avec le nom du tableau et la liste suivie d'une nouvelle ligne:
$1¶
. Ensuite, nous avons mis le nom du tableau, suivi de la longueur de la liste en correspondance précédemment, sans le dernier élément (essentiellementlist.length - 1
):$2$#3
. Suivi d'un crochet de fermeture et d'un opérateur d'assignation avec des espaces, suivi du dernier élément de notre liste de numéros:] = $4;
Après le remplacement, la représentation interne ressemble à ceci:
Notez que l'accolade fermante et le point-virgule ont disparu, grâce
.+
à la fin de la troisième ligne. Après trois remplacements supplémentaires, la représentation interne ressemble à ceci:Puisqu'il n'y a plus rien à faire par la troisième ligne, la quatrième ne remplace rien et la chaîne est renvoyée.
TL; DR: Commençons par modifier légèrement le format de la liste int. Ensuite, nous prenons le dernier élément de la liste et le nom, et les plaçons après l'initialisation du tableau. Nous faisons cela jusqu'à ce que la liste int soit vide. Ensuite, nous rendons le code modifié.
Essayez-le en ligne!
la source
M!`
etG`
sont similaires, mais pas tout à fait les mêmes. Faites attention.V, 37 octets
V est un langage de golf 2D basé sur des cordes que j'ai écrit, conçu à partir de vim. Cela fonctionne à partir de commit 17 .
Explication:
C'est à peu près une traduction directe de ma réponse vim , bien que nettement plus courte.
Ensuite, nous avons juste:
Comme il peut être difficile d'entrer dans cette folie unicode, vous pouvez créer le fichier avec cet hexdump réversible:
Cela peut être exécuté en installant V et en tapant:
la source
Designed off of vim.
2 notes: 1. la plupart des gens disentfrom
nonoff of
, et 2. pourquoi cela n'existait-il pas. +1C,
215 octets, 196 octets19 octets sauvés grâce à @tucuxi!
Golfé:
Ungolfed:
Lien:
http://ideone.com/h81XbI
Explication:
Pour obtenir le
<type> <array_name>
, lasscanf()
chaîne de format est la suivante:Pour extraire les valeurs int de la chaîne
int foo[] = {4, 8, 15, 16, 23, 42};
, je tokenize essentiellement la chaîne avec cette fonction:où:
i
est la chaîne d'entrée (achar*
)t
est le décalage de l'emplacement du pointeur dei
x
est laint
lecture réelle de la chaînen
est le nombre total de caractères consommés, y compris le chiffre trouvéLa
sscanf()
chaîne de format signifie ceci:Si vous visualisez la chaîne d'entrée sous la forme d'un tableau de caractères:
avec l'
int
4
être situé à l'index 13,8
à l'index 16, etc., voici à quoi ressemble le résultat de chaque exécution dans la boucle:la source
o
intérieur de sprintf, via%s
. Cela devrait raser environ 7 caractères.C,
195180 octets195 octets d'origine:
joué au golf:
ungolfed:
Les deux raccourcis utilisent le
m
modificateur to pour permettre à scanf%s
d'allouer sa propre mémoire (enregistre les tableaux de caractères), et utilisentstrtok
(qui est également disponible par défaut, sans includes) le composant d'analyse syntaxique.Mise à jour de 180 octets:
ungolfed:
Utilise l’ idée de bnf679 d’ajouter à une chaîne pour éviter de compter les virgules.
la source
Python 3.6 (pré-version), 133
Fait un usage intensif de f-strings .
Version non-golfée:
la source
Ruby,
1271101089988 octetsFonction anonyme avec un seul argument en entrée.Programme complet, lit l'entrée de STDIN. (Si vous dirigez un fichier vers l'intérieur, la nouvelle ligne de fin est facultative.) ValeursrenvoyéesImprime la chaîne de sortie.@TimmyD s'est vanté de voir sa solution vaincre tous les autres non-esolangs comme un défi, et a finalement vaincu la solution Powershell de 114 octets (au moment de la rédaction de cet article).
Le truc de Cʀɪᴇɴ O'Bʀɪᴇɴ qui consiste à scinder]
et à épisser la seconde moitié pour obtenir les chiffres.J'ai besoin d'utiliser davantage l'opérateur Splat. C'est tellement utile!
@ Neil's JavaScript ES6 a emprunté une astuce pour économiser davantage d'octets en recherchant des mots plutôt
gsub
qu'en utilisant etsplit
..la source
05AB1E ,
525047 octetsCode:
Utilise le codage CP-1252 . Essayez-le en ligne! .
la source
JavaScript (ES6), 100 octets
Etant donné que seuls les mots sont importants, cela fonctionne en faisant simplement correspondre tous les mots de la chaîne d'origine, plus les signes moins, puis en générant le résultat. (Au départ, je pensais que j'allais utiliser,
replace
mais cela s'est avéré être un piège rouge.)la source
[t,n,...m]
presque une vision mystiquePyth -
5350464544 octets2 octets enregistrés grâce à @FryAmTheEggman.
Suite de test .
la source
Pip ,
4847 octetsPrend une entrée de stdin et imprime sur stdout.
Explication
Tl; dr: Effectue un remplacement de regex en utilisant des groupes de capture et une fonction de rappel pour construire le résultat.
La
q
variable spéciale lit une ligne d'entrée. La regex est(\S+)(. = ).(.+)}
, qui correspond à tout sauf au type (y compris l'espace de fin) et au point-virgule final. En utilisant le premier exemple de la question, les groupes de capture sefoo[
,] =
et4, 8, 15, 16, 23, 42
.Le remplacement est la valeur de retour de la fonction non nommée
{[b#Yd^k']';.n.b.,#y.c.y]}
, qui est appelée avec la correspondance complète plus les groupes de capture en tant qu'arguments. Ainsi, dans la fonction,b
obtient le groupe de capture 1,c
obtient le groupe 2 etd
obtient le groupe 3.Nous construisons une liste, les trois premiers points qui seront
"foo["
,6
et"]"
. Pour obtenir le6
, nous séparons lad
variable intégréek
=", "
,Y
ajoutons la liste résultante d'entiers dans lay
variable pour une utilisation ultérieure et prenons la longueur (#
).']
est un caractère littéral.Ce qu'il reste à faire, c'est de construire une série de chaînes de la forme
";\nfoo[i] = x"
. Pour ce faire, nous concaténons ce qui suit:';
,n
(intégré pour newline),b
(1er groupe de capture),,#y
(équivalent à Pythonrange(len(y))
),c
(2e groupe de capture), ety
. La concaténation fonctionne élément par élément sur les listes et les plages. Le résultat est donc une liste de chaînes. En mettant tout cela ensemble, la valeur de retour de la fonction sera une liste comme celle-ci:Puisque cette liste est utilisée dans un
R
remplacement de chaîne , elle est implicitement convertie en chaîne. La conversion par défaut de liste à chaîne dans Pip concatène tous les éléments:Enfin, le résultat (y compris le type et le point-virgule final, qui ne correspondait pas à la regex et reste donc inchangé) est automatiquement imprimé.
la source
Perl 5.10,
73726866 + 1 (pour le commutateur -n) = 67 octetsC'est un beau défi pour Perl et le plus court parmi les langages à usage général à ce jour. Équivalent à
la source
PowerShell v2 +,
114 à105 octetsPrend la chaîne d'entrée
$args
et-replace
s le crochet sans rien, puis effectue un-split
espace blanc. Nous stockons le premier bit dans$a
, le second bit dans$b
, les éléments=
into$c
et array dans$d
. Pour l'exemple ci-dessous, cela stockefoo
dans$a
etbar
dans$b
, et tout le tableau dans$d
.Nous avons ensuite la sortie de notre première ligne avec
"$a ..."
et au milieu transformons$d
d'un tableau de chaînes de forme{1,
,2,
...100};
à un réseau régulier int en-join
ing ensemble en une seule chaîne, puis en cours d' exécution pariex
deux fois (semblable àeval
). Nous stockons ce tableau résultant$d
avant d'appeler la.length
méthode pour renseigner le nombre approprié entre la[]
ligne de sortie.Nous envoyons ensuite
$d
une boucle avec|%{...}
. Chaque itération que nous produisons"$b..."
avec une variable de compteur$i
encapsulée entre parenthèses et la valeur actuelle$_
. La$i
variable de commence initialisés (équivalent à$null
) mais++
sera jeté à unint
avant la sortie, il commencera à la sortie0
, tout avant d' incrémenter$i
pour la prochaine itération de la boucle.Toutes les lignes de sortie sont laissées sur le pipeline et la sortie vers le terminal est implicite à la fin du programme.
Exemple
la source
C,
278280 octetsjoué au golf:
ungolfed:
Pendant que nous travaillions là-dessus, certaines personnes ont publié une version abrégée utilisant sscanf pour l’analyse plutôt que des pointeurs de données ... bien sympa!
UPDATE: Des espaces manquants repérés autour des égaux dans l'impression d'élément, lien en ligne IDE: http://ideone.com/KrgRt0 . Notez que cette implémentation supporte les nombres négatifs ...
la source
Awk, 101 octets
Plus lisiblement:
-
. Ainsi, les champs seraient le nom du type, le nom de la variable et les nombres.};
). Donc, la taille du tableau estNF - 3
.FS
soit en invoquant awk (using-F
), soit enBEGIN
bloc. Par souci de brièveté,…la source
FS
doit être assigné soit en soit enBEGIN
utilisant-F
sinon il ne sera pas utilisé pour scinder la première ligne, et comme il n'y a qu'une ligne d'entrée ...awk '-F[^[:alnum:]_-]+' '{printf"%s %s[%d];\n",$1,$2,NF-3;for(i=3;i<NF;i++)printf$2"[%d] = %d;\n",i-3,$i}'
102 octets sans compterawk
elle-même. Hmmm. Est-ce que je peux exclure les citations?C+O bytes
oùC
etO
représentez les octets du code et des options, respectivement. Bien sûr, je n'utilise généralement qu'unBEGIN
bloc, donc je n'ai pas à y penser. : pJavaScript ES6,
134132130129 octetsSauvé 1 octet grâce à Neil.
la source
`[${i}] = `+t+";"
être`[${i}] = ${t};`
?bash,
133129 octetsPremière tentative, bien sûr, il est possible de la raccourcir.
la source
RÉ,
197, 188 octetsou non-golfés:
la source
Julia,
154134101 octetsIl s'agit d'une fonction qui accepte une chaîne et retourne une chaîne avec une nouvelle ligne de fin.
Ungolfed:
Nous définissons
c
être un tableau de correspondances de l'entrée sur l'expression régulière-?\w+
. Il indique le type, le nom du tableau, puis chaque valeur. Nous stockonsn
comme la longueur dec
- 2, qui est le nombre de valeurs. La sortie est construite sous la forme d'une chaîne de type, de nom et de longueur interpolée, combinée à chaque ligne de définition séparée par des nouvelles lignes. Pour quelque raison que ce soit,c[]
est le même quec[1]
.Enregistré 32 octets avec l'aide de Dennis!
la source
Python 2, 159 octets
Essayez-le en ligne
Merci Kevin Lau pour certaines suggestions de golf
la source
Python 3, 116 octets
Divise l'entrée en type, nom et liste de nombres. Après avoir imprimé la matrice en déclarant, imprime les éléments en énumérant manuellement les nombres, en supprimant les excès de ponctuation attachés aux premier et dernier.
Une approche différente dans Python 2 est sortie à 122 octets:
L'idée est de faire en
eval
sorte que la liste de nombres soit un tuple, avec une virgule à la fin, de sorte qu'un seul numéro soit reconnu en tant que type. La liste énumérée de nombres fournit des nuplets au format chaîne dans.la source
PHP, 143 octets
Golfé
Ungolfed
L'entrée est prise via un argument de ligne de commande. Échantillon:
Sortie:
la source
MATL ,
686458 octetsCe n'est pas C,
mais il utilise laNah, qui gaspillait 4 octets.sprintf
fonctionEssayez-le en ligne!
la source
Clojure, 115 octets
Je ne pouvais pas bien fusionner
awful_array_name[5];
etawful_array_name[0] = 7;
parties pour pouvoir réutiliser du code: /la source