Minecraft言語ファイルアップデーター


11

1.13では、Minecraft言語ファイルは単純な複数行のkey = value形式からJSONに切り替えられました。

チャレンジ

JSON文字列を返す元の形式から変換するプログラムを作成します。入力は任意の標準入力メソッドを使用して取得できます。出力は標準出力メソッドのjsonである必要があります

元の形式には、キー=値のペアを持つ行が含まれます。たとえば

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

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

key = valueで1つの大きな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を破壊するものはありませんでした)
  • 空行は無視する必要があります
  • 行には、1つのイコール

テストケース

入力:

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

1
どうtile.dirt.nameなるの"block.minecraft.dirt"
パベル

@Pavelうーん... それを修正しました。それは意図的では
なかった-pfg

5
空でない各行に正確に1が含まれていることが保証されてい=ますか?
user202729

@ user202729はい
pfg

3
この問題の解決策が実際に必要であり、それを使用してファイルを変換するつもりであることは間違いありません。:)
mbomb007

回答:


4

Python 3、91 77バイト

OMᗺのおかげで-14バイト

Python辞書の印刷はJSONに十分に近いと思い、この課題に対して非常に競争力のある言語になると思いました。ただし、Python辞書の文字列表現はJSONとはかなり異なるため、Pythonの組み込みJSONライブラリを使用したほうが幸運でした。これはJavaScriptでもっと簡潔にできると思います。

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

オンラインでお試しください!


編集:

Bash + Sed、68 63バイト

OMᗺによるバグ修正とOMᗺによるNight 2
-5バイト

Pythonソリューションのアプローチと同様に、テキストをオブジェクトにバンドルせずに直接JSONに変換する方が、バイト効率が高い場合があることに気付きました。バイトごとに、sedは私が知っている正規表現の置換のための最も強力な言語です。

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

オンラインでお試しください!

説明

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
2つの異なる言語で回答する場合は、2つの個別の回答として自由に投稿してください。
mbomb007

答えをsedのbashの+の場合は、使用してみてください-r(-4バイト)を使用すると、キャプチャグループをエスケープする必要はありませんので、sedの(3バイト)のフラグをtio.run/##LYq7CgIxEEX7/...
user41805

4

Vim、44バイト

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

説明:

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


2

Retina 0.8.2、35バイト

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

オンラインでお試しください!およびのL$`.+代わりに使用できるため、Retina 1では34バイトにG`.なり.+ます。説明:

"
\"

引用符をエスケープします。

=
": "

