স্পষ্টতই এপিএল ট্রেনের প্রথম বন্ধনী রচনা করুন


19

এপিএলে, আপনি স্বচ্ছ ফাংশন লিখতে পারেন, এটি ট্রেন বলে । তারা কীভাবে কাজ করে তা এই চ্যালেঞ্জের জন্য অপ্রাসঙ্গিক। ফাংশন হিসাবে ব্যবহার করে এগুলি বিভিন্ন উপায়ে গোষ্ঠীভুক্ত করা যেতে পারে :

⍴      -> ⍴
⍴⍴     -> ⍴⍴
⍴⍴⍴    -> ⍴⍴⍴
⍴⍴⍴⍴   -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴  -> ⍴⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴⍴))
...

অর্ডার একই থাকে। পদ্ধতিটি হ'ল যতক্ষণ না কঠোরভাবে 3 টির বেশি ফাংশন থাকে, শেষ 3 টি ফাংশনকে একটি ফাংশনে বিভক্ত করা হয়। যদি আমরা কোনও নেস্টেড ট্রেনের সাথে দেখা করি, চালিয়ে যাওয়ার আগে আমরা প্রথমে এটি প্রথম বন্ধনীভূত করি। প্রক্রিয়াটি এখানে প্রয়োগ করা হয়েছে ⍴⍴⍴⍴⍴⍴:

Step 0: ⍴⍴⍴⍴⍴⍴
There are strictly more than 3 functions, repeat.
Step 1: ⍴⍴⍴(⍴⍴⍴)
There are strictly more than 3 functions, repeat.
Step 2: ⍴(⍴⍴(⍴⍴⍴))
There are 3 or less functions, we're done.

এখানে একই পদ্ধতি প্রয়োগ করা হয়েছে ⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴:

Step 0: ⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
  Step 0: ⍴⍴⍴⍴(⍴⍴⍴)
  There are strictly more than 3 functions, repeat.
  We have met a nested train, applying procedure to that first:
    Step 0: ⍴⍴⍴
    There are 3 or less functions, we're done.
  Step 1: ⍴⍴(⍴⍴(⍴⍴⍴))
  There are 3 or less functions, we're done.
Step 1: ⍴⍴⍴(⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
  Step 0: ⍴⍴
  There are 3 or less functions, we're done.
Step 2: ⍴⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴))
There are strictly more than 3 functions, repeat.
Step 3: ⍴(⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)))
There are 3 functions or less, we're done.

ইনপুট

এই চ্যালেঞ্জের জন্য, ইনপুট সরল করা হবে। এর অর্থ হল যে আপনি প্রথম বন্ধনী খোলার এবং বন্ধ করার জন্য 2 টি আলাদা অক্ষর এবং ফাংশনের জন্য 1 অক্ষর চয়ন করতে পারেন, প্রথম বন্ধনী হিসাবে বেছে নেওয়া পছন্দগুলি থেকে আলাদা। আপনার চয়ন করা চরগুলি অবশ্যই সামঞ্জস্যপূর্ণ হতে হবে। ইনপুটটি খালি হবে না এবং এতে কোনও লিখিত সামগ্রী (যেমন ()) নেই parent

আউটপুট

আবার, আপনি 3 টি আলাদা অক্ষর, প্রথম বন্ধনীর জন্য 2 এবং ফাংশনের জন্য 1 বেছে নিতে পারেন। নোট করুন যে ইনপুট জন্য বেছে নেওয়া তাদের মত একই হতে হবে না, তবে তারা অবশ্যই সামঞ্জস্যপূর্ণ হতে হবে।

বিধি

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

পরীক্ষার মামলা

এখানে ব্যবহৃত অক্ষরগুলি হল ()⍴, আপনার সেগুলি আপনার নির্বাচিত অক্ষরগুলি দিয়ে প্রতিস্থাপন করা উচিত।

