W 1.13 pliki językowe Minecraft zostały zmienione z prostego formatu wieloliniowego klucz = wartość na JSON .
Wyzwanie
Napisz program konwertujący z formatu oryginalnego zwracający ciąg JSON. Dane wejściowe można pobierać przy użyciu dowolnej standardowej metody wprowadzania, dane wyjściowe muszą być typu json z dowolnej standardowej metody wprowadzania
Oryginalny format zawiera na przykład wiersze z parami klucz = wartość
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Należy przekonwertować na jeden duży obiekt JSON z kluczem = wartość
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Trochę szczegółów
- Dowolny prawidłowy JSON jest dozwolony, o ile zawiera tylko prawidłowe pary klucz / wartość. Końcowe przecinki są dozwolone, ponieważ pozwala na to Minecraft.
- Jedynymi rzeczami, które należy uciec, są cytaty. (W wersji językowej wcześniejszej niż 1.13 nie było żadnych nowych linii, odwrotnych ukośników ani innych rzeczy przełamujących json)
- Puste linie należy zignorować
- Linie zawierają dokładnie jeden równy
Przypadki testowe
Wejście:
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Wynik:
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Wejście:
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
Wynik:
{
"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",
}
Wejście:
stat.mineBlock=%1$s Mined
stat.craftItem=%1$s Crafted
stat.useItem=%1$s Used
stat.breakItem=%1$s Depleted
Wynik:
{
"stat.mineBlock": "%1$s Mined",
"stat.craftItem": "%1$s Crafted",
"stat.useItem": "%1$s Used",
"stat.breakItem": "%1$s Depleted"
}
tile.dirt.name
się stało"block.minecraft.dirt"
?=
?Odpowiedzi:
Python 3,
9177 bajtów-14 Bajtów dzięki OMᗺ
Pomyślałem, że wydruk słownika Python byłby wystarczająco blisko JSON, aby uczynić go bardzo konkurencyjnym językiem dla tego wyzwania. Jednak reprezentacja łańcuchowa słowników Pythona jest na tyle różna od JSON, że lepiej mi było przy użyciu wbudowanej biblioteki JSON Pythona. Założę się, że można to zrobić bardziej zwięźle w JavaScript.
Wypróbuj online!
Edytować:
Bash + Sed,
6863 bajtówNaprawiono błędy dzięki OMᗺ i Night 2
-5 Bytes dzięki OMᗺ
Uświadomiłem sobie, że bardziej efektywna bajtowo może być bezpośrednia konwersja tekstu do JSON bez wiązania go w obiekt, podobnie jak moje podejście do rozwiązania python. Sedno jest najsilniejszym językiem do zastępowania wyrażeń regularnych, jaki znam.
Wypróbuj online!
Wyjaśnienie
źródło
-r
flagi dla sed (+3 bajty), aby nie trzeba było uciekać przed grupami przechwytywania (-4 bajty) tio.run/##LYq7CgIxEEX7/…Vim, 44 bajty
Wyjaśnienie:
źródło
Rdza , 150 bajtów
Wypróbuj online!
Czy jest dłuższy niż Java?
źródło
Retina 0.8.2 , 35 bajtów
Wypróbuj online! W Retinie 1 byłoby 34 bajtów, których można użyć
L$`.+
zamiastG`.
i.+
. Wyjaśnienie:Unikaj cytatów.
Napraw separator klucz / wartość. (Jeśli wartość może zawierać a
=
, użyj1`=
kosztu 2 bajtów.)Usuń puste linie.
Zawiń każdą linię w cudzysłów. (Wewnętrzne cytaty zostały dodane wcześniej).
Zawiń całe wyjście w
{}
s.źródło
Łuska , 22 bajty
Manipulowanie strunami nie jest tak naprawdę siłą Husky, ale całkiem nieźle:
Wypróbuj online!
źródło
Rubinowy , 56 bajtów
+6 bajtów dla
-rjson
flagi interpretera.Wypróbuj online!
źródło
-rjson
, ale również założyłem, że nie sprawdziłem, czy błąd był taki sam, jak wcześniej, z udziałemto_h
Perl 5
-nl -M5.010
,5854 bajtówWypróbuj online!
Wersja 58-bajtowa:
Wypróbuj online!
źródło
}
powinien zostać pominięty i zawiedzie najbardziej rygorystyczne walidatory JSON). Oto szybkie, 58-bajtowe przepisywanie, które daje poprawne (jeśli brzydsze dla ludzkich czytelników) JSON:$c||='{';s'"'\"'g;/=/&&say qq|$c"$`":"$'"|;$c=','}{say'}'
Oczekuję, że znajdziesz coś nieco krótszego / bardziej eleganckiego.BEGIN
. OP wyraźnie dopuszcza przecinki końcowe: „Przecinki końcowe są dozwolone, ponieważ pozwala na to Minecraft.”. Opublikuj to jako nową odpowiedź, podając różnicę.BEGIN
nadal będziesz krótszy w przypadku, gdy chcesz po prostu emitować „{”. Lubię twojąEND
technikę unikania. Wiedziałem, że-n
umieszcza skutecznąwhile(<>){}
pętlę wokół twojego kodu; Nie miałem pojęcia, jak to było dosłowne.Haskell ,
7571 bajtów-4 bajty dzięki Laikoni (używając notacji zamiast listowej interpretacji )!
Działa z wieloma
=
w jednej linii:Wypróbuj online!
Wyjaśnienie
Termin
span(/='=')<$>lines s
dzieli ciąg na pierwszy=
, pozostawiając nam("<initial part>","=<remaining line>")
. Wykonanie dopasowania wzorca(a,_:b)
zapewnia, że linia nie była pusta, a jednocześnie usuwa wiodące=
.Teraz musimy tylko
show
jednoa
i drugieb
(umieszczając je w cudzysłowach:
i,
znaki ucieczkowe), dokonujemy formatowania ( i znaków) i na końcu je zamykamy{}
.źródło
do
: Wypróbuj online!C (gcc) ,
243219 bajtówDzięki pułapkowi cat za sugestię.
Zdecydowałem się użyć maszyny stanów do obsługi trzech przypadków (nowa linia, klucz, wartość) i okazało się, że całkiem nieźle. Ponadto, mam do
abużyć Fall-poprzez cechyswitch
i makro operatora stringizing!Chociaż wyzwanie nie wymagało tego, uciekłem również
\
postaci zgodnie ze specyfikacją JSON. Jeśli ten znak nigdy nie będzie na wejściu,&&c-92
można go usunąć na 5 kolejnych bajtów.Wypróbuj online!
Oryginalne przesłanie: 243 bajty
Oryginalne zgłoszenie zachowało niepotrzebne odstępy, jak w dostarczonych przykładach JSON.
Wypróbuj online!
źródło
JavaScript,
666362 bajtyPokaż fragment kodu
-3 bajty dzięki @redundancy
-1 bajt dzięki @ l4m2
źródło
Retina 0.8.2 , 43 bajty
Wypróbuj online!
źródło
Perl 6 , 48 bajtów
2 bajty mniej, jeśli możemy założyć dokładnie 1 znak równości w niepustej linii.
Wypróbuj online!
Nie golfowany:
Nawiasem mówiąc,
to-json
procedura jest przestarzała, jak powie kompilator, ale kogo to obchodzi.źródło
Python 2 , 81 bajtów
Wypróbuj online!
źródło
Rubin, 59 + 5 = 64
Potrzebuje
-rjson
(+5)Wyjaśnienie:
źródło
JavaScript (ES6), 66 bajtów
Zakłada się, że jest tylko jeden
=
wierszTestowanie fragmentu kodu
źródło
"code".length
w konsoli javascript, aby policzyć długośćV , 30 bajtów
Oczekuje jednego wejścia na raz. Fragment kodu TIO uruchamia wszystkie podane przypadki testowe jako jedno wejście.
Jestem nowy w rozszerzonych mapowaniach V, więc wskazówki są zawsze mile widziane!
Wypróbuj online!
Wyjaśnienie
źródło
C (gcc) , 172 bajty
Wypróbuj online!
Na podstawie implementacji @ ErikF, ale bez
switch/case
.Wersja lekko nie golfowa
źródło
R, 118 bajtów
Wypróbuj online!
źródło
C (gcc) , 119 bajtów
Wypróbuj online!
źródło
PHP, 87 bajtów
Uruchom jako potok z
-nR
lub spróbuj online .Wstaw
\s
przed$/m
podziały wiersza systemu Windows;\s*
jeśli łamanie linii jest niepewne.Wstaw
U
po,$/m
jeśli wartości zawierają=
.źródło
Dart ,
142114108 bajtówWypróbuj online!
źródło