Minecraft भाषा फ़ाइलें अद्यतनकर्ता


11

1.13 में, Minecraft भाषा फ़ाइलों को JSON में एक साधारण बहु-पंक्ति कुंजी = मान स्वरूप से स्विच किया गया था ।

चुनौती

JSON स्ट्रिंग वापस करने वाले मूल प्रारूप से परिवर्तित प्रोग्राम लिखें। इनपुट को किसी भी मानक इनपुट विधि का उपयोग करके लिया जा सकता है, आउटपुट को किसी भी मानक आउटपुट विधि से json होना चाहिए

मूल प्रारूप में उदाहरण के लिए, कुंजी = मान जोड़े वाली लाइनें शामिल हैं

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

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

कुंजी = मान के साथ एक बड़ी 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 से पहले भाषा की फ़ाइल में कोई नई सूची, बैकस्लैश या अन्य जोंस-ब्रेकिंग चीजें मौजूद नहीं हैं)
  • खाली लाइनों को नजरअंदाज करना चाहिए
  • लाइनों में एक समान होता है

परीक्षण के मामलों

इनपुट:

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"?
पावेल

@ पावेल उउह ... वूप्स। तय किया कि यह अनजाने में था
pgg

5
क्या यह गारंटी है कि प्रत्येक गैर-रिक्त रेखा में ठीक 1 है =?
user202729

@ user202729 हाँ
PFG

3
मैं शर्त लगाने को तैयार हूँ कि आपको वास्तव में इस समस्या के समाधान की आवश्यकता है और अपनी फ़ाइलों को परिवर्तित करने के लिए एक का उपयोग करने का इरादा है। :)
mbomb007

जवाबों:


4

पायथन 3, 91 77 बाइट्स

-14 बाइट्स OMᗺ के लिए धन्यवाद

मुझे लगा कि एक पायथन डिक्शनरी का प्रिंटआउट JSON के लिए पर्याप्त होगा जो इसे इस चुनौती के लिए एक बहुत ही प्रतिस्पर्धी भाषा बना देगा। हालाँकि, अजगर शब्दकोशों के स्ट्रिंग प्रतिनिधित्व JSON से काफी अलग है कि मुझे अजगर की अंतर्निहित JSON लाइब्रेरी का उपयोग करके बेहतर भाग्य मिला था। मैं शर्त लगाता हूं कि यह अधिक संक्षेप में जावास्क्रिप्ट में किया जा सकता है।

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

इसे ऑनलाइन आज़माएं!


संपादित करें:

बैश + सेड, 68 63 बाइट्स

बग फिक्स OM fix और रात 2
-5 धन्यवाद बाइट OMᗺ के लिए धन्यवाद

मैंने महसूस किया कि टेक्स्ट को सीधे JSON में कनवर्ट करने के लिए इसे एक ऑब्जेक्ट में बंडल किए बिना अधिक बाइट कुशल हो सकता है, जैसा कि अजगर समाधान के लिए मेरा दृष्टिकोण था। बाइट के अनुसार, रेक्स रेक्सएक्स रिप्लेसमेंट के लिए सबसे शक्तिशाली भाषा है जिसे मैं जानता हूं।

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

बैश + sed उत्तर के लिए, -rsed (+3 बाइट्स) के लिए ध्वज का उपयोग करने का प्रयास करें ताकि आपको कैप्चरिंग ग्रुप्स (-4 बाइट्स) tio.run/##LYq7CgIxEEX7/ ...
user41805

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`.
.+
    "$&",
^
{¶
$
¶}

इसे ऑनलाइन आज़माएं! रेटिना 1 में 34 बाइट्स होंगे जैसा कि आप और के L$`.+बजाय उपयोग कर सकते हैं । स्पष्टीकरण: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 में एक "भूसी" नामक कुछ है!
रेडवुल्फ कार्यक्रम

2

रूबी , 56 बाइट्स

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

-rjsonदुभाषिया ध्वज के लिए +6 बाइट्स ।

इसे ऑनलाइन आज़माएं!


1
@Piccolo -rjson झंडा आपने पास किया?
pfg

@pfg वाह, मैंने वास्तव में उस हाहा पर गेंद को गिरा दिया। मैं केवल उपयोग करने के लिए भूल नहीं किया था -rjson, लेकिन यह भी वास्तव में यह जांच करना कि त्रुटि एक ही एक ही है कि मैंने पहले शामिल हो गया था था बिना ग्रहणto_h
पिकोलो

2

