মাইনক্রাফ্ট ল্যাঙ্গুয়েজ ফাইল আপডেটার


11

1.13 সালে Minecraft ভাষা ফাইলগুলির একটি সহজ বহু-লাইন কী = মান বিন্যাসে হওয়া থেকে সুইচড হয় তাদেরকে 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"
}

কিছু বিশদ

  • যে কোনও বৈধ জেএসএনকে অনুমতি দেওয়া হয় যতক্ষণ না এতে কেবল সঠিক কী / মান জোড়া থাকে। ট্রেলিং কমা অনুমোদিত কারণ মিনক্রাফ্ট তাদের অনুমতি দেয়।
  • কেবলমাত্র যে জিনিসগুলি থেকে বাঁচতে হবে তা হ'ল উদ্ধৃতি। (1.13 এর আগে ভাষা ফাইলটিতে কোনও নতুনলাইন, ব্যাকস্ল্যাশ বা জসন-ব্রেকিং কোনও বিষয় নেই)
  • খালি লাইন উপেক্ষা করা উচিত
  • রেখাগুলিতে ঠিক এক সমান থাকে contain

পরীক্ষার কেস

ইনপুট:

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"?
পাভেল

@ পাভেল উহহ ... ওফ! স্থির। এটি অনিচ্ছাকৃত ছিল
পিএফজি

5
প্রতিটি খালি খালি লাইনে হ'ল এটি কি নিশ্চিত =?
ব্যবহারকারী 202729

@ ব্যবহারকারী202729 হ্যাঁ
পিএফজি

3
আমি বাজি রাখতে ইচ্ছুক যে আপনার আসলে এই সমস্যার সমাধান দরকার এবং আপনার ফাইলগুলিকে রূপান্তর করতে কোনওটি ব্যবহার করার ইচ্ছা রয়েছে। :)
mbomb007

উত্তর:


4

পাইথন 3, 91 77 বাইট

-১ By বাইটস ওএমকে ধন্যবাদ ᗺ

আমি ভেবেছিলাম যে পাইথন অভিধানের মুদ্রণ জেএসএনের খুব কাছাকাছি এটিকে এই চ্যালেঞ্জের জন্য খুব প্রতিযোগিতামূলক ভাষা হিসাবে তৈরি করবে। তবে পাইথন অভিধানগুলির স্ট্রিং উপস্থাপনাটি জেএসএন থেকে যথেষ্ট আলাদা যে পাইথনের বিল্ট-ইন জেএসওএন লাইব্রেরিটি ব্যবহার করে আমার আরও ভাগ্য হয়েছিল। আমি বাজি ধরবো এটি জাভাস্ক্রিপ্টে আরও সংক্ষেপে করা যেতে পারে।

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

অনলাইনে চেষ্টা করে দেখুন!


সম্পাদনা:

বাশ + শেড, 68 63 বাইট

ওএমᗺ এবং নাইট 2 -5 বাইটকে ওএমকে ধন্যবাদ বাগ ফিক্স

আমি বুঝতে পেরেছিলাম যে পাইথন সমাধানের জন্য আমার পদ্ধতির মতো এটি কোনও বাইটেল না করে সরাসরি পাঠ্যটিকে 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

বাশ + সেড উত্তরের -rজন্য, সেডের জন্য পতাকাটি ব্যবহার করার জন্য (+3 বাইট) চেষ্টা করুন যাতে আপনার ক্যাপচারিং গ্রুপগুলি (-4 বাইট) আটকাতে না পারে tio.run/##LYq7CgIxEEX7/…
ব্যবহারকারী 41805

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

রেটিনা 0.8.2 , 35 বাইট

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

এটি অনলাইন চেষ্টা করুন! আপনি এবং এর L$`.+পরিবর্তে ব্যবহার করতে পারেন রেটিনা 1 এ 34 বাইট হবে । ব্যাখ্যা:G`..+

"
\"

উদ্ধৃতি এড়ান।

=
": "

কী / মান বিভাজক ঠিক করুন। (যদি মানটিতে একটি থাকতে পারে তবে 2 বাইট ব্যয়ে =ব্যবহার করুন 1`=))

G`.

খালি লাইন সরান।

.+
    "$&",

প্রতিটি লাইন উদ্ধৃতি মোড়ক। (অভ্যন্তরীণ উদ্ধৃতিগুলি আগে যুক্ত করা হয়েছিল))

^
{¶
$
¶}

সম্পূর্ণ আউটপুট {}গুলি এস।


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

হাস্যকরভাবে, মাইনক্রাফটে "হুস্ক" নামে একটি জিনিস আছে!
রেডউল্ফ প্রোগ্রামগুলি

2

রুবি , 56 বাইট

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

-rjsonদোভাষীর পতাকার জন্য +6 বাইট ।

এটি অনলাইন চেষ্টা করুন!


1
@ পাইকলো আপনি -আরসন পতাকাটি পাস করেছেন?
পিএফজি