⍴                          -> ⍴
⍴                          -> ⍴
⍴⍴                         -> ⍴⍴
⍴⍴⍴                        -> ⍴⍴⍴
⍴⍴⍴⍴                       -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴            -> ⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴⍴))))))
⍴⍴⍴⍴⍴(⍴⍴⍴)⍴⍴(⍴(⍴⍴⍴)⍴⍴⍴)⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴((⍴⍴⍴)⍴(⍴(⍴(⍴⍴⍴)(⍴⍴⍴))(⍴⍴⍴)))))
(⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)            -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
(⍴⍴⍴)(⍴⍴⍴)⍴⍴⍴              -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
⍴⍴(⍴)⍴⍴                    -> ⍴⍴(⍴⍴⍴)
((⍴⍴))                     -> ⍴⍴
⍴⍴((⍴⍴))⍴⍴                 -> ⍴⍴((⍴⍴)⍴⍴)

এই চ্যালেঞ্জটি স্যান্ডবক্সে পোস্ট করা হয়েছে। প্রয়োজনীয় সুবিধা থাকে, তাহলে আপনি স্যান্ডবক্স পোস্ট দেখতে পারেন এখানে


2
আমি মনে করি সম্পূর্ণরূপে পরিষ্কারের চেয়ে ফুলি একটি ভাল শিরোনাম ।
অ্যাডম


@ অ্যাডাম আমি এই রেফারেন্সের উত্তরটি আশা করেছিলাম, যদিও এটি অনেকগুলি উত্সাহ পাবে না;)
এরিক আউটগলফার

@ অ্যাডম শিরোনামের স্পষ্টতই অংশটি আপনাকে বোঝায় যে অনাবন্ধিত বন্ধনী বন্ধ করতে হবে to আপনি যখন কোনও চ্যালেঞ্জের উত্তর দেন তখন পুরোপুরি এমন কিছু আপনি করার কথা ছিল; পি
এরিক দ্য আউটগল্ফার

এটা কি সত্য যে এই কাজটি সর্বদা আদর্শবান হয়ে থাকবে?
এসোলং ফলমূল

উত্তর:


7

এপিএল (ডায়ালগ ক্লাসিক) , 71 68 65 63 বাইট

0{⍵≡⍕⍵:⍵⋄⍬≡⍵:'⍬'1=≢⍵:⍺∇⊃⍵⋄3≥≢⍵:⍺⌽')(',⍣⍺∊1∇¨⍵⋄⍺∇¯3(↓,∘⊂1∇↑)⍵}⍎

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

অক্ষর আমি ইনপুট / আউটপুট জন্য বেছে নেওয়া হয়েছে হয় '(', ')'এবং '⍬'

এই সমাধানটি নিজেই একটি এপিএল ট্রেন।

ইনপুটটিকে এমনভাবে পার্স করে যেন এটি কোনও নেস্টেড অ্যারে - খালি সংখ্যার ভেক্টর ( ) গাছ হিসাবে পাতা হিসাবে একটি গাছ ।

ডিএফএন (অর্থাত্ ল্যাম্বদা - { }) গাছটি পুনরাবৃত্তভাবে অনুসরণ করে এবং এটি একটি সঠিক বন্ধনীযুক্ত স্ট্রিংয়ে রূপান্তর করে। বাম আর্গুমেন্ট নিয়ন্ত্রণ করে যদি প্রয়োজন হয় তবে বর্তমান স্তরে যুক্ত করা উচিত কিনা whether

Dfn সঠিক যুক্তির ভিত্তিতে নিম্নলিখিত কেসগুলি পরিচালনা করে:

  • যদি এটি ইতিমধ্যে একটি স্ট্রিং ( ⍵≡⍕⍵) থাকে তবে এটি ফিরিয়ে দিন

  • যদি তা হয় তবে চরটি ফিরিয়ে দিন'⍬'

  • যদি এটি একটি সিঙ্গলটন হয় তবে কেবল আরও গভীর খনন করুন ( পুনরাবৃত্ত কলের প্রতীক)

  • যদি তার দৈর্ঘ্য ≤3, আইটেম এবং পারিপার্শ্বিক প্রতিটি recurse হয় ()যদি প্রয়োজন হয় তাহলে

  • অন্যথায়, 3-লেজের জন্য পুনরাবৃত্তি করুন, 3-পুচ্ছ ব্যতীত সমস্তগুলি প্রস্তুত করুন এবং আবার পুনরাবৃত্তি করুন


63 টি অক্ষরের মতো দেখতে বেশিরভাগটি ইউনিকোড। কোন অক্ষর এনকোডিং এর জন্য 63 বাইট তৈরি করে? আমি এটি ইউটিএফ 8 এ 141 বাইট তৈরি করি।
কোরি



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

