В 1.13 языковые файлы Minecraft были переведены из простого многострочного формата ключ = значение в JSON .
Вызов
Напишите программу, конвертирующую из исходного формата, возвращающую строку JSON. Ввод может быть выполнен с использованием любого стандартного метода ввода, вывод должен быть json из любого стандартного метода вывода
Исходный формат содержит строки с парами ключ = значение, например
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Должен быть преобразован в один большой объект JSON с ключом = значением
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Некоторые детали
- Разрешен любой допустимый JSON, если он содержит только правильные пары ключ / значение. Конечные запятые разрешены, потому что Minecraft позволяет им.
- Единственное, что нужно избежать, это кавычки. (До версии 1.13 в языковом файле не было ни новой строки, ни обратной косой черты, ни других вещей, разрушающих json)
- Пустые строки следует игнорировать
- Строки содержат ровно одно равное
Тестовые случаи
Входные данные:
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Выход:
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Входные данные:
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
Выход:
{
"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",
}
Входные данные:
stat.mineBlock=%1$s Mined
stat.craftItem=%1$s Crafted
stat.useItem=%1$s Used
stat.breakItem=%1$s Depleted
Выход:
{
"stat.mineBlock": "%1$s Mined",
"stat.craftItem": "%1$s Crafted",
"stat.useItem": "%1$s Used",
"stat.breakItem": "%1$s Depleted"
}
tile.dirt.name
стать"block.minecraft.dirt"
?=
?Ответы:
Python 3,
9177 байт-14 байт благодаря OMᗺ
Я думал, что распечатка словаря Python будет достаточно близка к JSON, чтобы сделать его очень конкурентоспособным языком для этой задачи. Однако строковое представление словарей Python достаточно отличается от JSON, так что мне повезло больше, если использовать встроенную библиотеку JSON Python. Держу пари, что это можно сделать более кратко в JavaScript.
Попробуйте онлайн!
Редактировать:
Баш + Сед,
6863 байтаИсправление ошибки благодаря OMᗺ и Night 2
-5 байт благодаря OMᗺ
Я понял, что может быть более эффективно использовать байты для непосредственного преобразования текста в JSON без объединения его в объект, как это было в моем подходе к решению на python. По сути, sed - это самый мощный язык для замены регулярных выражений, который я знаю.
Попробуйте онлайн!
объяснение
источник
-r
флаг для sed (+3 байта), чтобы вам не нужно было избегать групп захвата (-4 байта) tio.run/##LYq7CgIxEEX7/…Vim, 44 байта
Объяснение:
источник
Ржавчина , 150 байт
Попробуйте онлайн!
Это дольше, чем Java?
источник
Сетчатка 0.8.2 , 35 байт
Попробуйте онлайн! Было бы 34 байта в Retina 1, как вы можете использовать
L$`.+
вместоG`.
и.+
. Объяснение:Избежать кавычек.
Исправьте разделитель ключ / значение. (Если значение может содержать a
=
, используйте1`=
по стоимости 2 байта.)Удалить пустые строки.
Оберните каждую строку в кавычки. (Внутренние цитаты были добавлены ранее.)
Оберните весь вывод в
{}
с.источник
Шелуха , 22 байта
Манипулирование строками на самом деле не является сильной стороной Хаска, но оно довольно хорошо:
Попробуйте онлайн!
источник
Рубин , 56 байт
+6 байт для
-rjson
флага интерпретатора.Попробуйте онлайн!
источник
-rjson
, но и предположил, фактически не проверяя, была ли ошибка той же самой, которую я получил раньше, с участиемto_h
Perl 5
-nl -M5.010
,5854 байтаПопробуйте онлайн!
58-байтовая версия:
Попробуйте онлайн!
источник
}
должна быть опущена, и в ней не пройдут самые строгие валидаторы JSON). Вот быстрое 58-байтовое переписывание, которое дает действительный (хотя и уродливее для читателей) JSON:$c||='{';s'"'\"'g;/=/&&say qq|$c"$`":"$'"|;$c=','}{say'}'
Я ожидаю, что вы можете найти что-то более короткое / более элегантное.BEGIN
. OP явно разрешает конечные запятые, хотя: «Конечные запятые разрешены, потому что Minecraft позволяет им». Не стесняйтесь размещать это как новый ответ, упоминая разницу.BEGIN
будет еще короче в случае, когда вы просто хотите испустить '{'. Мне нравится вашаEND
техника избегания. Я знал, что-n
это делает эффективныйwhile(<>){}
цикл вокруг вашего кода; Я понятия не имел, насколько буквальным это было.Haskell ,
7571 байт-4 байта благодаря Лайкони (используя do-нотацию над списком-пониманием)!
Работает с несколькими
=
на одной строке:Попробуйте онлайн!
объяснение
Термин
span(/='=')<$>lines s
разбивает строку на первый=
, оставляя нас с("<initial part>","=<remaining line>")
. Выполнение сопоставления с шаблоном(a,_:b)
гарантирует, что строка не будет пустой, и в то же время удаляет начальную строку=
.Теперь нам нужно только
show
обаa
иb
(заключить его в кавычки и экранировать кавычки), выполнить некоторое форматирование (:
и,
символы) и, наконец, заключить его в{}
.источник
do
: попробуйте онлайн!C (gcc) ,
243219 байтБлагодарю потолочный кот за предложение.
Я решил использовать конечный автомат для обработки трех случаев (новая строка, ключ, значение), и это оказалось довольно хорошо. Кроме того , я должен
абамиспользовать завал через особенностьswitch
и макро - оператор stringizing!Хотя вызов не требовал этого, я также избежал
\
персонажа согласно спецификации JSON. Если этот символ никогда не будет на входе, то&&c-92
можно удалить еще 5 байтов.Попробуйте онлайн!
Исходное представление: 243 байта
Исходное представление оставляло ненужный интервал, как в предоставленных примерах JSON.
Попробуйте онлайн!
источник
JavaScript,
666362 байтаПоказать фрагмент кода
-3 байта благодаря @redundancy
-1 байт благодаря @ l4m2
источник
Сетчатка 0.8.2 , 43 байта
Попробуйте онлайн!
источник
Perl 6 , 48 байт
На 2 байта меньше, если мы можем принять ровно 1 знак равенства на непустой строке.
Попробуйте онлайн!
Ungolfed:
Кстати,
to-json
рутина устарела, как вам скажет компилятор, но кого это волнует.источник
Python 2 , 81 байт
Попробуйте онлайн!
источник
Рубин, 59 + 5 = 64
Необходимо
-rjson
(+5)Объяснение:
источник
JavaScript (ES6), 66 байт
Предполагается, что есть только один
=
на линиюТестовый фрагмент
источник
"code".length
в консоли javascript для подсчета длиныV , 30 байтов
Ожидается один вход за раз. Фрагмент TIO запускает все заданные тестовые случаи как один вход.
Я новичок в расширенном отображении V, поэтому советы всегда приветствуются!
Попробуйте онлайн!
объяснение
источник
C (gcc) , 172 байта
Попробуйте онлайн!
На основе реализации @ ErikF, но без
switch/case
.Слегка негольфированная версия
источник
R, 118 байт
Попробуйте онлайн!
источник
C (gcc) , 119 байт
Попробуйте онлайн!
источник
PHP, 87 байт
Запустите как трубу с
-nR
или попробуйте онлайн .Вставить
\s
перед$/m
Windows для разрывов строк;\s*
если разрывы строк не определены.Вставьте
U
после,$/m
если значения содержат=
.источник
Дротик ,
142114108 байтПопробуйте онлайн!
источник