Minecraft Dil Dosyaları Güncelleyici


11

1.13'te, Minecraft dil dosyaları basit bir çok satırlı anahtar = değer formatından JSON'a değiştirildi .

Meydan okuma

Bir JSON dizesi döndüren özgün biçimden dönüştüren bir program yazın. Giriş herhangi bir standart giriş yöntemi kullanılarak alınabilir, çıkış herhangi bir standart çıkış yönteminden json olmalıdır

Orijinal biçim, anahtar = değer çiftlerine sahip satırlar içerir, örneğin

tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player

build.tooHigh=Height limit for building is %s blocks

Key = value ile büyük bir JSON nesnesine dönüştürülmelidir

{
    "tile.dirt.name": "Dirt",
    "advMode.nearestPlayer": "Use \"@p\" to target nearest player",
    "build.tooHigh": "Height limit for building is %s blocks"
}

Bazı detaylar

  • Geçerli anahtar JSON'a yalnızca doğru anahtar / değer çiftlerini içerdiği sürece izin verilir. Sondaki virgüllere izin verilir, çünkü Minecraft onlara izin verir.
  • Kaçması gereken tek şey tırnak. (1.13'ten önce dil dosyasında yeni satırlar, ters eğik çizgiler veya başka json-break şeyler yoktu)
  • Boş satırlar dikkate alınmamalıdır
  • Satırlar tam olarak eşittir

Test Durumları

Giriş:

tile.dirt.name=Dirt
advMode.nearestPlayer=Use "@p" to target nearest player

build.tooHigh=Height limit for building is %s blocks

Çıktı:

{
    "tile.dirt.name": "Dirt",
    "advMode.nearestPlayer": "Use \"@p\" to target nearest player",
    "build.tooHigh": "Height limit for building is %s blocks"
}

Giriş:

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

Çıktı:

{
  "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",
}

Giriş:

stat.mineBlock=%1$s Mined
stat.craftItem=%1$s Crafted
stat.useItem=%1$s Used
stat.breakItem=%1$s Depleted

Çıktı:

{
    "stat.mineBlock": "%1$s Mined",
    "stat.craftItem": "%1$s Crafted",
    "stat.useItem": "%1$s Used",
    "stat.breakItem": "%1$s Depleted"
}

1
Nasıl tile.dirt.nameolur "block.minecraft.dirt"?
Pavel

@Pavel uuh ... hata! Bunu düzelttim. Bu kasıtsızdı
pfg

5
Boş olmayan her satırda tam 1 olması garanti ediliyor =mu?
user202729

@ user202729 evet
pfg

3
Aslında bu soruna bir çözüme ihtiyacınız olduğunu ve dosyalarınızı dönüştürmek için bir tane kullanmayı planladığınızı iddia etmek isterim. :)
mbomb007

Yanıtlar:


4

Python 3, 91 77 bayt

OMᗺ sayesinde -14 bayt

Bir Python sözlüğünün çıktısının JSON'a bu meydan okuma için çok rekabetçi bir dil olmasını sağlayacak kadar yakın olacağını düşündüm. Ancak, python sözlükleri dize temsili python yerleşik JSON kitaplığı kullanarak daha iyi şans vardı JSON yeterince farklı. Bahse girerim bu JavaScript'te daha özlü bir şekilde yapılabilir.

import json
f=lambda x:json.dumps(dict(i.split("=")for i in x.split("\n")if i))

Çevrimiçi deneyin!


Düzenle:

Bash + Sed, 68 63 bayt

OMᗺ ve Night 2 -5 Byte sayesinde hata düzeltme

Python çözümüne yaklaşımım gibi, metni bir nesnede paketlemeden doğrudan JSON'a dönüştürmenin daha bayt verimli olabileceğini fark ettim. Bayt başına, sed bildiğim regex değiştirme için en güçlü dildir.

echo {`echo "$1"|sed 's/"/\\\"/g;s/\(.*\)=\(.*\)/"\1":"\2",/'`}

Çevrimiçi deneyin!

açıklama

echo {`                                  #  prints the leading curly brace
       echo "$1"|sed                     # feeds the input into sed
       's/"/\\"/g;                       # replaces " with \"
       s/\(.*\)=\(.*\)/"\1":"\2",/'      # surrounds the left and right hand sides of the equals with quotes and joins them with a colon
`}                                       # prints the closing curly brace

8
İki farklı dilde yanıt veriyorsanız, bunu iki ayrı yanıt olarak göndermekten çekinmeyin.
mbomb007