3

পাইথন 2 , 224 208 204 বাইট

-16 বাইটস মিঃ এক্সকোডারকে -4 বাইট ধন্যবাদ ওভেসকে ধন্যবাদ

r=str.replace
p='p'
def c(l):
 while len(l)>3:l=l[:-3]+(l[-3:],)
 return l and map(c,l)or l
print r(r(r(r(r(`c(eval(r(r(r(input(),'(p)',p),p,'[],'),')','),')))`,'[]',p),*'[('),*'])'),' ',''),',','')[1:-1]

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস চেষ্টা করে দেখুন

কোডটি 3 টি বড় ধাপে বিভক্ত করা যায়:
ইনপুটটিকে নেস্টেড তালিকায় রূপান্তর করা এবং প্রতিস্থাপন করা (p)->p। একক ফাংশন pএকটি খালি তালিকা দ্বারা প্রতিস্থাপন করা হবে।

eval(r(r(r(input(),'(p)',p),p,'[],'),')','),'))

বর্তমান তালিকায় "3 বা তার চেয়ে কম" বিধি প্রয়োগ করতে এবং সর্ব-তালিকাতে নিজেকে কল করতে একটি পুনরাবৃত্ত ফাংশন।

def c(l):
 while len(l)>3:l=l[:-3]+(l[-3:],)
 return l and map(c,l)or l

পছন্দসই আউটপুট বিন্যাসে ফর্ম্যাট করতে প্রচুর প্রতিস্থাপন

r(r(r(r(r(`c(...)`,'[]',p),*'[('),*'])'),' ',''),',','')[1:-1]


1
এটি সরল করে না ((pp))(বা p((pp))p)।
মার্টিন ইন্ডার

2

সিজেম , 56 বাইট

এপিএলকে মারধর!

