Aperçu:
Votre travail consiste à prendre l'entrée CSV au key=value
format et à l'aligner de manière plus organisée (voir ci-dessous).
Contribution:
Toujours via stdin . Les enregistrements seront toujours sous la forme suivante key=value
:
foo=bar,baz=quux
abc=123,foo=fubar
baz=qwe,abc=rty,zxc=uiop,foo=asdf
- Il n'y aura pas de liste de clés possibles à l'avance, vous devez les trouver dans le texte saisi.
- La fin de l'entrée sera signalée par
EOF
, quelle que soit l'implémentation deEOF
appropriée à votre système d'exploitation.
Production:
La première ligne de votre sortie sera une liste de toutes les clés, par ordre alphabétique (même si les clés sont toutes des nombres). Après cela, imprimez chaque enregistrement dans le même format CSV l'en-tête de numéro approprié, sans les clés répertoriées. Ainsi, pour l'exemple ci-dessus, la sortie correcte serait:
abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop
FAQ:
- Dois-je m'inquiéter d'une entrée mal formatée?
- Non. Votre programme peut faire ce qu'il veut (lever une exception, ignorer, etc.) si l'entrée n'est pas correctement formatée, par exemple une ligne de
foo,bar,baz
- Non. Votre programme peut faire ce qu'il veut (lever une exception, ignorer, etc.) si l'entrée n'est pas correctement formatée, par exemple une ligne de
- Comment gérer les caractères spéciaux d'échappement?
- Vous pouvez supposer qu'il n'y aura pas de données supplémentaires
,
ou=
dans les données qui ne font pas partie dukey=value
format."
n'a pas de signification particulière dans ce concours (même si c'est le cas en CSV traditionnel).n'est pas spécial non plus.
- Les lignes doivent correspondre à l'expression régulière suivante:
^([^=,]+=[^=,]+)(,[^=,]+=[^=,]+)*$
- Par conséquent, les clés et les valeurs correspondront
[^=,]+
- Par conséquent, les clés et les valeurs correspondront
- Vous pouvez supposer qu'il n'y aura pas de données supplémentaires
- Et
CRLF
contreLF
?- Vous pouvez choisir le délimiteur approprié à votre plateforme. La plupart des langues gèrent cela sans code de délimitation spécial.
- Dois-je imprimer des virgules de fin si les dernières colonnes n'existent pas?
- Oui. Voir l'exemple.
- Les analyseurs CSV ou autres outils externes similaires sont-ils autorisés?
- Non. Vous devez analyser les données vous-même.
Réponses:
GolfScript, 64 caractères
Le code est une implémentation simple dans GolfScript, vous pouvez tester l'exemple en ligne .
Code annoté:
la source
Perl 6: 119 caractères, 120 octets
De-golfé:
la source
perl, 129/121
129 octets, pas de commutateurs de ligne de commande:
Comme le souligne @Dennis ci-dessous, vous pouvez obtenir ceci à 120 + 1 = 121 en utilisant -n:
Fondamentalement, pour chaque ligne, nous nous séparons par des virgules pour obtenir la liste des paires. Pour chaque paire, nous nous séparons par le signe égal pour obtenir la clé et la valeur. Nous définissons la paire clé / valeur dans% h et une référence de hachage locale. Le premier est utilisé pour déterminer la liste des clés. Ce dernier est utilisé pour mémoriser les valeurs de cette ligne.
la source
-n
commutateur au lieu defor(<>){...}
. 2. Se diviser[, ]
au lieu d'utiliserchomp
. 3. Omettre le point-virgule après les accolades.while (<>) { ... }
tout le script, donc il n'y a pas besoin de bloc END. Supprimez simplementfor(<>){
au début et}
à la fin du script.}
à la fin du script, pas celui correspondant à lafor
boucle. En outre, vous pouvez enregistrer un caractère de plus en utilisant une nouvelle ligne réelle au lieu de\n
.JavaScript ( ES5 )
191183179168 octetsEn supposant que le code est exécuté en ligne de commande spidermonkey:
Résultat:
Cette cale peut être utilisée dans un navigateur pour simuler les spidermonkey
readline
etprint
:Non golfé:
la source
alert
à la placeconsole.log
et enregistrer ainsi quelques octets.readline
etprint
pour stdin / outBash + coreutils,
188138 bytesProduction:
la source
Haskell,
357334g
fait l'analyse - il divise l'entrée en lignes et mappe chaque ligne à une liste de(key,value)
paires.k
, en concaténant toutes les clés dans une liste et en supprimant les doublons, crée une liste avec toutes les clés uniques que je pourrai ensuite utiliser pour le tri. Je le fais en créant un "Set" à l'intérieurmain
(m(flip(,)"").k$d == [("abc",""),("baz",""),("foo",""),("zxc","")]
) pour chaque ligne, puis en prenant chaque(key,value)
paire d'une ligne et en la mettant à sa place dans la liste (foldl
). La ligne 1 de l'exemple donne[("abc",""),("baz","quux"),("foo","bar"),("zxc","")]
, que je concatène en une seule chaîne (",quux,bar,"
), concatène avec les autres lignes et imprime.la source
Python 2.7 - 242 octets
saigner
Notez que la deuxième couche d'indentation est un caractère de tabulation unique, et non quatre espaces comme SE le rend.
Non golfé:
la source
Python 3:
200195192189187la source
k4 (40? 51? 70? 46?)
l'expression de base est
cela accepte et renvoie une liste de chaînes
pour correspondre à la spécification, nous pourrions faire de manière interactive
qui accepte l'entrée de stdin et imprime la sortie sur stdout
pour une application autonome acceptant les entrées d'un tuyau, nous pourrions faire ceci:
bien que si vous êtes prêt à considérer mon wrapper k-as-filter préexistant, awq.k, comme un outil acceptable pour ce genre de puzzle, alors nous pouvons le faire:
qui est soit 46 caractères soit 40, selon la façon dont vous comptez les disputes entre guillemets
la source
q
commander? Estawq.k
publié quelque part?C # - 369
(dans LINQPAD)
Non golfé
Tester l'entrée de chaîne
Production
la source
CRLF
vsLF
FAQ) Malheureusement, je n'ai pas de copie de Visual Studio pour tester.