Bash + sed yanıtı -riçin, sed (+3 bayt) bayrağı kullanmayı deneyin, böylece yakalama gruplarından (-4 bayt) kaçmak zorunda kalmazsınız tio.run/##LYq7CgIxEEX7/…
user41805

4

Vim, 44 bayt

O{<Esc>:%s/"/\\"/g|%s/\v(.*)\=(.*)/"\1":"\2",
o}

Açıklama:

O{<Esc>                                           Prepend {
       :%s/"/\\"/g                                Escape all "
                  |%s/\v(.*)\=(.*)/"\1":"\2",     Json-ify lines
o}                                                Append }

3

Pas , 150 bayt

|s:String|s.replace('"',"\\\"").split('\n').filter(|l|l.len()>0).map(|l|format!("\"")+&l.replace('=',"\":\"")+"\",").fold(format!("{{"),|r,n|r+&n)+"}"

Çevrimiçi deneyin!

Java'dan daha mı uzun?


2

Retina 0.8.2 , 35 bayt

"
\"
=
": "
G`.
.+
    "$&",
^
{¶
$
¶}

Çevrimiçi deneyin! Ve L$`.+yerine kullanabileceğiniz gibi Retina 1'de 34 bayt olur . Açıklama:G`..+

"
\"

Tırnak kaçış.

=
": "

Anahtar / değer ayırıcıyı sabitleyin. (Değer a içerebilirse , 2 bayt maliyetle =kullanın 1`=.)

G`.

Boş satırları kaldırın.

.+
    "$&",

Her satırı tırnak içine alın. (İç alıntılar daha önce eklenmişti.)

^
{¶
$
¶}

Tüm çıktıyı {}s.


2

Kabuk , 22 bayt

Tel manipülasyonu gerçekten Husk'un gücü değildir, ancak oldukça iyi oldu:

`J"{}"J',mȯJ':msx'=fI¶

Çevrimiçi deneyin!

                      ¶  -- split on newlines
                    fI   -- filter by identity (ie. remove empty strings)
         m(        )     -- with each line
                x'=      -- | split on '='
              ms         -- | show each (ie. enclose in quotes and escape quotes)
           J':           -- | join with ':'
      J',                -- join these with ','
`J"{}"                   -- join the string "{}" with the result

İronik olarak, Minecraft'ta "Kabuk" diye bir şey var!
Redwolf Programları

2

Yakut , 56 bayt

->x{x.split(?\n).map{|i|i.split(?=)}.to_h.to_json}

-rjsonTercüman bayrağı için +6 bayt .

Çevrimiçi deneyin!


1
@Piccolo -rjson bayrağını geçtin mi?
pfg

@pfg Vay canına, topu gerçekten düşürdüm haha. Sadece kullanmayı unutmamıştım -rjson, aynı zamanda hatanın daha önce dahil to_h
Piccolo

2

Perl 5 -nl -M5.010 , 58 54 bayt

BEGIN{say'{'}s'"'\"'g;/=/&&say qq|"$`": "$'",|}{say'}'

Çevrimiçi deneyin!


58 baytlık sürüm:

BEGIN{say'{'}s'"'\"'g;s/(.*)=(.*)/"$1": "$2",/;END{say'}'}

Çevrimiçi deneyin!


Her iki sürüm de her anahtardan sonra virgül ekler: değer çifti, teknik olarak uyumlu olmayan JSON (kapanmadan önceki son virgül }atlanmalıdır ve en katı JSON doğrulayıcılarında başarısız olacaktır). Geçerli (insan okurları için daha çirkin ise) JSON üreten hızlı 58 baytlık bir yeniden yazma: $c||='{';s'"'\"'g;/=/&&say qq|$c"$`":"$'"|;$c=','}{say'}' Biraz daha kısa / daha zarif bir şey bulabileceğinizi umuyorum.
fare kapanı

@mousetrapper Bundan kaçınmanın güzel bir yolu BEGIN. OP açıkça sondaki virgüllere izin verir: "Sondaki virgüllere izin verilir, çünkü Minecraft onlara izin verir.". Farkı söyleyerek yeni bir cevap olarak yayınlamaktan çekinmeyin.
sundar - Monica'yı geri

