Di 1.13, file bahasa Minecraft diubah dari format kunci multi-line = nilai sederhana ke JSON .
Tantangan
Tulis program yang mengkonversi dari format asli mengembalikan string JSON. Input dapat diambil dengan menggunakan metode input standar, output harus json dari metode output standar
Format asli berisi baris dengan pasangan kunci = nilai, misalnya
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Harus dikonversi ke satu objek JSON besar dengan kunci = nilai
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Beberapa detail
- Setiap JSON yang valid diizinkan selama hanya berisi pasangan kunci / nilai yang benar. Tanda koma diizinkan karena Minecraft mengizinkannya.
- Satu-satunya hal yang harus diloloskan adalah kutipan. (Tidak ada baris baru, garis miring terbalik, atau hal-hal yang melanggar json lainnya ada dalam file bahasa sebelum 1,13)
- Baris kosong harus diabaikan
- Baris mengandung persis satu sama dengan
Uji Kasus
Memasukkan:
tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player
build.tooHigh=Height limit for building is %s blocks
Keluaran:
{
"tile.dirt.name": "Dirt",
"advMode.nearestPlayer": "Use \"@p\" to target nearest player",
"build.tooHigh": "Height limit for building is %s blocks"
}
Memasukkan:
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
Keluaran:
{
"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",
}
Memasukkan:
stat.mineBlock=%1$s Mined
stat.craftItem=%1$s Crafted
stat.useItem=%1$s Used
stat.breakItem=%1$s Depleted
Keluaran:
{
"stat.mineBlock": "%1$s Mined",
"stat.craftItem": "%1$s Crafted",
"stat.useItem": "%1$s Used",
"stat.breakItem": "%1$s Depleted"
}
tile.dirt.name
jadinya"block.minecraft.dirt"
?=
?Jawaban:
Python 3,
9177 byte-14 Bytes berkat OM to
Saya berpikir bahwa cetakan kamus Python akan cukup dekat dengan JSON untuk menjadikannya bahasa yang sangat kompetitif untuk tantangan ini. Namun, representasi string dari kamus python cukup berbeda dari JSON sehingga saya lebih beruntung menggunakan python built-in library JSON. Saya yakin ini bisa dilakukan dengan lebih ringkas di JavaScript.
Cobalah secara Online!
Edit:
Bash + Sed,
6863 bytePerbaikan bug berkat OMᗺ dan Night 2
-5 Bytes berkat OMᗺ
Saya menyadari bahwa itu mungkin lebih efisien byte untuk secara langsung mengkonversi teks ke JSON tanpa bundling dalam suatu objek, seperti pendekatan saya untuk solusi python. Per byte, sed adalah bahasa yang paling kuat untuk penggantian regex yang saya tahu.
Cobalah secara Online!
Penjelasan
sumber
-r
bendera untuk sed (+3 byte) sehingga Anda tidak perlu melarikan diri dari grup penangkap (-4 byte) tio.run/##LYq7CgIxEEX7/…Vim, 44 byte
Penjelasan:
sumber
Karat , 150 byte
Cobalah online!
Apakah lebih panjang dari Jawa?
sumber
Retina 0.8.2 , 35 byte
Cobalah online! Akan menjadi 34 byte di Retina 1 karena Anda dapat menggunakan,
L$`.+
bukanG`.
dan.+
. Penjelasan:Lepaskan kutipan.
Perbaiki pemisah kunci / nilai. (Jika nilainya mungkin mengandung a
=
, gunakan1`=
dengan biaya 2 byte.)Hapus garis kosong.
Bungkus setiap baris dengan tanda kutip. (Kutipan dalam ditambahkan sebelumnya.)
Bungkus seluruh output dalam
{}
s.sumber
Sekam , 22 byte
Manipulasi string sebenarnya bukan kekuatan Husk, tetapi cukup baik:
Cobalah online!
sumber
Ruby , 56 byte
+6 byte untuk
-rjson
bendera juru bahasa.Cobalah online!
sumber
-rjson
, tetapi juga berasumsi tanpa benar-benar memeriksa bahwa kesalahan itu sama dengan yang saya dapatkan sebelumnya melibatkanto_h
Perl 5
-nl -M5.010
,5854 byteCobalah online!
Versi 58 byte:
Cobalah online!
sumber
}
harus dihilangkan dan akan gagal sebagian besar validator JSON ketat). Berikut ini adalah penulisan ulang 58 byte cepat yang menghasilkan JSON yang valid (jika lebih buruk untuk pembaca manusia):$c||='{';s'"'\"'g;/=/&&say qq|$c"$`":"$'"|;$c=','}{say'}'
Saya berharap Anda dapat menemukan sesuatu yang sedikit lebih pendek / lebih elegan.BEGIN
. OP secara eksplisit memungkinkan koma koma: "Trailing koma diizinkan karena Minecraft mengizinkannya." Jangan ragu untuk memposting itu sebagai jawaban baru, menyebutkan perbedaannya.BEGIN
masih lebih pendek dalam kasus di mana Anda hanya ingin memancarkan '{'. Saya sukaEND
teknik -menghindari Anda . Saya tahu bahwa-n
menempatkan loop efektif diwhile(<>){}
sekitar kode Anda; Saya tidak tahu seberapa literal itu.Haskell ,
7571 byte-4 bytes terima kasih kepada Laikoni (menggunakan notasi atas daftar-pemahaman)!
Bekerja dengan banyak
=
pada satu baris:Cobalah online!
Penjelasan
Istilah
span(/='=')<$>lines s
membagi string pada yang pertama=
, meninggalkan kita("<initial part>","=<remaining line>")
. Melakukan pencocokan pola(a,_:b)
memastikan bahwa garis tidak kosong dan pada saat yang sama menghilangkan garis depan=
.Sekarang kita hanya perlu
show
keduanyaa
danb
(melampirkannya dalam tanda kutip dan lolos tanda kutip), lakukan beberapa pemformatan (:
dan,
karakter) dan akhirnya menyertakannya{}
.sumber
do
: Coba online!C (gcc) ,
243219 byteTerima kasih kepada ceilingcat untuk sarannya.
Saya memutuskan untuk menggunakan mesin negara untuk menangani tiga kasus (baris baru, kunci, nilai) dan ternyata cukup baik. Juga, saya harus
abmenggunakan jatuh-melalui fiturswitch
dan operator stringizing makro!Meskipun tantangan tidak memerlukannya, saya juga lolos dari
\
karakter sesuai spesifikasi JSON. Jika karakter itu tidak akan pernah ada di input, maka&&c-92
dapat dihapus selama 5 byte lebih.Cobalah online!
Pengiriman asli: 243 byte
Pengajuan asli menjaga jarak yang tidak dibutuhkan seperti pada contoh JSON yang disediakan.
Cobalah online!
sumber
JavaScript,
666362 byteTampilkan cuplikan kode
-3 byte terima kasih kepada @redundancy
-1 byte terima kasih kepada @ l4m2
sumber
Retina 0.8.2 , 43 byte
Cobalah online!
sumber
Perl 6 , 48 byte
2 byte lebih sedikit jika kita dapat menganggap tepat 1 sama dengan tanda pada baris yang tidak kosong.
Cobalah online!
Tidak Disatukan:
Ngomong-ngomong,
to-json
rutinitasnya sudah usang, seperti yang dikatakan kompiler kepada Anda, tetapi siapa yang peduli.sumber
Python 2 , 81 byte
Cobalah online!
sumber
Ruby, 59 + 5 = 64
Kebutuhan
-rjson
(+5)Penjelasan:
sumber
JavaScript (ES6), 66 byte
Asumsikan hanya ada satu
=
per barisCuplikan pengujian
sumber
"code".length
di javascript console untuk menghitung panjangnyaV , 30 byte
Mengharapkan satu input pada suatu waktu. Cuplikan TIO menjalankan semua test case yang diberikan sebagai input tunggal.
Saya baru mengenal pemetaan V yang luas, jadi selalu ada kiat!
Cobalah online!
Penjelasan
sumber
C (gcc) , 172 byte
Cobalah online!
Berdasarkan implementasi @ ErikF tetapi tanpa
switch/case
.Versi sedikit ungolfed
sumber
R, 118 byte
Cobalah online!
sumber
C (gcc) , 119 byte
Cobalah online!
sumber
PHP, 87 byte
Jalankan sebagai pipa dengan
-nR
atau coba online .Masukkan
\s
sebelum$/m
untuk linebreak Windows;\s*
jika linebreak tidak pasti.Sisipkan
U
setelah$/m
jika nilai mengandung=
.sumber
Dart ,
142114108 byteCobalah online!
sumber