อัพเดตไฟล์ภาษา Minecraft


11

ใน 1.13, ไฟล์ภาษา Minecraft ถูกเปลี่ยนจากการเป็นรูปแบบคีย์หลายค่าแบบง่าย = เป็นJSON JSON

ท้าทาย

เขียนโปรแกรมที่แปลงจากรูปแบบดั้งเดิมที่ส่งคืนสตริง JSON อินพุตสามารถใช้วิธีอินพุตมาตรฐานใด ๆ เอาต์พุตต้องเป็น json จากวิธีเอาต์พุตมาตรฐานใด ๆ

รูปแบบดั้งเดิมมีบรรทัดที่มีคู่ key = value ตัวอย่างเช่น

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

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

ควรแปลงเป็นวัตถุ JSON ขนาดใหญ่หนึ่งตัวพร้อม key = value

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

รายละเอียดบางอย่าง

  • JSON ที่ถูกต้องใด ๆ ที่ได้รับอนุญาตตราบใดที่มันมีคู่คีย์ / ค่าที่ถูกต้องเท่านั้น คอมม่าต่อท้ายได้รับอนุญาตเพราะ Minecraft ช่วยให้พวกเขา
  • สิ่งเดียวที่ต้องหนีคือคำพูด (ไม่มีการขึ้นบรรทัดใหม่แบ็กสแลชหรือสิ่งอื่นที่ทำลาย json ในไฟล์ภาษาก่อนหน้า 1.13)
  • ควรเว้นบรรทัดว่างไว้
  • บรรทัดมีหนึ่งเท่ากับทั้งหมด

กรณีทดสอบ

การป้อนข้อมูล:

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 uuh ... อ้าว แก้ไขที่ นั่นไม่ได้ตั้งใจ
pfg

5
มีการรับประกันหรือไม่ว่าแต่ละบรรทัดที่ไม่ว่างนั้นมีค่า 1 =หรือไม่
user202729

@ user202729 ใช่
PFG

3
ฉันยินดีที่จะเดิมพันว่าคุณต้องการทางออกสำหรับปัญหานี้และตั้งใจจะใช้เพื่อแปลงไฟล์ของคุณ :)
mbomb007

คำตอบ:


4

Python 3, 91 77 ไบต์

-14 ไบต์ขอบคุณOMᗺ

ฉันคิดว่าการพิมพ์พจนานุกรม Python จะใกล้เคียงกับ JSON มากพอที่จะทำให้มันเป็นภาษาที่มีการแข่งขันสูงสำหรับความท้าทายนี้ อย่างไรก็ตามการแสดงสตริงของพจนานุกรมหลามแตกต่างจาก JSON ที่ฉันโชคดีขึ้นด้วยการใช้ไลบรารี JSON ในตัวของ python ฉันจะเดิมพันนี้สามารถทำได้อย่างรวบรัดใน JavaScript

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

ลองออนไลน์!


แก้ไข:

Bash + Sed, 68 63 bytes

แก้ไขข้อผิดพลาดด้วยOMᗺและ Night 2
-5 Bytes ขอบคุณOMᗺ

ฉันรู้ว่ามันอาจจะมีประสิทธิภาพมากกว่าไบต์ในการแปลงข้อความเป็น JSON โดยตรงโดยไม่ต้องรวมมันในวัตถุเช่นเดียวกับวิธีการของฉันสำหรับวิธีการแก้ปัญหาหลาม ต่อไบต์, sed เป็นภาษาที่ทรงพลังที่สุดสำหรับการแทนที่ regex ที่ฉันรู้

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
หากคุณตอบในสองภาษาที่แตกต่างกันอย่าลังเลที่จะโพสต์ว่าเป็นสองคำตอบที่แยกจากกัน
mbomb007

สำหรับคำตอบ bash + sed ลองใช้การ-rตั้งค่าสถานะสำหรับ sed (+3 ไบต์) เพื่อให้คุณไม่จำเป็นต้องหลีกเลี่ยงกลุ่มการจับ (-4 ไบต์) tio.run/##LYq7CgIxEEX7/
41805

4

เป็นกลุ่ม 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