Ah, evet, iyi bir nokta, orijinal yazıda bu cümleyi kaçırdı. Varsayılan atama yalnızca ilk karakteri değiştirmeye çalışıyorsanız mantıklıdır, aksi takdirde BEGINyalnızca '{' iletmek istediğiniz durumda daha kısadır. END-Kaçma tekniğini seviyorum . Kodunuzun etrafına etkili bir döngü -nyerleştirdiğini biliyordum ; Ne kadar gerçek olduğu hakkında hiçbir fikrim yoktu. while(<>){}
fare kapanı

Bunu ilk öğrendiğimde de çok şaşırdım. Tuhaf bir hack ile TIMTOWDI yapmanın mükemmel bir yolu arasındaki çizgiyi birleştiren Perl özelliklerinden biri. Gerçi unutmuştum, bu yüzden bunun için kredi Perl 5 golf ipuçları iş parçacığında Dennis gider .
sundar - Monica'yı geri

2

Haskell , 75 71 bayt

Laikoni sayesinde -4 bayt (liste-anlama üzerinde do-notasyonu kullanarak)!

=Bir satırda çoklu ile çalışır :

f s='{':do{(a,_:b)<-span(/='=')<$>lines s;show a++':':show b++","}++"}"

Çevrimiçi deneyin!

açıklama

Terim span(/='=')<$>lines s, dizeyi birinciye böler ve =bizi bırakır ("<initial part>","=<remaining line>"). Bir kalıp eşleşmesi yapmak (a,_:b)çizginin boş olmamasını sağlar ve aynı zamanda ön çizgiyi kaldırır =.

Şimdi biz sadece gereken showhem ave b(tırnaklar ve kaçan tırnak çevrelerdi), bazı biçimlendirme (do :ve ,karakter) ve son olarak içine alın {}.


1
71 bayt kullanarak do: Çevrimiçi deneyin!
Laikoni

2

C (gcc) , 242319 bayt

Öneri için ceilingcat'e teşekkürler.

Üç durumu (satırsonu, anahtar, değer) ele almak için bir devlet makinesi kullanmaya karar verdim ve oldukça iyi çıktı. Ayrıca, ab sonbahar özelliği switchve makro dizgi operatörü kullanmak lazım !

Zorluk gerektirmese de, JSON spesifikasyonuna göre\ karakterden de kaçtım . Bu karakter girişte asla olmayacaksa, &&c-925 bayt daha kaldırılabilir.

#define p(s)printf(#s,c)
#define a(i)case i:
c,s;f(){for(p({);(c=getchar())>0;)switch(s){a(0)if(c<11)break;s++,p(\42);a(1)c==61?s++,p(":"):p(%c);break;a(2)c-34&&c-92?c==10?p(\42\54),s=0:p(%c):p(\\%c);}s-2||p(\42);p(});}

Çevrimiçi deneyin!


Orijinal gönderme: 243 bayt

Orijinal başvuru, sağlanan JSON örneklerinde olduğu gibi gereksiz boşluk bırakmıştır.

#define p(s)printf(s,c)
#define a(i)case i:
c,s;f(){for(p("{\n");(c=getchar())>0;)switch(s){a(0)if(c<11)break;s++,p("  \"");a(1)c==61?s++,p("\": \""):p("%c");break;a(2)c-34&&c-39?c==10?p("\",\n"),s=0:p("%c"):p("\\%c");}s==2&&p("\"\n");p("}");}

Çevrimiçi deneyin!


2

JavaScript, 66 63 62 bayt

s=>JSON.stringify(o=/(.+)=(.+)/g,s.replace(o,(_,a,b)=>o[a]=b))

@Redundancy sayesinde -3 bayt

@ L4m2 sayesinde -1 bayt




@ l4m2 RegExp nesneleri dize mi? Bugün yeni bir şey öğrendim 🤯
darrylyeo


1

Perl 6 , 48 bayt

{to-json %(.lines.grep(?*)>>.split("=",2).flat)}

Boş olmayan bir satırda tam olarak 1 eşittir işareti varsayabilirsek 2 bayt daha az.

Çevrimiçi deneyin!

Ungolfed:

{                   # An anonymous block, taking 1 string which ends in $_.
    to-json         # Convert a Perl 6 number, string, list or hash to JSON and return it.
    %(              # Force to hash (dictionary)
        .lines      # Break $_ (implicitly assumed) into a list of lines.
        .grep(?*)   # Pick only those that are True (non-empty).
        >>.         # For each element in the list, call the following method ... 
        split("=",2) # ... split the string at =, making at most 2 chunks.
        .flat       # That gives a list of 2-element lists. Flatten it.
    )               # List is converted into the hash like this: { first element => second element, third => fourth, ... }
}                   # Implicitly return

