Na versão 1.13, os arquivos de idioma do Minecraft passaram de um simples formato de chave = valor de várias linhas para JSON .
Desafio
Escreva um programa convertendo do formato original retornando uma string JSON. A entrada pode ser obtida usando qualquer método de entrada padrão, a saída deve ser json a partir de qualquer método de saída padrão
O formato original contém linhas com pares chave = valor, por exemplo
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Deve ser convertido em um objeto JSON grande com chave = valor
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Alguns detalhes
- Qualquer JSON válido é permitido, desde que contenha apenas os pares chave / valor corretos. Vírgulas finais são permitidas porque o Minecraft permite.
- As únicas coisas que devem ser evitadas são aspas. (Nenhuma linha nova, barras invertidas ou outras coisas que quebram json existiam no arquivo de idioma anterior à 1.13)
- Linhas vazias devem ser ignoradas
- As linhas contêm exatamente um é igual a
Casos de teste
Entrada:
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Resultado:
{
"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
Resultado:
{
"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
Resultado:
{
"stat.mineBlock": "%1$s Mined",
"stat.craftItem": "%1$s Crafted",
"stat.useItem": "%1$s Used",
"stat.breakItem": "%1$s Depleted"
}
tile.dirt.name
torna"block.minecraft.dirt"
?=
?Respostas:
Python 3,
9177 bytes-14 bytes graças a OMᗺ
Eu pensei que a impressão de um dicionário Python seria próxima o JSON para torná-lo uma linguagem muito competitiva para esse desafio. No entanto, a representação em string dos dicionários python é diferente o suficiente do JSON, para que eu tenha melhor sorte usando a biblioteca JSON interna do python. Aposto que isso pode ser feito de forma mais sucinta em JavaScript.
Experimente Online!
Editar:
Bash + Sed,
6863 bytesCorreção de bug graças ao OMᗺ e Night 2
-5 Bytes graças ao OMᗺ
Percebi que poderia ser mais eficiente em byte converter diretamente o texto em JSON sem agrupá-lo em um objeto, como foi minha abordagem para a solução python. Por byte, sed é a linguagem mais poderosa para substituição de regex que eu conheço.
Experimente Online!
Explicação
fonte
-r
bandeira de sed (+3 bytes) de modo que você não precisa para escapar à captura de grupos (-4 bytes) tio.run/##LYq7CgIxEEX7/...Vim, 44 bytes
Explicação:
fonte
Ferrugem , 150 bytes
Experimente online!
É mais longo que Java?
fonte
Retina 0.8.2 , 35 bytes
Experimente online! Seriam 34 bytes na Retina 1, como você pode usar em
L$`.+
vez deG`.
e.+
. Explicação:Fuja das aspas.
Corrija o separador de chave / valor. (Se o valor puder conter a
=
, use1`=
a um custo de 2 bytes.)Remova linhas vazias.
Coloque cada linha entre aspas. (As aspas internas foram adicionadas anteriormente.)
Embrulhe toda a saída em
{}
s.fonte
Casca , 22 bytes
A manipulação de cordas não é realmente a força de Husk, mas foi muito bem:
Experimente online!
fonte
Ruby , 56 bytes
+6 bytes para
-rjson
sinalizador de intérprete.Experimente online!
fonte
-rjson
, mas também assumiu sem realmente verificar se o erro era a mesma que eu tinha começado mais cedo envolvendoto_h
Perl 5
-nl -M5.010
,5854 bytesExperimente online!
Versão de 58 bytes:
Experimente online!
fonte
}
deve ser omitida e falhará na maioria dos validadores JSON estritos). Aqui está uma rápida reescrita de 58 bytes que produz JSON válido (embora mais feio para leitores humanos):$c||='{';s'"'\"'g;/=/&&say qq|$c"$`":"$'"|;$c=','}{say'}'
Espero que você encontre algo um pouco mais curto / elegante.BEGIN
. O OP permite explicitamente vírgulas finais: "Vírgulas finais são permitidas porque o Minecraft permite.". Fique à vontade para postar isso como uma nova resposta, mencionando a diferença.BEGIN
ainda será mais curto no caso em que você apenas deseja emitir o '{'. Eu gosto da suaEND
técnica de evitar. Eu sabia que isso-n
colocava um loop efetivowhile(<>){}
em torno do seu código; Eu não tinha ideia do quão literal isso era.Haskell ,
7571 bytes-4 bytes graças a Laikoni (usando notação do que compreensão da lista)!
Funciona com vários
=
em uma linha:Experimente online!
Explicação
O termo
span(/='=')<$>lines s
divide a corda no primeiro=
, deixando-nos com("<initial part>","=<remaining line>")
. Fazer uma correspondência de padrões(a,_:b)
garante que a linha não estivesse vazia e, ao mesmo tempo, remova a liderança=
.Agora só precisamos de
show
ambosa
eb
(colocando-o entre aspas e citações escapando), fazer alguma formatação (:
e,
personagens) e, finalmente, coloque-o{}
.fonte
do
: Experimente online!C (gcc) ,
243219 bytesAgradecimentos a ceilingcat pela sugestão.
Decidi usar uma máquina de estado para lidar com os três casos (nova linha, chave, valor) e acabou bem. Além disso, eu tenho que
abusar a queda-through característicaswitch
ea macro operador stringizing!Embora o desafio não o exigisse, também escapei do
\
personagem pela especificação JSON. Se esse caractere nunca estiver na entrada,&&c-92
poderá ser removido por mais 5 bytes.Experimente online!
Submissão original: 243 bytes
O envio original manteve espaçamento desnecessário, como nos exemplos JSON fornecidos.
Experimente online!
fonte
JavaScript,
666362 bytesMostrar snippet de código
-3 bytes graças a @redundancy
-1 byte graças a @ l4m2
fonte
Retina 0.8.2 , 43 bytes
Experimente online!
fonte
Perl 6 , 48 bytes
2 bytes a menos se pudermos assumir exatamente 1 sinal de igual em uma linha não vazia.
Experimente online!
Ungolfed:
A propósito, a
to-json
rotina está obsoleta, como o compilador dirá, mas quem se importa.fonte
Python 2 , 81 bytes
Experimente online!
fonte
Ruby, 59 + 5 = 64
Necessidades
-rjson
(+5)Explicação:
fonte
JavaScript (ES6), 66 bytes
Supõe que há apenas um
=
por linhaSnippet de teste
fonte
"code".length
no console javascript para contar o comprimentoV , 30 bytes
Espera uma entrada de cada vez. O fragmento TIO executa todos os casos de teste fornecidos como uma única entrada.
Eu sou novo nos mapeamentos estendidos de V, portanto, as dicas são sempre bem-vindas!
Experimente online!
Explicação
fonte
C (gcc) , 172 bytes
Experimente online!
Baseado na implementação do @ ErikF, mas sem
switch/case
.Versão ligeiramente não destruída
fonte
R, 118 bytes
Experimente online!
fonte
C (gcc) , 119 bytes
Experimente online!
fonte
PHP, 87 bytes
Executar como tubo com
-nR
ou experimente online .Inserir
\s
antes$/m
para quebras de linha do Windows;\s*
se as quebras de linha são incertas.Inserir
U
depois$/m
se os valores contiverem=
.fonte
Dardo ,
142114108 bytesExperimente online!
fonte