In 1.13 wurden Minecraft-Sprachdateien von einem einfachen mehrzeiligen Schlüssel = Wert-Format auf JSON umgestellt .
Herausforderung
Schreiben Sie ein Programm, das vom Originalformat konvertiert und eine JSON-Zeichenfolge zurückgibt. Die Eingabe kann mit jeder Standardeingabemethode erfolgen. Die Ausgabe muss mit einer beliebigen Standardausgabemethode erfolgen
Das Originalformat enthält beispielsweise Zeilen mit Schlüssel = Wert-Paaren
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Sollte in ein großes JSON-Objekt mit key = value konvertiert werden
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Ein paar Details
- Jeder gültige JSON ist zulässig, solange er nur die richtigen Schlüssel / Wert-Paare enthält. Nachgestellte Kommas sind zulässig, da Minecraft dies zulässt.
- Die einzigen Dinge, die entkommen müssen, sind Anführungszeichen. (Vor 1.13 waren in der Sprachdatei keine Zeilenumbrüche, Backslashes oder andere json-brechende Dinge vorhanden.)
- Leere Zeilen sollten ignoriert werden
- Zeilen enthalten genau eins gleich
Testfälle
Eingang:
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Ausgabe:
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Eingang:
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
Ausgabe:
{
"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",
}
Eingang:
stat.mineBlock=%1$s Mined
stat.craftItem=%1$s Crafted
stat.useItem=%1$s Used
stat.breakItem=%1$s Depleted
Ausgabe:
{
"stat.mineBlock": "%1$s Mined",
"stat.craftItem": "%1$s Crafted",
"stat.useItem": "%1$s Used",
"stat.breakItem": "%1$s Depleted"
}
tile.dirt.name
es"block.minecraft.dirt"
?=
?Antworten:
Python 3,
9177 Bytes-14 Bytes dank OMᗺ
Ich dachte, dass der Ausdruck eines Python-Wörterbuchs nahe genug an JSON sein würde, um es zu einer sehr wettbewerbsfähigen Sprache für diese Herausforderung zu machen. Die Zeichenfolgendarstellung von Python-Wörterbüchern unterscheidet sich jedoch so stark von JSON, dass ich mit der in Python integrierten JSON-Bibliothek mehr Glück hatte. Ich wette, dies kann in JavaScript prägnanter durchgeführt werden.
Probieren Sie es online aus!
Bearbeiten:
Bash + Sed,
6863 BytesFehlerbehebung dank OMᗺ und Night 2
-5 Bytes dank OMᗺ
Ich erkannte, dass es möglicherweise byteeffizienter ist, den Text direkt in JSON zu konvertieren, ohne ihn in einem Objekt zu bündeln, ebenso wie mein Ansatz für die Python-Lösung. Pro Byte ist sed die mächtigste Sprache für den Regex-Ersatz, die ich kenne.
Probieren Sie es online aus!
Erläuterung
quelle
-r
Flag für sed (+3 Byte), damit Sie den Erfassungsgruppen (-4 Byte) nicht entkommen müssen. Tio.run/##LYq7CgIxEEX7/…Vim, 44 Bytes
Erläuterung:
quelle
Rost , 150 Bytes
Probieren Sie es online aus!
Ist es länger als Java?
quelle
Retina 0,8,2 , 35 Bytes
Probieren Sie es online aus! Wäre 34 Bytes in Retina 1, da Sie
L$`.+
anstelle vonG`.
und verwenden können.+
. Erläuterung:Entkomme den Anführungszeichen.
Korrigieren Sie das Schlüssel / Wert-Trennzeichen. (Wenn der Wert a enthalten könnte
=
, verwenden Sie ihn1`=
zu einem Preis von 2 Byte.)Leere Zeilen entfernen.
Schließen Sie jede Zeile in Anführungszeichen ein. (Die inneren Anführungszeichen wurden früher hinzugefügt.)
Wickeln Sie die gesamte Ausgabe in
{}
s.quelle
Schale , 22 Bytes
Die Manipulation von Saiten ist nicht wirklich die Stärke von Husk, aber sie hat sich ziemlich gut bewährt:
Probieren Sie es online aus!
quelle
Ruby , 56 Bytes
+6 Bytes für das
-rjson
Interpreter-Flag.Probieren Sie es online aus!
quelle
-rjson
, sondern auch angenommen, ohne tatsächlich zu überprüfen, dass der Fehler der gleiche war, den ich zuvor mitto_h
Perl 5
-nl -M5.010
,5854 BytesProbieren Sie es online aus!
58-Byte-Version:
Probieren Sie es online aus!
quelle
}
sollte weggelassen werden und schlägt bei den strengsten JSON-Validatoren fehl). Hier ist eine schnelle 58-Byte-Umschreibung, die ein gültiges (wenn auch für menschliche Leser hässlicheres) JSON ergibt:$c||='{';s'"'\"'g;/=/&&say qq|$c"$`":"$'"|;$c=','}{say'}'
Ich gehe davon aus, dass Sie etwas finden können, das etwas kürzer / eleganter ist.BEGIN
. OP erlaubt jedoch explizit nachfolgende Kommas: "Nachgestellte Kommas sind zulässig, da Minecraft dies zulässt." Fühlen Sie sich frei, dies als neue Antwort zu posten und den Unterschied zu erwähnen.BEGIN
noch kürzer, wenn Sie nur das '{' ausgeben möchten. Ich mag deineEND
Vermeidungstechnik. Ich wusste, dass dies-n
eine effektivewhile(<>){}
Schleife um Ihren Code darstellt. Ich hatte keine Ahnung, wie wörtlich das war.Haskell ,
7571 Bytes-4 Bytes dank Laikoni (mit Do-Notation über Listenverständnis)!
Funktioniert mit mehreren
=
in einer Zeile:Probieren Sie es online aus!
Erläuterung
Der Begriff
span(/='=')<$>lines s
teilt die Zeichenfolge auf der ersten=
und lässt uns mit("<initial part>","=<remaining line>")
. Durch eine Musterübereinstimmung wird(a,_:b)
sichergestellt, dass die Zeile nicht leer war, und gleichzeitig wird die führende Zeile entfernt=
.Jetzt müssen wir nur noch
show
beidesa
undb
(in Anführungszeichen einschließen und Anführungszeichen einschließen) einige Formatierungen (:
und,
Zeichen) vornehmen und es schließlich einschließen{}
.quelle
do
: Probieren Sie es online aus!C (gcc) ,
243219 BytesVielen Dank an Ceilingcat für den Vorschlag.
Ich entschied mich für eine Zustandsmaschine, um die drei Fälle (Zeilenumbruch, Schlüssel, Wert) zu behandeln, und es stellte sich als ziemlich gut heraus. Auch ich bekam
abverwenden , um den Durchfall Merkmalswitch
und die Makrozeichenfolge Operator!Obwohl die Herausforderung dies nicht erforderte, bin ich dem
\
Charakter gemäß der JSON-Spezifikation entkommen . Wenn dieses Zeichen niemals in der Eingabe enthalten sein wird,&&c-92
kann es für weitere 5 Bytes entfernt werden.Probieren Sie es online aus!
Ursprüngliche Einreichung: 243 Bytes
Die ursprüngliche Einreichung behielt unnötigen Abstand wie in den bereitgestellten JSON-Beispielen.
Probieren Sie es online aus!
quelle
JavaScript,
666362 BytesCode-Snippet anzeigen
-3 Bytes dank @redundancy
-1 Byte dank @ l4m2
quelle
Retina 0,8,2 , 43 Bytes
Probieren Sie es online aus!
quelle
Perl 6 , 48 Bytes
2 Bytes weniger, wenn wir in einer nicht leeren Zeile genau 1 Gleichheitszeichen annehmen können.
Probieren Sie es online aus!
Ungolfed:
Übrigens ist die
to-json
Routine veraltet, wie der Compiler Ihnen sagen wird, aber wen interessiert das?quelle
Python 2 , 81 Bytes
Probieren Sie es online aus!
quelle
Ruby, 59 + 5 = 64
Bedürfnisse
-rjson
(+5)Erläuterung:
quelle
JavaScript (ES6), 66 Byte
Angenommen, es gibt nur eine
=
pro ZeileSnippet testen
quelle
"code".length
in der Javascript-Konsole zu verwenden, um die Länge zu zählenV , 30 Bytes
Erwartet jeweils eine Eingabe. Das TIO-Snippet führt alle angegebenen Testfälle als eine einzige Eingabe aus.
Ich bin neu in den erweiterten Zuordnungen von V, daher sind Tipps immer willkommen!
Probieren Sie es online aus!
Erläuterung
quelle
C (gcc) , 172 Bytes
Probieren Sie es online aus!
Basierend auf der Implementierung von @ ErikF, jedoch ohne
switch/case
.Leicht ungolfed Version
quelle
R, 118 Bytes
Probieren Sie es online aus!
quelle
C (gcc) , 119 Bytes
Probieren Sie es online aus!
quelle
PHP, 87 Bytes
Laufen Sie als Pipe mit
-nR
oder probieren Sie es online aus .\s
Vorher einfügen$/m
für Windows-Zeilenumbrüche;\s*
wenn Zeilenumbrüche ungewiss sind. Nacheinfügen, wenn Werte enthalten .
U
$/m
=
quelle
Dart ,
142114108 BytesProbieren Sie es online aus!
quelle