キー/値の区切りを修正します。(値にが含まれる場合は、2バイトのコストで=使用1`=してください。)

G`.

空行を削除します。

.+
    "$&",

各行を引用符で囲みます。(内側の引用符は以前に追加されました。)

^
{¶
$
¶}

出力全体を{}sでラップします。


2

、22バイト

文字列操作は実際にはハスクの強さではありませんが、非常にうまくいきました。

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

オンラインでお試しください!

                      ¶  -- 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

皮肉なことに、Minecraftには「Husk」と呼ばれるものがあります。
プログラム

2

ルビー、56バイト

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

-rjsonインタープリターフラグ用に+6バイト。

オンラインでお試しください!


1
@Piccoloは-rjsonフラグを渡しましたか?
pfg

@pfgうわー、私は本当にその母にボールを落としました。私は使用することを忘れていただけで-rjsonなく、エラーが以前に取得したものと同じであることを実際にチェックせずに想定していましたto_h
Piccolo

2

Perl 5の -nl -M5.01058の 54バイト

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

オンラインでお試しください!


58バイトバージョン:

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

オンラインでお試しください!


どちらのバージョンも、すべてのkey:valueペアの後にコンマを追加します。これは技術的にはJSONに準拠していません(終了前の最後のコンマ}は省略されるべきで、最も厳密なJSONバリデーターに失敗します)。ここに、有効な(人間の読者にとってJSONい場合)JSONを生成する58バイトの簡単な書き換えがあり $c||='{';s'"'\"'g;/=/&&say qq|$c"$`":"$'"|;$c=','}{say'}' ます。少し短い/よりエレガントなものが見つかると思います。
ネズミ

@mousetrapperこれはを回避する良い方法ですBEGIN。OPは明示的に末尾のコンマを許可します:「Minecraftが許可するため、末尾のコンマは許可されます。」それを新しい答えとして投稿して、違いを言及してください。
スンダ

ああ、良い点は、元の投稿でその文を逃しました。デフォルトの割り当ては、最初の文字を変更しようとしている場合にのみ意味があります。それ以外BEGINの場合は、 '{'を出力するだけの場合はさらに短くなります。私はあなたのEND回避テクニックが好きです。コードの周りに効果的なループを-n配置する ことは知っていました。私はそれが文字通りどれだけであるか全く知りませんでした。 while(<>){}
ネズミ

私が最初にそれを見つけたとき、私もかなり驚きました。これは、奇妙なハックとTIMTOWDIを実行する素晴らしい方法との間の境界線にまたがるPerlの機能の1つです。私はそれを忘れていたので、このインスタンスでの功績は、Perl 5ゴルフのヒントスレッドでデニスに送られます
スンダ

2

Haskell75 71バイト

Laikoniのおかげで-4バイト(リスト内包表記よりも表記法を使用)!

=1行で複数で動作します:

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

オンラインでお試しください!

説明

用語は、span(/='=')<$>lines s最初に文字列を分割=して、私たちを残し、("<initial part>","=<remaining line>")。パターン一致を実行(a,_:b)すると、行が空ではなく、同時に先頭の行が削除され=ます。

ここで必要なのshowab(引用符で囲むと引用符をエスケープする)、フォーマット(:および,文字)を行い、最後にで囲むだけです{}



2

C(gcc)243 219バイト

提案してくれたceilingcatに感謝します。

ステートマシンを使用して3つのケース(改行、キー、値)を処理することにしましたが、かなりうまくいきました。また、私はに着いABの機能による落下使用しswitchて、マクロ文字列化演算子を!

チャレンジでは必要ではありませんでしたが、JSON仕様に従って\文字をエスケープしましたその文字が入力に含まれない場合は、&&c-92さらに5バイト削除することができます。

#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(});}

オンラインでお試しください!


元の投稿:243バイト

元の送信では、提供されたJSONの例のように不要な間隔が維持されていました。

#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("}");}

オンラインでお試しください!


2

JavaScript、66 63 62バイト

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

@redundancyにより-3バイト

@ l4m2のおかげで-1バイト




@ l4m2文字列化されたRegExpオブジェクト?学んだ何か新しい今日🤯
darrylyeo


1

Perl 6、48バイト

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

空でない行に等号が1つだけあると想定できる場合、2バイト少なくなります。

オンラインでお試しください!

ゴルフをしていない:

{                   # 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

ちなみに、このto-jsonルーチンは非推奨です。コンパイラーから通知されますが、気にする人はいます。



1

ルビー、59 + 5 = 64

ニーズ-rjson(+5)

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

説明:

->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バイト

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

=行ごとに1 つだけがあると仮定します

スニペットのテスト

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


66バイトでなければなりません。\\は、長さを数えるときに\として解析された可能性があります。
冗長性

1
@redundancy私は本当に"code".length長さを数えるためにJavaScriptコンソールでの使用をやめるべきです
ハーマンL

1

V、30バイト

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

一度に1つの入力が必要です。TIOスニペットは、指定されたすべてのテストケースを単一の入力として実行します。

Vの拡張マッピングは初めてなので、ヒントはいつでも大歓迎です!

オンラインでお試しください!

説明

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バイト

#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(});}

オンラインでお試しください!

@ErikFの実装に基づいていますが、はありませんswitch/case

わずかに未使用のバージョン

#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バイト

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

でパイプとして実行する-nR、オンラインで試してください

Windowsの改行の\s$/mに挿入します。\s*改行が不確実な場合。値にが含まれている場合は後に
挿入U$/mます=


1

ダーツ142の 114 108バイト

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

オンラインでお試しください!

  • -json.encode関数を削除し、通常の文字列構築を使用して-28バイト
  • 'new'キーワードといくつかのスペースを削除して-6バイト
  • 弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
    Licensed under cc by-sa 3.0 with attribution required.