Dans la version 1.13, les fichiers de langue Minecraft sont passés d'un simple format multi-lignes clé = valeur à JSON .
Défi
Écrivez un programme convertissant du format d'origine en renvoyant une chaîne JSON. L'entrée peut être prise en utilisant n'importe quelle méthode d'entrée standard, la sortie doit être json à partir de n'importe quelle méthode de sortie standard
Le format d'origine contient des lignes avec des paires clé = valeur, par exemple
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Doit être converti en un grand objet JSON avec clé = valeur
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Quelques détails
- Tout JSON valide est autorisé tant qu'il ne contient que les bonnes paires clé / valeur. Les virgules de fin sont autorisées car Minecraft les autorise.
- Les seules choses à échapper sont les guillemets. (Aucune nouvelle ligne, barre oblique inverse ou autre élément brisant json n'existait dans le fichier de langue avant la version 1.13)
- Les lignes vides doivent être ignorées
- Les lignes contiennent exactement un égal
Cas de test
Contribution:
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Production:
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Contribution:
translation.test.none=Hello, world!
translation.test.complex=Prefix, %s%2$s again %s and %1$s lastly %s and also %1$s again!
translation.test.escape=%%s %%%s %%%%s %%%%%s
translation.test.invalid=hi %
translation.test.invalid2=hi % s
translation.test.args=%s %s
translation.test.world=world
Production:
{
"translation.test.none": "Hello, world!",
"translation.test.complex": "Prefix, %s%2$s again %s and %1$s lastly %s and also %1$s again!",
"translation.test.escape": "%%s %%%s %%%%s %%%%%s",
"translation.test.invalid": "hi %",
"translation.test.invalid2": "hi % s",
"translation.test.args": "%s %s",
"translation.test.world": "world",
}
Contribution:
stat.mineBlock=%1$s Mined
stat.craftItem=%1$s Crafted
stat.useItem=%1$s Used
stat.breakItem=%1$s Depleted
Production:
{
"stat.mineBlock": "%1$s Mined",
"stat.craftItem": "%1$s Crafted",
"stat.useItem": "%1$s Used",
"stat.breakItem": "%1$s Depleted"
}
tile.dirt.name
devient-il"block.minecraft.dirt"
?=
?Réponses:
Python 3,
9177 octets-14 octets grâce à OMᗺ
Je pensais que l'impression d'un dictionnaire Python serait assez proche de JSON pour en faire un langage très compétitif pour ce défi. Cependant, la représentation sous forme de chaîne des dictionnaires python est suffisamment différente de JSON pour que j'aie plus de chance d'utiliser la bibliothèque JSON intégrée de python. Je parie que cela peut être fait plus succinctement en JavaScript.
Essayez-le en ligne!
Éditer:
Bash + Sed,
6863 octetsCorrection d'un bug grâce à OMᗺ et Night 2
-5 Bytes grâce à OMᗺ
J'ai réalisé qu'il pourrait être plus efficace d'octet de convertir directement le texte en JSON sans le regrouper dans un objet, comme ce fut mon approche pour la solution python. Par octet, sed est le langage le plus puissant pour le remplacement de regex que je connaisse.
Essayez-le en ligne!
Explication
la source
-r
indicateur pour sed (+3 octets) afin de ne pas avoir besoin d'échapper aux groupes de capture (-4 octets) tio.run/##LYq7CgIxEEX7/…Vim, 44 octets
Explication:
la source
Rouille , 150 octets
Essayez-le en ligne!
Est-il plus long que Java?
la source
Retina 0.8.2 , 35 octets
Essayez-le en ligne! Serait de 34 octets dans Retina 1 que vous pouvez utiliser
L$`.+
au lieu deG`.
et.+
. Explication:Échappez aux citations.
Corrigez le séparateur clé / valeur. (Si la valeur peut contenir un
=
, utilisez1`=
au coût de 2 octets.)Supprimez les lignes vides.
Mettez chaque ligne entre guillemets. (Les guillemets intérieurs ont été ajoutés plus tôt.)
Envelopper la sortie entière dans
{}
s.la source
Husk , 22 octets
La manipulation des cordes n'est pas vraiment la force de Husk, mais elle a plutôt bien fonctionné:
Essayez-le en ligne!
la source
Rubis , 56 octets
+6 octets pour l'
-rjson
indicateur d'interpréteur.Essayez-le en ligne!
la source
-rjson
, mais aussi supposé sans vraiment vérifier que l'erreur était la même que celle que j'avais eue plus tôt concernantto_h
Perl 5
-nl -M5.010
,5854 octetsEssayez-le en ligne!
Version 58 octets:
Essayez-le en ligne!
la source
}
doit être omise et échouera la plupart des validateurs JSON stricts). Voici une réécriture rapide de 58 octets qui produit un JSON valide (s'il est plus laid pour les lecteurs humains):$c||='{';s'"'\"'g;/=/&&say qq|$c"$`":"$'"|;$c=','}{say'}'
Je pense que vous pouvez trouver quelque chose d'un peu plus court / plus élégant.BEGIN
. OP autorise explicitement les virgules de fin cependant: "Les virgules de fin sont autorisées parce que Minecraft les autorise.". N'hésitez pas à poster cela comme une nouvelle réponse, en mentionnant la différence.BEGIN
est encore plus court dans le cas où vous souhaitez simplement émettre le '{'. J'aime votreEND
technique évitant. Je savais que cela-n
plaçait une boucle efficacewhile(<>){}
autour de votre code; Je ne savais pas à quel point c'était littéral.Haskell ,
7571 octets-4 octets grâce à Laikoni (en utilisant la do-notation sur la compréhension de liste)!
Fonctionne avec plusieurs
=
sur une seule ligne:Essayez-le en ligne!
Explication
Le terme
span(/='=')<$>lines s
divise la chaîne sur le premier=
, nous laissant avec("<initial part>","=<remaining line>")
. Faire une correspondance de modèle(a,_:b)
garantit que la ligne n'était pas vide et en même temps supprime l'interlignage=
.Maintenant, nous avons seulement besoin à la
show
fois de (a
et deb
le mettre entre guillemets et des guillemets qui s'échappent), de faire un certain formatage (:
et des,
caractères) et de l'enfermer enfin{}
.la source
do
: Essayez-le en ligne!C (gcc) ,
243219 octetsMerci à plafondcat pour la suggestion.
J'ai décidé d'utiliser une machine d'état pour gérer les trois cas (nouvelle ligne, clé, valeur) et cela s'est plutôt bien passé. De plus, j'ai pu utiliser
abla fonction Fall-Throughswitch
et l'opérateur de macro-chaîne!Bien que le défi ne l'exige pas, j'ai également échappé au
\
personnage selon la spécification JSON. Si ce caractère ne sera jamais dans l'entrée, il&&c-92
peut être supprimé pour 5 octets supplémentaires.Essayez-le en ligne!
Soumission d'origine: 243 octets
La soumission d'origine a gardé un espacement inutile comme dans les exemples JSON fournis.
Essayez-le en ligne!
la source
JavaScript,
666362 octetsAfficher l'extrait de code
-3 octets grâce à @redundancy
-1 octet grâce à @ l4m2
la source
Retina 0.8.2 , 43 octets
Essayez-le en ligne!
la source
Perl 6 , 48 octets
2 octets de moins si l'on peut supposer exactement 1 signe égal sur une ligne non vide.
Essayez-le en ligne!
Non golfé:
Soit dit en passant, la
to-json
routine est déconseillée, comme le compilateur vous le dira, mais peu importe.la source
Python 2 , 81 octets
Essayez-le en ligne!
la source
Rubis, 59 + 5 = 64
Besoins
-rjson
(+5)Explication:
la source
JavaScript (ES6), 66 octets
Suppose qu'il n'y en a qu'un
=
par ligneExtrait de test
la source
"code".length
dans la console javascript pour compter la longueurV , 30 octets
Attend une entrée à la fois. L'extrait TIO exécute tous les cas de test donnés en une seule entrée.
Je suis nouveau dans les mappages étendus de V, donc les conseils sont toujours les bienvenus!
Essayez-le en ligne!
Explication
la source
C (gcc) , 172 octets
Essayez-le en ligne!
Basé sur l'implémentation de @ ErikF mais sans
switch/case
.Version légèrement non golfée
la source
R, 118 octets
Essayez-le en ligne!
la source
C (gcc) , 119 octets
Essayez-le en ligne!
la source
PHP, 87 octets
Exécuter en tant que pipe avec
-nR
ou l' essayer en ligne .Insérer
\s
avant$/m
pour les sauts de ligne Windows;\s*
si les sauts de ligne sont incertains.Insérer
U
après$/m
si les valeurs contiennent=
.la source
Dart ,
142114108 octetsEssayez-le en ligne!
la source