এক বিট অফ আচার


19

পাইথনের আচার মডিউলটি সিরিয়ালাইজেশনের জন্য ব্যবহৃত হয়, একজনকে এমনভাবে কোনও বস্তুকে ডাম্প করার অনুমতি দেয় যাতে এটি পরে পুনর্গঠন করা যায়। এর জন্য, আচার একটি সাধারণ স্ট্যাক-ভিত্তিক ভাষা ব্যবহার করে।

জিনিসগুলি সহজ রাখতে, আমরা এই ভাষার একটি ছোট উপসেটটি নিয়ে কাজ করব:

(              Push a mark to the stack
S'abc'\n       Push a string to the stack (here with contents 'abc')
l              Pop everything up to the last mark, wrapping all but the mark in a list
t              Pop everything up to the last mark, wrapping all but the mark in a tuple
.              Terminate the virtual machine

আপনার কাজটি ভাষার এই উপসেটটি বাস্তবায়ন করা। নোট যে \nএখানে একটি আক্ষরিক নতুন লাইন, এবং নতুন লাইন আসলে ভাষার জন্য গুরুত্বপূর্ণ।

GolfScript বা সাথে পরিচিত ভাষায় CJam মত, তাদের জন্য (এবং l/tএকইভাবে অপারেট [এবং ]যথাক্রমে।

ইনপুট

জিনিসগুলি সহজ রাখতে, ইনপুটটি সর্বদা বৈধ থাকবে। বিশেষত, আপনি ইনপুট সম্পর্কে নিম্নলিখিতটি ধরে নিতে পারেন:

  • স্ট্রিংগুলিতে কেবল ছোট হাতের অক্ষর এবং স্পেস [a-z ]থাকবে এবং সর্বদা একক উদ্ধৃতি ব্যবহার করবে।
  • উপরে বর্ণিত সমস্ত নির্দেশাবলীর সাথে কোনও বহিরাগত অক্ষর থাকবে না। উদাহরণস্বরূপ, এর অর্থ এই যে নিউলাইনগুলি কেবল স্ট্রিংয়ের পরে কখনও ঘটবে।
  • প্রত্যেকের আগে এর l/tমিল রয়েছে (এবং এর পরেও প্রত্যেকটির (মিল রয়েছে l/t। কমপক্ষে একটিও থাকবে (
  • ঠিক এক হবে ., এবং এটি সর্বদা চূড়ান্ত চরিত্র হবে।

আপনি কমান্ড লাইন, STDIN বা ফাংশন যুক্তির মাধ্যমে ইনপুট নিতে পারেন। আপনি যদি চান তবে মাল্টিলাইন স্ট্রিংয়ের পরিবর্তে আপনি একটি একক নিউলাইন-পলায়নের স্ট্রিং ব্যবহার করতে পারেন, তবে দয়া করে আপনার উত্তরে এটি উল্লেখ করুন।

আউটপুট

আউটপুটটি চূড়ান্ত অবজেক্টের উপস্থাপনা হওয়া উচিত, STDOUT এ মুদ্রিত হওয়া বা স্ট্রিং হিসাবে ফিরে আসা উচিত । বিশেষ করে:

  • স্ট্রিংগুলি মধ্যবর্তী সামগ্রীর সাথে একক উদ্ধৃতি খোলার এবং বন্ধ করে প্রতিনিধিত্ব করা হয়, যেমন S'abc' -> 'abc'। পাইথনে অনুমতি দেওয়া সত্ত্বেও আপনি এই চ্যালেঞ্জের জন্য ডাবল উক্তি ব্যবহার করতে পারবেন না।

  • তালিকাটি [](যেমন ['a','b','c']) দ্বারা বেষ্টিত কমা-বিচ্ছিন্ন উপাদান দ্বারা প্রতিনিধিত্ব করা হয় , যখন টিপলগুলি কমা দ্বারা বিচ্ছিন্ন উপাদান দ্বারা পরিবেশন করা হয় ()(যেমন ('a','b','c')) eg

  • স্পেসগুলি কিছু যায় আসে না, যেমন ('a', 'b', 'c' )ঠিক আছে।
  • বন্ধ করার বন্ধনীটির আগে আপনার কমা থাকতে পারে না। দ্রষ্টব্য যে এটি বেশিরভাগ ভাষার পক্ষে জিনিসগুলি সহজ করার জন্য পাইথন বাক্য গঠন নিয়মের থেকে ইচ্ছাকৃতভাবে পৃথক, এবং পাইথনের তালিকাগুলি / টুপলকে সহজেই তৈরি করা আরও শক্ত করে তোলে তবে একক-উপাদানগুলির টিউপলকে কীভাবে উপস্থাপন করা হয় তার কারণে (এটির জন্য) চ্যালেঞ্জ, আমাদের ('a')যেমন বিরোধিতা করা দরকার ('a',))।

উদাহরণ

উপরের পাঠ্যটি ভয়ঙ্কর মনে হতে পারে, তবে নিম্নলিখিত উদাহরণগুলির দ্বারা বিষয়গুলি কিছুটা স্পষ্ট করা উচিত।

(l.

সম্ভাব্য আউটপুট: []

(t.

সম্ভাব্য আউটপুট: ()

(S'hello world'
l.

সম্ভাব্য আউটপুট: ['hello world']

(S'string one'
S'string two'
S'string three'
t.

সম্ভাব্য আউটপুট: ('string one', 'string two', 'string three')

(S'a'
(S'b'
S'c'
lt.

সম্ভাব্য আউটপুট: ('a',['b','c'])

((S'a'
S'b'
(lS'c'
t(S'd'
tl.

সম্ভাব্য আউটপুট: [('a', 'b', [], 'c'), ('d')]

((S'a'
((S'b'
t(S'c'
lS'd'
(((ltlS'e'
S'f'
lS'g'
tl.

সম্ভাব্য আউটপুট: [('a',[('b'),['c'],'d',[([])],'e','f'],'g')]

বিধি

  • এটি , সুতরাং কয়েকটি বাইটের কোডটি জয়ী।
  • পাইথন আচারের সাথে কাজ করার জন্য তৈরি করা কোনও কার্যকারিতা অনুমোদিত নয়।

সুরক্ষা দ্রষ্টব্য: আসল কোডে, কেবলমাত্র আপনার বিশ্বাসযোগ্য উত্সগুলি থেকে সরান বা অন্যথায় আপনি একটি বাজে cos\nsystem\n(S'rm -rf'\ntR.চমক পেতে পারেন


না S'abc'\nধাক্কা abcবা 'abc'?
ক্যালকুলেটরফলাইন

উত্তর:


4

সিজেম, 63

q{"Slt 1:T;L ]',*'[\+']+ ]',*'(\+')+ [
 0:T; C+"35/T=S/(C#=~}fC

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

ব্যাখ্যা:

q        read the input
{…}fC    for each character C in the input
  "…"    push that long string, containing code to handle various cases
  35/    split it into (two) parts of length 35
  T=     get the T'th part; T is 1 when parsing a string and 0 otherwise
          (T is initially 0 by default)
  S/     split by space into an array of strings
  (      take out the first item (containing special characters to check)
  C#     find the index of C in that string
  =      get the corresponding string from the array
          (when C is not found, # returns -1 which gets the last array item)
  ~      execute that string

কোডের বিভিন্ন টুকরো সহ এখন লম্বা স্ট্রিং। প্রতিটি অংশে কয়েকটি অক্ষর রয়েছে যাচাই করতে হবে এবং তারপরে প্রতিটি একটিকে পরিচালনা করার জন্য একটি ব্লক এবং ডিফল্ট কেস রয়েছে।

প্রথম অংশ: Slt 1:T;L ]',*'[\+']+ ]',*'(\+')+ [

Slt      special characters to check
######## first block, corresponding to character 'S'
1:T;     set T=1, causing the next characters to be processed with the 2nd part
L        push an empty string/array, which will be used to collect the string
######## second block, corresponding to character 'l'
]        end array
',*      join with commas
'[\+     prepend a '['
']+      append a ']'
######## third block, corresponding to character 't'
]        end array
',*      join with commas
'(\+     prepend a '('
')+      append a ')'
######## last block, corresponding to other characters (practically, '(' and '.')
[        start array

দ্বিতীয় অংশ: (newline) 0:T; C+

newline  special characters to check (only one)
######## first block, corresponding to newline
0:T;     set T=0, switching back to the first part
######## last block, corresponding to any other character (including apostrophe)
C+       append the character to the collecting string

3

পার্ল, 149 বাইট

আমার একটা খারাপ অনুভূতি হচ্ছে যে এটি একটি দুর্বল প্রচেষ্টা, তবে এখানে যায়:

$/=$,;$"=",";@s=[];/^\(/?$s[@s]=[]:{$p=/S(.*')/?$1:/l|t/?($l="@{pop@s}")|/l/?"[$l]":"($l)":0,push@{$s[-1]},$p}for<>=~/([(lt]|S.*?\n)/g;print$s[0][0];

স্ক্রিপ্টটি কোনও ফাইলে সংরক্ষণ করতে হয় এবং এটি এসটিডিএন থেকে ইনপুট নেয়।

ব্যাখ্যা:

# Set the input record separator to undef so that <> reads all lines at
# once
$/=$,;
# Ensure that elements of lists printed in quotes are separated by commas
$"=",";

# The stack. Initialise the bottom element with an empty array
@s=[];

# Tokens are extracted in the for loop a few lines below. Copied here for
# clarity: Read the entire input and iterate over all valid tokens of the
# pickle language
# for <>=~/([(lt]|S.*?\n)/g;
# the token is a mark - push an empty array to the stack
/^\(/ ? $s[@s]=[]
      # token is a string, push it inside the stack top
      : {$p=/S(.*')/ ? $1
                     # otherwise, remove the top and create list or tuple
                     # from it and push it inside the top element
                     : /l|t/ ? ($l="@{pop@s}") | /l/ ? "[$l]"
                                                     : "($l)"
                             : 0 # dummy value
                             # pushing of the string/list/tuple actually
                             # happens here
                             , push@{$s[-1]},$p} 
# read the entire input at once and iterate over all valid tokens
for <>=~/([(lt]|S.*?\n)/g;

# in the end, the bottom element of the stack will be an array with just one
# element which is the string representation of the object
print$s[0][0];

0

> <>, 88 বাইট

^"][">}r]
~rl?!;o11.
^0\!\
 &</\?[1&~?=1l","
 1/\ii:"'"=?v44.
>i9%0$.     >r]i~


 ")("\

লাফিয়ে লাফিয়ে মজা! জড়িত 5 টি প্রধান কমান্ডের 9 তম সংস্থার জন্য ASCII কোডগুলি এই সত্যটি ব্যবহার করে:

S -> 2
l -> 0
t -> 8
( -> 4
. -> 1

এটি প্রতিটি ক্রিয়াকলাপকে তার নিজস্ব লাইনে পরিচালনা করতে সহায়তা করে, যা সরাসরি চলে যাবে। প্রতিটি স্ট্রিং এবং নেস্টেড তালিকা / টিপল পৃথক করে প্রয়োজনীয় অক্ষরগুলিতে মোড়ানোর আগে আলাদাভাবে স্ট্যাকের স্ট্যাক ব্যবহার করে।


খুব ভাল কাজ হয়েছে, তবে দুর্ভাগ্যক্রমে আমি বেশিরভাগ পরীক্ষার ক্ষেত্রে সঠিক আউটপুট পাচ্ছি বলে মনে হচ্ছে না (বন্ধনীগুলি একটি জিনিসকে ভুল পথে
দেখায়

0

জাভাস্ক্রিপ্ট (ES6), 199 বাইট

s=>(q=x=>(o=[],x.slice(0,-1).map(v=>o=[...o,v.map?q(v):`'${v}'`]),x.pop()<"m"?`[${o}]`:`(${o})`),q(eval(s[r="replace"](/\(/g,"[")[r](/[tl](?![\w ]+'\n)/g,"'$&'],")[r](/S('.+')/g,"$1,").slice(0,-2))))

বৈধ জেএস কোডে রূপান্তর করতে ইনপুটটিতে বেশ কয়েকটি রেজেক্স প্রতিস্থাপন চালায়, তারপরে পার্স করুন।

পরীক্ষার স্নিপেট

f=
s=>(q=x=>(o=[],x.slice(0,-1).map(v=>o=[...o,v.map?q(v):`'${v}'`]),x.pop()<"m"?`[${o}]`:`(${o})`),q(eval(s[r="replace"](/\(/g,"[")[r](/[tl](?![\w ]*'\n)/g,"'$&'],")[r](/S('.+')/g,"$1,").slice(0,-2))))
<select oninput="I.value=this.selectedIndex?this.value.replace(/\\n/g,'\n'):'';O.innerHTML=this.selectedIndex?f(I.value):''"><option>---Tests---<option>(l.<option>(t.</option><option>(S'hello world'\nl.<option>(S'string one'\nS'string two'\nS'string three'\nt.<option>(S'a'\n(S'b'\nS'c'\nlt.<option>((S'a'\nS'b'\n(lS'c'\nt(S'd'\ntl.<option>((S'a'\n((S'b'\nt(S'c'\nlS'd'\n(((ltlS'e'\nS'f'\nlS'g'\ntl.</select><br>
<textarea rows=10 cols=20 id=I></textarea><br><button onclick="O.innerHTML=f(I.value)">Run</button><br><pre id=O></pre>


0

জুলিয়া + পার্সার কম্বিনেটর.জিল 306 240

আমার সর্বশেষ সংশোধনগুলির সেট নিয়ে আমি আর ভাবি না যে খাঁটি জুলিয়া সমাধানটি আরও কম হবে।

using ParserCombinator
v=join
j(t)=v(t,",")
a=Delayed()
s=E"S'"+Star(p".")+Drop(Equal("'\n"))|>x->"'$(v(x))'"
i=Star(a)|E""
l=E"("+i+E"l"|>x->"[$(j(x))]"
t=E"("+i+E"t"|>x->"($(j(x)))"
a.matcher=s|l|t
f(x)=parse_one(x,a+E".")|>first

এটি আকর্ষণীয় ছিল। আমি মনে করি কোডিং মোটামুটি সুস্পষ্ট।

  • আউটপুট ফর্ম্যাটিং প্রজন্মের সময়ে সম্পন্ন হয়
  • a l, i, t, এবং sমূলত নিয়ম CFG হয়
  • f যে ফাংশন বলা হয় এটি সব একত্রিত করে।
  • Drop(Equal("'\n"))বিরক্তিকর - যে আদর্শভাবে হিসেবে লেখা হবে E"\n"কিন্তু Eস্ট্রিং ম্যাক্রো পালাবার ক্রম হ্যান্ডেল নেই।
  • মজার বিষয় হল এটি তুচ্ছভাবে জুলিয়া ডেটা স্ট্রাকচারগুলিতে ফিরে আসার ক্ষেত্রে রূপান্তরিত হতে পারে, এটি মূলত আরএইচএসের রূপান্তরগুলি সরিয়ে |>এবং নিয়মের tupleজন্য যুক্ত করছেt

দুর্ভাগ্যক্রমে, আমাদের সহায়তা কেন্দ্রের নিয়ম অনুসারে , গল্ফিং কোড গল্ফ চ্যালেঞ্জগুলির সমাধান পোস্ট করার জন্য প্রয়োজনীয়।
ডেনিস

আমি যদিও 100% নই তবে আমি আরও ছোট করতে পারি। এটি বহিরাগতকে গল্ফ করা হয় যে এই ল্যাঙ্গ / লাইব্রেরি সংমিশ্রণ "জুলিয়া + পার্সারকোম্বিনেটর.জিল" ব্যবহার করে যে কোনও সমাধান গল্ফ করা যেতে পারে। তবে অন্যদিকে, এখানে একটি কঠোর পরিবর্তন হচ্ছে যে একটি সংক্ষিপ্ত খাঁটি জুলিয়া সমাধান রয়েছে .... এখন আমাকে এটি লিখতে হবে।
লিন্ডন হোয়াইট

আপনাকে সম্পূর্ণ ভিন্ন সমাধান লিখতে হবে না; আপনার পদ্ধতির সর্বাধিক সুবিধা পাওয়া যথেষ্ট। কমপক্ষে মন্তব্যগুলি অপসারণ করা উচিত।
ডেনিস

আমি বাইট-কাউন্টের দিকে মন্তব্যগুলি (বা ফাঁকা লাইন) গণনা করি নি। আমি বুঝতে পেরেছি যে এই কনভেনশনটি ছিল, আমার ধারণা আমি ভুলভাবে আবিষ্কার করেছি
লিন্ডন হোয়াইট

হ্যাঁ, পোস্ট হিসাবে কোড স্কোর হয় । আপনি সর্বদা একটি অবারিত / টীকাযুক্ত সংস্করণ যুক্ত করতে পারেন।
ডেনিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.