lW%~]]]{{_,{K_,({~}|}&}%{_,3>}{3/(aa\+:~}w}:K~~`1>W<W%S/

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

এটি কাজ করে (আমি মনে করি) এবং কেন আমার কোন ধারণা নেই ...

ইনপুট অক্ষর ][Tজন্য ()⍴, এবং আউটপুট অক্ষর ][0জন্য ()⍴(হ্যাঁ, এটা মানে তারা কি আপনি আশা থেকে বিপরীত হয়; উদাহরন স্বরূপ, আপনি মধ্যে পাস পারে TTT]TT[T]TTTT]TTT[[TT)।

উচ্চ-স্তরের ওভারভিউ

প্রোগ্রামটি পিছনের দিকে ইনপুট নিয়ে কাজ করে, কারণ এটি আরও সুবিধাজনক। ইনপুট পার্স করার জন্য, আমরা সিজেমের পার্সারটি উত্তোলন করি - ইনপুটটি বিপরীত ও সম্পাদন করে ইনপুটটির (পিছনের দিকে) পার্সড ফর্ম সরবরাহ করে।

তারপরে আমরা একটি পদ্ধতি সংজ্ঞায়িত করি KKআমাদের জমা দেওয়ার জন্য বেশিরভাগ কাজ করে এবং এটি নিম্নলিখিত হিসাবে কাজ করে:

  • ইনপুট অ্যারেটি শূন্য এবং মজাদার সাব-অ্যারেগুলির মিশ্রণ হবে। উপ-অ্যারেগুলি সনাক্ত করুন এবং পুনরাবৃত্তভাবে Kতাদের প্রয়োগ করুন। ফলাফলটি অন্য অ্যারে হওয়া উচিত এবং যদি এই অ্যারেটিতে কেবল একটি একক উপাদান থাকে তবে এটি আনপ্যাক করুন (এটি অপ্রয়োজনীয় প্রথম বন্ধনীর হাত থেকে মুক্তি পায়)।
  • যতক্ষণ না ফলাফলের তিনটির বেশি উপাদান রয়েছে, ততক্ষণ তার প্রথম তিনটি গোষ্ঠী করুন (এটি শেষ তিনটি নয়; মনে করুন ইনপুটটি পিছনের দিকে প্রক্রিয়াধীন হচ্ছে) একক তালিকায় অন্তর্ভুক্ত।
  • ফলাফলটি ফিরিয়ে দিন।

ইনপুটটিতে প্রয়োগ Kকরে আমরা ইনপুটটির সঠিকভাবে প্রথম বন্ধনীযুক্ত আকারটি পাই (কেবলমাত্র লক্ষণীয় বিষয় হ'ল আমরা আসলে ইনপুটটিকে একটি একক তালিকায় আবৃত করি এবং পরে এটি মোড়ক করি; এর কারণটি হ'ল আমরা স্নিপেটটি চাই যা সিঙ্গলেটগুলি আনপ্যাক করে শীর্ষ স্তরের প্রোগ্রামে প্রয়োগ করতে, এবং কেবল এটির উপ-অ্যারে নয়)। এরপরে, আমরা আমাদের ফলাফল পেতে কিছু ন্যূনতম বিন্যাস প্রয়োগ করি।

গল্ফ বিট জন্য কিছু ব্যাখ্যা

আমি যে গল্ফটির জন্য সবচেয়ে বেশি গর্বিত তা হল ,পূর্ণসংখ্যা এবং অ্যারেগুলির মধ্যে চেক সম্পাদন করতে।

  • শীর্ষ অফ স্ট্যাক একটি পূর্ণসংখ্যা হয় তাহলে এন , ,পরিসীমা উত্পন্ন [0..n) । যেহেতু আমরা কেবলমাত্র পূর্ণসংখ্যার মুখোমুখি হব 0এটি আমাদের সর্বদা খালি তালিকা দেয় []যা মিথ্যা।
  • শীর্ষ-স্ট্যাকটি যদি একটি অ্যারে হয় তবে ,এর দৈর্ঘ্যটি নেয় takes যেহেতু আমাদের মুখোমুখি হওয়া সমস্ত অ্যারেগুলি খালি থাকবে না, এটি সর্বদা আমাদের একটি ইতিবাচক পূর্ণসংখ্যা দেয় যা সত্য।

আর একটি গল্ফ যা আগ্রহী হতে পারে তা হ'ল আমি অ্যারের প্রথম তিনটি উপাদানকে গোষ্ঠীকরণের জন্য ব্যবহার করি; এটি আমার "ট্যুরিং সম্পূর্ণ ভাষার দোভাষী কোড গল্ফ" জমা দেওয়ার মতোই । সিজেমের কাছে অ্যারে দুটি টুকরো টুকরো করার ছোট্ট উপায় নেই (আপনি প্রথম অংশটি টুকরো টুকরো করার চেষ্টা করতে পারেন এবং তারপরে অন্য অংশটি মূল অ্যারে এবং সূচকটি স্ট্যাকের উপরে রাখার পরেও খুব ভাল কাজ করে না) , সুতরাং আমি পরিবর্তে যা করি তা ব্যবহার হয় 3/, যা কোন অ্যারেকে 3 এর ব্লকগুলিতে ভাগ করে দেয় I আমি তারপরে প্রথম উপাদানটি পপআপ করতে পারি (, অ্যারেতে দু'বার গুটিয়ে রাখতে পারি aa, এবং তারপরে তালিকার শুরুতে আবার যুক্ত করতে পারি \+। আমরা অ্যারেতে দু'বার মোড়ানোর কারণটি হ'ল আমাদের একটি স্তরটি বন্ধ করতে হবে :~, যেহেতু আমরা কেবলমাত্র অ্যারের বাকী অংশগুলিকেও বিভাগে বিভক্ত করেছি।


নিতপিক: এটি বিল্টিন ছাড়া এপিএলকে পরাজিত করে
এরিক আউটগল্ফার

@ এরিকথ আউটগল্ফার ফেয়ার যথেষ্ট।
এশালং ফল

0

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

i='a';f=s=>s==(s=s[R='replace'](/\((\w+)\)/,(q,t)=>(f[q=i+=0]=f(t),q)))&&s==(s=s[R](/(?!^)((a0+|p){3})$/,"($1)"))?s[R](/a0+/g,t=>`(${f[t]})`):f(s)
<textarea cols=80 id=I>ppp(pp)p(pppp(ppp))pp</textarea><br>
<button onclick=O.innerText=f(I.value)>Run</button><br>
<pre id=O></pre>

ব্যবহার ()p, আপনি আলাদা অক্ষর ব্যবহার করলেও আপনি কেবল pশেষের দিকে পরিবর্তন করতে পারেন ।

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