เรติน่า 0.8.2 , 35 ไบต์

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

ลองออนไลน์! จะเป็น 34 ไบต์ใน Retina 1 ในขณะที่คุณสามารถใช้L$`.+แทนและG`. .+คำอธิบาย:

"
\"

หนีคำพูด

=
": "

แก้ไขตัวคั่นคีย์ / ค่า (หากค่าอาจมี a =ให้ใช้1`=ที่ราคา 2 ไบต์)

G`.

ลบบรรทัดว่าง

.+
    "$&",

ตัดแต่ละบรรทัดด้วยเครื่องหมายคำพูด (คำพูดภายในถูกเพิ่มไว้ก่อนหน้านี้)

^
{¶
$
¶}

ล้อมรอบเอาต์พุตทั้งหมด{}เป็น s


2

แกลบ , 22 ไบต์

การจัดการสตริงไม่ใช่ความแข็งแกร่งของ Husk แต่ทำได้ดีมาก:

`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!
โปรแกรม Redwolf

2

Ruby , 56 ไบต์

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

+6 ไบต์สำหรับ-rjsonการตั้งค่าสถานะของล่าม

ลองออนไลน์!


1
@Piccolo คุณผ่านธง -rjson หรือไม่
pfg

@pfg ว้าวฉันทิ้งบอลไว้บนฮ่าฮ่า ฉันไม่เพียง แต่ลืมที่จะใช้-rjsonแต่ยังสันนิษฐานโดยไม่ตรวจสอบจริง ๆ ว่าข้อผิดพลาดเป็นสิ่งเดียวกับที่ฉันได้รับก่อนหน้านี้ที่เกี่ยวข้องกับto_h
Piccolo

2

Perl 5 -nl -M5.010 , 58 54 ไบต์

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

ลองออนไลน์!


รุ่น 58 ไบต์:

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

ลองออนไลน์!


ทั้งสองเวอร์ชันเพิ่มคอมมาหลังจากทุกคีย์: คู่ของค่าซึ่งเป็นเทคนิคที่ไม่สอดคล้องกับ JSON (คอมม่าสุดท้ายก่อนที่จะปิด}ควรละเว้นและจะล้มเหลวในการตรวจสอบ JSON ที่เข้มงวดที่สุด) ต่อไปนี้เป็น 58- ไบต์เขียนใหม่อย่างรวดเร็วซึ่งผลิตที่ถูกต้อง (ถ้าเป็น uglier สำหรับผู้อ่านมนุษย์) JSON: $c||='{';s'"'\"'g;/=/&&say qq|$c"$`":"$'"|;$c=','}{say'}' ฉันคาดหวังว่าคุณจะพบบางสิ่งที่สั้นลง / ดูดีขึ้น
mousetrapper

@mousetrapper BEGINนั่นเป็นวิธีที่ดีที่จะหลีกเลี่ยง OP อนุญาตให้ใช้จุลภาคต่อท้ายได้อย่างชัดเจนว่า: "อนุญาตให้ใช้จุลภาคต่อท้ายเนื่องจาก Minecraft อนุญาตให้ใช้" รู้สึกอิสระที่จะโพสต์ว่าเป็นคำตอบใหม่กล่าวถึงความแตกต่าง
sundar - Reinstate Monica

อาใช่จุดดีพลาดประโยคนั้นในโพสต์ต้นฉบับ การกำหนดค่าเริ่มต้นจะใช้งานได้ก็ต่อเมื่อคุณพยายามเปลี่ยนอักขระตัวแรกไม่เช่นBEGINนั้นคุณจะสั้นลงในกรณีที่คุณต้องการปล่อย '{' ฉันชอบENDเทคนิคการหลีกเลี่ยงของคุณ ฉันรู้ว่า-nวาง วงที่มีประสิทธิภาพ while(<>){}รอบรหัสของคุณ; ฉันไม่รู้ว่าตัวอักษรนั้นเป็นอย่างไร
mousetrapper