@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-বাইট পুনর্লিখন যা বৈধ উত্পাদন করে (মানব পাঠকদের জন্য যদি কুশলী) জাসন: $c||='{';s'"'\"'g;/=/&&say qq|$c"$`":"$'"|;$c=','}{say'}' আমি আশা করি আপনি কিছুটা খাটো / আরও মার্জিত হতে পারেন।
মাউসট্রেপার

@ মাউসট্রেপার এটি এড়ানোর একটি দুর্দান্ত উপায় BEGIN। ও.পি স্পষ্টভাবে ট্রেলিং কমাগুলিকে অনুমতি দেয় যদিও: "ট্রেলিং কমা অনুমোদিত কারণ মাইনক্রাফ্ট তাদের অনুমতি দেয়।" পার্থক্য উল্লেখ করে একটি নতুন উত্তর হিসাবে পোস্ট নির্দ্বিধায়।
- মনিকা

আহ, হ্যাঁ, ভাল কথা, মূল পোস্টে সেই বাক্যটি মিস করেছে। আপনি যদি প্রথম অক্ষরটি পরিবর্তনের চেষ্টা করছেন তবে ডিফল্ট কার্যনির্বাহীতাটি তখনই বোধগম্য হয়, অন্যথায় BEGINআপনি যেখানে '{' নির্গত করতে চান সেখানে আপনার ক্ষেত্রে আরও খাটো থাকে। আমি আপনার- ENDচালিত কৌশল পছন্দ করি আমি জানতাম যে আপনার কোডের চারপাশে কার্যকর লুপ -nস্থাপন করেছে ; এটি কতটা আক্ষরিক ছিল তা আমার কোনও ধারণা ছিল না। while(<>){}
মাউসট্রেপার 21

আমিও বেশ অবাক হয়েছি, যখন আমি প্রথম এটি খুঁজে পেয়েছি। এটি সেই পার্ল বৈশিষ্ট্যগুলির মধ্যে একটি যা একটি অদ্ভুত হ্যাক এবং টিমটোউডি করার একটি উজ্জ্বল উপায়ের মধ্যে লাইনকে স্তম্ভিত করে। যদিও আমি এটি সম্পর্কে ভুলে গিয়েছিলাম, সুতরাং এর উদাহরণস্বরূপ এটির জন্য ক্রেডিট ডানিসের কাছে পার্ল 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উভয় aএবং b(এটি উদ্ধৃতিগুলিতে এবং কোয়েটগুলি থেকে বেরিয়ে আসা) দরকার, কিছু ফর্ম্যাটিং ( :এবং ,অক্ষর) করুন এবং শেষ পর্যন্ত এটিকে আবদ্ধ করুন {}


1
71 বাইট ব্যবহার করে do: এটি অনলাইনে চেষ্টা করুন!
লাইকনি

2

সি (জিসিসি) , 243 219 বাইট

পরামর্শের জন্য সিলিংক্যাট ধন্যবাদ।

আমি তিনটি কেস (নিউলাইন, কী, মান) হ্যান্ডেল করার জন্য একটি রাষ্ট্রীয় মেশিন ব্যবহার করার সিদ্ধান্ত নিয়েছি এবং এটি বেশ ভালভাবেই পরিণত হয়েছে। এছাড়াও, আমি পেয়েছিলাম এবি বৈশিষ্ট্য মাধ্যমে পতনের-ব্যবহার করে switchএবং ম্যাক্রো stringizing অপারেটর!

যদিও চ্যালেঞ্জটির প্রয়োজন হয়নি, আমি জেএসওএন অনুমান অনুসারে \চরিত্রটি থেকেও পালিয়ে এসেছি যদি সেই চরিত্রটি কখনই ইনপুটটিতে না থাকে, তবে &&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 বাইট

আসল জমাটি জেএসওএন প্রদত্ত উদাহরণগুলির মতো অপ্রয়োজনীয় ব্যবধান রেখেছিল।

#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 বাইটস @ রিডেন্ডেন্সিতে ধন্যবাদ

-1 বাইট @ l4m2 ধন্যবাদ




@ l4m2 স্ট্রিংফাইড রেজিপ এক্সপেক্টস? আজ নতুন কিছু শিখেছে 🤯
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

রুবি, 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

জাভাস্ক্রিপ্ট (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দৈর্ঘ্য গণনা করার জন্য জাভাস্ক্রিপ্ট কনসোলটিতে আমার সত্যিই ব্যবহার বন্ধ করা উচিত
হারমান এল

1

ভি , 30 বাইট

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

একবারে একটি ইনপুট আশা করে। টিআইও স্নিপেট সমস্ত প্রদত্ত পরীক্ষার কেসগুলিকে একক ইনপুট হিসাবে চালায়।

আমি ভি এর বর্ধিত ম্যাপিংগুলিতে নতুন, তাই পরামর্শগুলি সর্বদা স্বাগত!

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

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

কিছুটা অবারিত সংস্করণ

#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

পিএইচপি, 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 ফাংশন থেকে মুক্তি পেয়ে এবং নিয়মিত স্ট্রিং বিল্ডিং ব্যবহার করে -২৮ বাইট
  • 'নতুন' কীওয়ার্ড এবং কয়েকটি স্পেস সরিয়ে -6 বাইট
  • আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
    Licensed under cc by-sa 3.0 with attribution required.