पर्ल 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-बाइट फिर से लिखना है जो वैध (यदि मानव पाठकों के लिए बदसूरत) पैदा करता है JSON: $c||='{';s'"'\"'g;/=/&&say qq|$c"$`":"$'"|;$c=','}{say'}' मुझे उम्मीद है कि आप कुछ कम / अधिक सुरुचिपूर्ण पा सकते हैं।
मूसटैपर

@mousetrapper इससे बचने का एक अच्छा तरीका है BEGIN। ओपी स्पष्ट रूप से अनुगामी अल्पविराम की अनुमति देता है: "अनुगामी अल्पविराम की अनुमति है क्योंकि Minecraft उन्हें अनुमति देता है"। एक नए उत्तर के रूप में, अंतर का उल्लेख करते हुए बेझिझक पोस्ट करें।
सूंदर -

आह, हाँ, अच्छी बात है, उस वाक्य को मूल पोस्ट में याद किया। डिफ़ॉल्ट असाइनमेंट केवल तभी समझ में आता है यदि आप पहले चरित्र को अलग करने की कोशिश कर रहे हैं, अन्यथा आपका BEGINमामला अभी भी छोटा है जहां आप '{' का उत्सर्जन करना चाहते हैं। मुझे आपकी END-avoiding तकनीक पसंद है । मुझे पता था कि आपके कोड के चारों ओर -nएक प्रभावी while(<>){} लूप रखा गया है ; मुझे पता नहीं था कि वास्तव में कितना शाब्दिक था।
मूसटैपर

मुझे बहुत आश्चर्य हुआ, जब मैंने पहली बार यह पाया। यह उन पर्ल फीचर्स में से एक है जो अजीब हैक और शानदार तरीके से TIMTOWDI करने के बीच की लाइन को स्ट्रैडल करता है। हालांकि मैं इसके बारे में भूल गया था, इसलिए इस उदाहरण में इसका श्रेय पर्ल 5 गोल्फ टिप्स थ्रेड में डेनिस को जाता है ।
सूंदर - मोनिका

2

हास्केल , 75 71 बाइट्स

-4 बाइट्स लाईकोनी के लिए धन्यवाद (सूची-समझ से अधिक अंकन का उपयोग करके)!

=एक लाइन पर कई के साथ काम करता है :

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

इसे ऑनलाइन आज़माएं!

व्याख्या

शब्द span(/='=')<$>lines sपहले स्ट्रिंग को विभाजित करता है =, हमें छोड़ देता है ("<initial part>","=<remaining line>")। एक पैटर्न-मैच करना (a,_:b)यह सुनिश्चित करता है कि रेखा खाली नहीं थी और एक ही समय में अग्रणी को हटा देती है =

अब हमें केवल ( और इसे उद्धरणों में शामिल करने के लिए और उद्धरणों से बचकर) showदोनों की आवश्यकता है , कुछ प्रारूपण ( और वर्ण) करें और अंत में इसे संलग्न करें ।ab:,{}


1
71 बाइट्स का उपयोग करना do: इसे ऑनलाइन आज़माएं!
लैकोनी

2

सी (जीसीसी) , 243 219 बाइट्स

सुझाव के लिए सीलिंग के लिए धन्यवाद।

मैंने तीन मामलों (न्यूलाइन, कुंजी, मूल्य) को संभालने के लिए एक राज्य मशीन का उपयोग करने का फैसला किया और यह बहुत अच्छी तरह से निकला। इसके अलावा, मैं करने के लिए मिल गया है अब की सुविधा के माध्यम से गिरने से उपयोग switchऔर स्थूल stringizing ऑपरेटर!

हालाँकि चुनौती के लिए इसकी आवश्यकता नहीं थी, फिर भी मैं JSON कल्पना के अनुसार\ चरित्र से बच गया यदि वह वर्ण इनपुट में कभी नहीं होगा, तो &&c-925 और बाइट्स के लिए हटाया जा सकता है।

#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

जावास्क्रिप्ट, 66 63 62 बाइट्स

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

-3 बाइट्स के लिए धन्यवाद @redundancy

-1 बाइट @ l4m2 के लिए धन्यवाद




@ l4m2 स्ट्रिंग RegExp ऑब्जेक्ट? आज कुछ नया सीखा 🤯
darrylyeo


1

पर्ल 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

रूबी, ५ ९ + ५ = ६४

आवश्यकताएं -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

जावास्क्रिप्ट (ईएस 6), 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 बाइट होनी चाहिए। लंबाई गिनते समय \\ को \ n के रूप में पार्स किया गया हो सकता है।
अतिरेक

1
@redundancy मैं वास्तव में का उपयोग कर बंद कर देना चाहिए "code".lengthJavaScript कंसोल में लंबाई गिनती करने के लिए
हरमन एल

1

वी , 30 बाइट्स

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

एक समय में एक इनपुट की अपेक्षा करता है। TIO स्निपेट एकल इनपुट के रूप में सभी दिए गए परीक्षण मामलों को चलाता है।

मैं वी के विस्तारित मैपिंग के लिए नया हूं, इसलिए सुझावों का हमेशा स्वागत है!

इसे ऑनलाइन आज़माएं!

व्याख्या

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

सी (जीसीसी) , 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(});}

इसे ऑनलाइन आज़माएं!

@ एरिकएफ के कार्यान्वयन के आधार पर लेकिन बिना switch/case

थोड़ा ungolfed संस्करण

#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; \s*अगर लाइनब्रेक अनिश्चित हैं। मान शामिल होने के बाद
सम्मिलित करें ।U$/m=


1

डार्ट , 142 114 108 बाइट्स

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

इसे ऑनलाइन आज़माएं!

  • Json.encode फ़ंक्शन से छुटकारा पाने और नियमित स्ट्रिंग बिल्डिंग का उपयोग करके -28 बाइट्स
  • -6 'नए' कीवर्ड और कुछ रिक्त स्थान को हटाकर बाइट्स
  • हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
    Licensed under cc by-sa 3.0 with attribution required.