ฉันก็ประหลาดใจเช่นกันเมื่อฉันพบว่าครั้งแรก เป็นหนึ่งในคุณสมบัติ Perl ที่เลาะเลียบเส้นแบ่งระหว่างการแฮ็กแปลก ๆ และวิธีที่ยอดเยี่ยมในการทำ TIMTOWDI ผมลืมเกี่ยวกับมันแม้ว่าดังนั้นเครดิตสำหรับในกรณีนี้ไปที่เดนนิสในหัวข้อ Perl 5 เคล็ดลับในการเล่นกอล์ฟ
sundar - Reinstate Monica

2

Haskell , 75 71 ไบต์

-4 ไบต์ขอบคุณLaikoni (ใช้การทำเครื่องหมายบน list-comprehension)!

ทำงานร่วมกับหลายรายการ=ในหนึ่งบรรทัด:

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

ลองออนไลน์!

คำอธิบาย

คำที่span(/='=')<$>lines sแยกสตริงในครั้งแรกที่ออกจากเราด้วย= ("<initial part>","=<remaining line>")การจับคู่รูปแบบ(a,_:b)ทำให้แน่ใจได้ว่าบรรทัดนั้นไม่ว่างเปล่าและในเวลาเดียวกันจะเป็นการลบการนำหน้า=หน้า

ตอนนี้เราจะต้องshowทั้งสองaและb(การปิดล้อมในคำพูดและการหลบหนีคำพูด) ทำบางรูปแบบ ( :และ,ตัวอักษร) {}และในที่สุดก็ใส่ใน


1
71 ไบต์ใช้do: ลองออนไลน์!
Laikoni

2

C (gcc) , 243 219 ไบต์

ขอบคุณสำหรับคำแนะนำ

ฉันตัดสินใจใช้เครื่องสถานะเพื่อจัดการทั้งสามกรณี (ขึ้นบรรทัดใหม่คีย์ค่า) และมันก็ค่อนข้างดี นอกจากนี้ฉันต้องabใช้คุณลักษณะ fall-through ของswitchและผู้ประกอบการ stringizing แมโคร!

แม้ว่าความท้าทายไม่จำเป็นต้องใช้ แต่ฉันก็รอดพ้น\ตัวละครตามสเป็ค 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))

-3 ไบต์ขอบคุณ@redundancy

-1 ไบต์ต้องขอบคุณ@ l4m2




@ l4m2 วัตถุ RegExp Stringified หรือไม่ เรียนรู้สิ่งใหม่วันนี้🤯
darrylyeo


1

Perl 6 , 48 ไบต์

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

2 ไบต์น้อยลงถ้าเราสามารถสันนิษฐานได้ว่าเท่ากับ 1 เท่ากับเครื่องหมายบนบรรทัดที่ไม่ว่างเปล่า

ลองออนไลน์!

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

โดยวิธีการto-jsonประจำจะเลิกในขณะที่คอมไพเลอร์จะบอกคุณ แต่ที่ใส่ใจ



1

Ruby, 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",')}}`

สมมติว่ามีเพียงหนึ่งรายการ=ต่อบรรทัด

ตัวอย่างการทดสอบ

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


ควรเป็น 66 ไบต์ \\ อาจถูกแยกวิเคราะห์เป็น \ เมื่อนับความยาว
ความซ้ำซ้อน

1
@ ความผิดพลาดฉันควรหยุดใช้"code".lengthในคอนโซล javascript เพื่อนับความยาว
Herman L

1

V , 30 ไบต์

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

คาดว่าจะป้อนข้อมูลครั้งละหนึ่งรายการ ตัวอย่าง 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หรือลองออนไลน์ลองออนไลน์

ใส่\sก่อน$/mสำหรับบรรทัดใหม่ของ Windows; \s*ถ้า linebreaks ไม่แน่นอน
ใส่Uหลังถ้ามีค่า$/m=


1

Dart , 142 114 108 bytes

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

ลองออนไลน์!

  • -28 ไบต์โดยกำจัดฟังก์ชัน json.encode และใช้การสร้างสตริงปกติ
  • -6 ไบต์โดยลบคำหลัก 'ใหม่' และช่องว่างเล็กน้อย
  • โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
    Licensed under cc by-sa 3.0 with attribution required.