Bu arada, to-jsonderleyici size söyleyeceği gibi rutin reddedilir, ancak kimin umurunda.



1

Yakut, 59 + 5 = 64

İhtiyaçlar -rjson(+5)

->c{Hash[*c.split(?\n).map{|l|l.split ?=}.flatten].to_json}

Açıklama:

->c{                                                      } # anonymous function with param c
    Hash[*                                       ]          # converts ["a", "b", "c", "d"] into {"a": "b", "c": "d"}
          c.split(?\n)                                      # splits c into lines
                      .map{|l|          }                   # map lines so each element represents
                              l.split ?=                    # an array of itself but split by =
                                         .flatten           # merges 2d array to 1d (also gets rid of empty elements for newlines
                                                  .to_json  # converts hash to json

1

JavaScript (ES6), 66 bayt

s=>`{${s.replace(/"/g,'\\"').replace(/(.*)=(.*)/g,'"$1":"$2",')}}`

=Her satırda yalnızca bir tane olduğunu varsayar

Snippet'i test etme

f=s=>`{${s.replace(/"/g,'\\"').replace(/(.*)=(.*)/g,'"$1":"$2",')}}`
<textarea id="i" onkeyup="o.innerText=f(i.value)"></textarea><pre id="o">


66 bayt olmalıdır. Uzunluk hesaplanırken \\ \ olarak ayrıştırılmış olabilir.
fazlalık

1
@redundancy Gerçekten "code".lengthjavascript konsolunda uzunluğu saymak için kullanmayı bırakmalıyım
Herman L

1

V , 30 bayt

O{␛Í"/\\"
ggòeÉ"vyf=Plp$pa,òo}

Her seferinde bir girdi bekliyor. TIO snippet'i, verilen tüm test senaryolarını tek bir girdi olarak çalıştırır.

V'nin genişletilmiş eşlemelerinde yeniyim, bu nedenle ipuçları her zaman bekleriz!

Çevrimiçi deneyin!

açıklama

O{␛                  # insert { on a new line above
   Í                 # global substitution across all lines
    "/\\"            #   " => \"
gg                   # go to first line
  ò                  # recursively...
   e                 #   forward to end of word; if at end of line, applies to next word below
    É"               #   prepend " to first non-whitespace char
      vy             #   copy current character (i.e. ")
        f=Plp        #   paste " before and after the next =
             $pa,    #   paste " at end of line and append ,
                 ò   # ...end
                  o} # insert } on a new line below

1

C (gcc) , 172 bayt

#define p(s)printf(#s,c)
c,s;f(){for(p({);~(c=getchar());)s-2?c>10|s&&(s||(s+=p(\42)),c==61?s++,p(":"):p(%c)):c-34&&c-92?c==10?s=!p(\42\54):p(%c):p(\\%c);s-2||p(\42);p(});}

Çevrimiçi deneyin!

@ ErikF'in uygulanmasına dayanarak ama olmadan switch/case.

Hafifçe çözülmemiş versiyon

#define p(s)printf(#s,c)
c,s;
f(){
 for(p({);~(c=getchar());)
  s-2?
   c>10|s&&(
    s||
     (s+=p(\42)),
    c==61?
     s++,
     p(":")
    :
     p(%c)
   )
  :
   c-34&&c-92?
    c==10?
     s=!p(\42\54)
    :
     p(%c)
   :
    p(\\%c);
 s-2||p(\42);
 p(});
}



1

PHP, 87 bayt

preg_match_all("/^(.*)=(.*)$/m",$argn,$m);echo json_encode(array_combine($m[1],$m[2]));

Pipo ile çalıştırın -nRveya çevrimiçi deneyin .

Windows satır aralıkları için \sönce ekleyin $/m; \s*çizgi çizgileri belirsizse.
Yerleştirin Usonra $/mdeğerler içeriyorsa =.


1

Dart , 142 114 108 bayt

f(s)=>"""{${s.replaceAll('"','\\"').replaceAllMapped(RegExp(r'(.*)=(.*)'),(m)=>'"${m[1]}":"${m[2]}",')}}""";

Çevrimiçi deneyin!

  • Json.encode işlevinden kurtularak ve normal dize oluşturma kullanarak -28 bayt
  • 'Yeni' anahtar kelimeyi ve birkaç alanı kaldırarak -6 bayt
  • Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
    Licensed under cc by-sa 3.0 with attribution required.