En 1.13, los archivos de idioma de Minecraft se cambiaron de ser un formato simple de clave = valor de varias líneas a JSON .
Desafío
Escriba un programa que convierta del formato original y devuelva una cadena JSON. La entrada se puede tomar usando cualquier método de entrada estándar, la salida debe ser json de cualquier método de salida estándar
El formato original contiene líneas con pares clave = valor, por ejemplo
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Debe convertirse en un objeto JSON grande con clave = valor
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Algunos detalles
- Se permite cualquier JSON válido siempre que contenga solo los pares clave / valor correctos. Las comas finales están permitidas porque Minecraft las permite.
- Las únicas cosas que se deben escapar son las comillas. (No existían líneas nuevas, barras diagonales invertidas u otras cosas que rompieran los json en el archivo de idioma antes de 1.13)
- Las líneas vacías deben ignorarse.
- Las líneas contienen exactamente uno igual
Casos de prueba
Entrada:
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Salida:
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Entrada:
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
Salida:
{
"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",
}
Entrada:
stat.mineBlock=%1$s Mined
stat.craftItem=%1$s Crafted
stat.useItem=%1$s Used
stat.breakItem=%1$s Depleted
Salida:
{
"stat.mineBlock": "%1$s Mined",
"stat.craftItem": "%1$s Crafted",
"stat.useItem": "%1$s Used",
"stat.breakItem": "%1$s Depleted"
}
tile.dirt.name
llegar a ser"block.minecraft.dirt"
?=
?Respuestas:
Python 3,
9177 bytes-14 Bytes gracias a OMᗺ
Pensé que la impresión de un diccionario de Python estaría lo suficientemente cerca de JSON para convertirlo en un lenguaje muy competitivo para este desafío. Sin embargo, la representación de cadena de los diccionarios de Python es lo suficientemente diferente de JSON que tuve más suerte usando la biblioteca JSON incorporada de python. Apuesto a que esto se puede hacer de manera más sucinta en JavaScript.
Pruébalo en línea!
Editar:
Bash + Sed,
6863 bytesCorrección de errores gracias a OMᗺ y Night 2-5
Bytes gracias a OMᗺ
Me di cuenta de que podría ser más eficiente en bytes convertir directamente el texto a JSON sin agruparlo en un objeto, como fue mi enfoque para la solución de Python. Por byte, sed es el lenguaje más poderoso para el reemplazo de expresiones regulares que conozco.
Pruébalo en línea!
Explicación
fuente
-r
indicador para sed (+3 bytes) para que no necesite escapar de los grupos de captura (-4 bytes) tio.run/##LYq7CgIxEEX7/…Vim, 44 bytes
Explicación:
fuente
Óxido , 150 bytes
Pruébalo en línea!
¿Es más largo que Java?
fuente
Retina 0.8.2 , 35 bytes
Pruébalo en línea! Sería de 34 bytes en Retina 1 como puede usar en
L$`.+
lugar deG`.
y.+
. Explicación:Escapar de las citas.
Arregle el separador clave / valor. (Si el valor puede contener a
=
, úselo1`=
a un costo de 2 bytes).Eliminar líneas vacías.
Envuelva cada línea entre comillas. (Las citas internas se agregaron anteriormente).
Envuelva toda la salida en
{}
s.fuente
Casco , 22 bytes
La manipulación de cuerdas no es realmente la fuerza de Husk, pero funcionó bastante bien:
Pruébalo en línea!
fuente
Ruby , 56 bytes
+6 bytes para la
-rjson
bandera del intérprete.Pruébalo en línea!
fuente
-rjson
, sino que también asumí sin verificar que el error era el mismo que había involucrado anteriormenteto_h
Perl 5
-nl -M5.010
,5854 bytesPruébalo en línea!
Versión de 58 bytes:
Pruébalo en línea!
fuente
}
debe omitirse y fallará con los validadores JSON más estrictos). Aquí hay una rápida reescritura de 58 bytes que produce JSON válido (si es más feo para los lectores humanos):$c||='{';s'"'\"'g;/=/&&say qq|$c"$`":"$'"|;$c=','}{say'}'
espero que pueda encontrar algo un poco más corto / más elegante.BEGIN
. Sin embargo, OP permite explícitamente las comas finales: "Las comas finales están permitidas porque Minecraft las permite". Siéntase libre de publicar eso como una nueva respuesta, mencionando la diferencia.BEGIN
aún es más corto en el caso en que solo desea emitir el '{'. Me gusta tuEND
técnica para evitar. Sabía que eso-n
colocaba un bucle efectivowhile(<>){}
alrededor de su código; No tenía idea de cuán literal era eso.Haskell ,
7571 bytes-4 bytes gracias a Laikoni (¡usando la notación do sobre la comprensión de la lista)!
Funciona con múltiples
=
en una línea:Pruébalo en línea!
Explicación
El término
span(/='=')<$>lines s
divide la cadena en el primero=
, dejándonos con("<initial part>","=<remaining line>")
. Hacer una coincidencia de patrones(a,_:b)
asegura que la línea no esté vacía y al mismo tiempo elimina el inicio=
.Ahora solo necesitamos
show
ambosa
yb
(encerrándolo entre comillas y comillas), formatear (:
y,
caracteres) y finalmente encerrarlo{}
.fuente
do
: ¡ Pruébelo en línea!C (gcc) ,
243219 bytesGracias a ceilingcat por la sugerencia.
Decidí usar una máquina de estado para manejar los tres casos (nueva línea, clave, valor) y resultó bastante bien. Además, tengo que
abuso de la caída a través de la funciónswitch
y el operador stringizing macro!Aunque el desafío no lo requería, también escapé del
\
personaje según la especificación JSON. Si ese carácter nunca estará en la entrada, se&&c-92
puede eliminar por 5 bytes más.Pruébalo en línea!
Envío original: 243 bytes
El envío original mantuvo espacios innecesarios como en los ejemplos JSON proporcionados.
Pruébalo en línea!
fuente
JavaScript,
666362 bytesMostrar fragmento de código
-3 bytes gracias a @redundancy
-1 byte gracias a @ l4m2
fuente
Retina 0.8.2 , 43 bytes
Pruébalo en línea!
fuente
Perl 6 , 48 bytes
2 bytes menos si podemos suponer exactamente 1 signo igual en una línea no vacía.
Pruébalo en línea!
Sin golf:
Por cierto, la
to-json
rutina está en desuso, como el compilador le dirá, pero a quién le importa.fuente
Python 2 , 81 bytes
Pruébalo en línea!
fuente
Rubí, 59 + 5 = 64
Necesidades
-rjson
(+5)Explicación:
fuente
JavaScript (ES6), 66 bytes
Asume que solo hay uno
=
por líneaFragmento de prueba
fuente
"code".length
en la consola javascript para contar la longitudV , 30 bytes
Espera una entrada a la vez. El fragmento TIO ejecuta todos los casos de prueba dados como una sola entrada.
Soy nuevo en las asignaciones extendidas de V, ¡así que los consejos siempre son bienvenidos!
Pruébalo en línea!
Explicación
fuente
C (gcc) , 172 bytes
Pruébalo en línea!
Basado en la implementación de @ ErikF pero sin ella
switch/case
.Versión ligeramente no golf
fuente
R, 118 bytes
Pruébalo en línea!
fuente
C (gcc) , 119 bytes
Pruébalo en línea!
fuente
PHP, 87 bytes
Ejecutar como tubería
-nR
o probarlo en línea .Insertar
\s
antes$/m
para los saltos de línea de Windows;\s*
si los saltos de línea son inciertos.Insertar
U
después$/m
si los valores contienen=
.fuente
Dart ,
142114108 bytesPruébalo en línea!
fuente