থার্ড ফ্ল্যাক!


19

এই চ্যালেঞ্জটি এপ্রিল 2018 এর লটএম চ্যালেঞ্জের অংশ হিসাবে পোস্ট করা হয়েছিল


মস্তিষ্ক-ফ্ল্যাক একটি টিউরিং-টারপিট ভাষা যা পিপিসিজিতে এখানে বেশ খ্যাতি অর্জন করেছে। ভাষা স্মৃতির দুই স্ট্যাকগুলি সুরারোপিত করা হয়, কিন্তু একটি "গোপন" তৃতীয় স্ট্যাক আবিষ্কৃত হয় দ্বারা Wh উইজার্ড এ , চিন্তা ব্রেন-বিমানবিধ্বংসী কামান প্রোগ্রামের কিছু মজার নতুন উপায় সৃষ্টি করে।

সুতরাং, এই দরিদ্র লুকানো তৃতীয় স্ট্যাককে আরও দৃশ্যমানতা দেওয়ার বিষয়ে কী? আসুন এমন একটি ভাষা তৈরি করুন যেখানে তৃতীয় স্ট্যাকটির এটির প্রাপ্য স্বীকৃতি রয়েছে! এখানে আমি আপনাকে তৃতীয়-ফ্ল্যাক উপস্থাপন করছি ।

ভাষা

তৃতীয়-ফ্ল্যাકમાં কেবল একটি স্ট্যাক রয়েছে, যাকে তৃতীয় স্ট্যাক বলা হয়। অপারেটর একই ভাবে তারা ব্রেন-বিমানবিধ্বংসী কামান না তৃতীয় স্ট্যাক কাজ করে, কিন্তু এখানে নেই [], {}, <>nilads এবং কোন {...}একসংখ্যা (তাই একটি তৃতীয় বিমানবিধ্বংসী কামান প্রোগ্রামে শুধুমাত্র গ্রাহ্য অক্ষর ()[]<>)। এখানে প্রতিটি অপারেটর যা করেন তা এখানে (উদাহরণগুলির সাথে তালিকার তৃতীয় স্ট্যাকের প্রতিনিধিত্ব করা হবে যেখানে শেষ উপাদানটি স্ট্যাকের শীর্ষে রয়েছে):

  • ()তৃতীয়-ফ্লাকের মধ্যে কেবলমাত্র দুটি অক্ষরের অপারেটর। এটি তৃতীয় স্ট্যাকের শীর্ষকে ১ দ্বারা বৃদ্ধি করে Example উদাহরণ: [1,2,3][1,2,4]

  • (, [, <: সমস্ত খোলার প্রথম বন্ধনী যে আগের কেস দ্বারা আচ্ছাদিত করা হয় না একটি ধাক্কা 0তৃতীয় স্ট্যাকে। উদাহরণ: [1,2,3][1,2,3,0]

  • )তৃতীয় স্ট্যাক থেকে দুটি উপাদান পপ করে এবং তাদের যোগফল পিছনে ঠেলে দেয়। উদাহরণ: [1,2,3][1,5]

  • ]তৃতীয় স্ট্যাক থেকে দুটি উপাদান পপ করে এবং দ্বিতীয় থেকে প্রথমটি বিয়োগের ফলাফলটিকে পিছনে ঠেলে দেয়। উদাহরণ: [1,2,3][1,-1]

  • >তৃতীয় স্ট্যাক থেকে একটি উপাদান পপ করে। উদাহরণ [1,2,3][1,2]

এবং ভাষাটির অন্যান্য নিয়মগুলি এখানে:

  • মৃত্যুদন্ডের শুরুতে তৃতীয় স্ট্যাকটিতে কেবল একটি মাত্র 0 থাকে।

  • কোনও প্রোগ্রাম খালি রাখা []বা <>ভিতরে রাখা নিষিদ্ধ (তৃতীয়-ফ্ল্যাঙ্কের শব্দার্থবিজ্ঞানের অনুসরণ করে তারা যেভাবেই হোক না কেন, তবে মস্তিষ্ক-ফ্ল্যাঙ্কে তাদের প্রকৃত অর্থ এখানে রয়েছে যা এখানে পুনরায় তৈরি করা সম্ভব নয়)।

  • প্যারেন্টিহিসগুলি সর্বদা ভারসাম্যপূর্ণ হওয়া দরকার, প্রোগ্রামের শেষে ক্লিয়ারিং বন্ধনী অনুপস্থিত হতে পারে except উদাহরণ হিসাবে, [()<(()একটি বৈধ তৃতীয়-ফ্ল্যাক প্রোগ্রাম (এবং প্রোগ্রামের শেষে তৃতীয় স্ট্যাকটি হবে [1,0,1])।

  • একটি প্রোগ্রামে কেবল ছয়টি অনুমোদিত অক্ষর থাকতে পারে ()[]<>। প্রোগ্রামগুলি খালি খালি থাকার গ্যারান্টিযুক্ত।

দ্রষ্টব্য: এটি পূর্ববর্তী বিধি দ্বারা বোঝানো হয়েছে যে আপনাকে খালি স্ট্যাক থেকে পপ করতে হবে এমন পরিস্থিতিতে আপনাকে মোকাবেলা করতে হবে না।

চ্যালেঞ্জ

সরল, তৃতীয়-ফাঁকের জন্য একটি অনুবাদক লিখুন। আপনার প্রোগ্রাম অবশ্যই ইনপুট হিসাবে একটি তৃতীয়-ফ্ল্যাক প্রোগ্রাম গ্রহণ করবে এবং প্রোগ্রামের শেষে আউটপুট হিসাবে তৃতীয় স্ট্যাকের অবস্থানে ফিরে আসবে।

আপনার আউটপুট ফর্ম্যাটটি ততক্ষন নমনীয় যেহেতু এটি থেকে তৃতীয় স্ট্যাকের অবস্থাটি নির্বিঘ্নে পড়া সম্ভব এবং একই সংখ্যাটি সর্বদা একইভাবে এনকোড করা থাকে (এটি কেবল এইভাবে বলার উপায় যে কোনও আউটপুট ফর্ম্যাট এটি একটি স্পষ্ট উপায় নয়) ঠকানোর চেষ্টা করা ভাল is

আপনার আউটপুট পছন্দটি যতক্ষণ সংখ্যাকে পরিচালনা করতে পারে ততক্ষণ সীমাবদ্ধ করতে পারে যতক্ষণ এটি চ্যালেঞ্জকে তুচ্ছ করে না (যেহেতু এটি একটি ডিফল্ট লুফোল হবে )।

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

প্রতিটি পরীক্ষার ক্ষেত্রে প্রথম লাইনটি ইনপুট এবং দ্বিতীয় লাইনের আউটপুট স্ট্যাকটি সংখ্যার একটি স্থান বিভাজিত তালিকা হিসাবে প্রতিনিধিত্ব করে যেখানে স্ট্যাকের শীর্ষটি সর্বশেষ উপাদান is

[()<(()
0 1 0 1

[((((()()()()()))
0 0 0 5

((([()][()][()])))
-3

[<<(((()()()())(((((
0 0 0 0 0 4 0 0 0 0 0

[()]<(([()])><[()]
-1 0 -1

(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()()
718 2

স্ট্যাকটি 0 দিয়ে শুরু করা হয়? অন্যথায় [()]এই নিয়ম ভঙ্গ করে যে খালি স্ট্যাক থেকে পপিংয়ের জন্য আমাদের চিন্তা করার দরকার নেই
জো কিং

1
@ জোকিং ইয়েপ: "মৃত্যুদন্ড কার্যকর করার সময় তৃতীয় স্ট্যাকটিতে কেবল একটি মাত্র 0 থাকে"। হয়তো আমার সেই অংশটি কিছুটা হাইলাইট করা উচিত, আমি ভয় পেয়েছি এটি খুব সহজেই মিস করা সম্ভব হত।
লিও

ওফস, আমি জানি না আমি কীভাবে এটি মিস করেছি
জো কিং

7
ক্রস আউট ই এখনও ই।
গম উইজার্ড

2
যদি কেউ এটি দেখতে না পান eতবে এখানে ক্রস আউট রয়েছে ।
ব্যবহারকারী 202729

উত্তর:



4

রেটিনা 0.8.2 , 64 48 46 বাইট

\(\)
_
[([<]
¶
+1`¶(.*)\)|(.*)¶\2]|¶.*>
$1
%`_

এটি অনলাইন চেষ্টা করুন! নীচে থেকে উপরে স্ট্যাক আউটপুট। শুধুমাত্র অ-নেতিবাচক পূর্ণসংখ্যার সাথে কাজ করে এবং শেষ পরীক্ষার কেসটি খুব ধীর, সুতরাং লিঙ্কটিতে কেবল তিনটি পরীক্ষার কেস অন্তর্ভুক্ত। ব্যাখ্যা: স্ট্যাকটি স্পষ্টতই প্রোগ্রামের আগে আগে, তাই এটি খালি স্ট্রিং হিসাবে শুরু হয়, যা একটি একক শূন্যকে উপস্থাপন করে। ()Nilad একটি পরিণত হয় _, যা ইউনারী গণনা করতে ব্যবহৃত হয় যখন অন্যান্য খোলা বন্ধনী নতুন লাইন যা স্ট্যাক হিসাবে তারা সম্মুখীন হয় একটি শূন্য ধাক্কা পরিণত হয়। নিকট বন্ধনীগুলি একবারে একবারে প্রক্রিয়া করা হয় যাতে স্ট্যাকটি সঠিক হয়; )পূর্ববর্তী সম্পর্কে newline মোছা হয়, দুটি উপাদান একসঙ্গে শীর্ষ যোগ ]শীর্ষ উপাদান মুছে ফেলে এবং স্ট্যাক পূর্ববর্তী উপাদান থেকে এটা মিলে যায় এভাবেই বিয়োগ, এবং>শুধু শীর্ষ উপাদান মুছে দেয়। অবশেষে স্ট্যাকটি দশমিক রূপান্তরিত। সম্পাদনা: 2 লিট সংরক্ষিত @ লিওকে ধন্যবাদ


কিসের $3জন্য? (দুর্দান্ত উত্তর, যাইহোক!)
লিও

@ লিও এটি পূর্বের গল্ফের একটি বাম-ওভার। এটি সন্ধানের জন্য ধন্যবাদ!
নীল

4

পাইথন 3 , 145 144 132 122 116 109 104 বাইট

লিও -7 বাইট ধন্যবাদ!

এবং - লিনকে 5 ধন্যবাদ!

s=[0]
for i in input().replace('()',' '):s+=i in']>) 'and(i<'!'or(2-ord(i)%5)*s.pop())+s.pop(),
print(s)

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

সুন্দর মান বাস্তবায়ন যদিও এখন এতটা পঠনযোগ্য নয়। আমি হতাশ হয়েছি যদিও আমি শুরু এবং শেষ বন্ধনীগুলির মধ্যে যাচাই করার জন্য আরও একটি ছোট উপায় আবিষ্কার করতে পারি না।

ওয়ান-লাইনারগুলিতে কিছু প্রচেষ্টা:

  • 124 বাইট (বেনামে ফাংশন):

    lambda c:[s.append(i in']>) 'and(i<'!'or~-']>)'.index(i)*s.pop())+s.pop())or s for s in[[0]]for i in c.replace('()',' ')][0]
  • 115 বাইট (পুরো প্রোগ্রাম):

    s=[0];[s.append(i in']>) 'and(i<'!'or~-']>)'.index(i)*s.pop())+s.pop())for i in input().replace('()',' ')];print(s)

সংযোজন বিরক্তিকরভাবে প্লেইন অ্যাসাইনমেন্টের চেয়ে দীর্ঘ


~-']>)'.index(i)(2-ord(i)%5)4 বাইট সংরক্ষণ করতে পারে ।
লিন

2

রুবি , 98 91 বাইট

->s{a=[i=0];s.chars{|c|a<<("([<"[c]?s[i,2]["()"]?1:0:a.pop*~-"]>)".index(c)+a.pop);i+=1};a}

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

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

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




1

আর , 182 177 বাইট

function(P){for(k in utf8ToInt(gsub("\\(\\)",7,P))%%8){if(k%in%0:4)F=c(0,F)
if(k==7)F[1]=F[1]+1
if(k==1)F=c(F[2]+F[3],F[-3:0])
if(k==5)F=c(F[2]-F[1],F[-2:0])
if(k==6)F=F[-1]}
F}

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

স্ট্যাকটি ফিরিয়ে দেয়, যেখানে স্ট্যাকের শীর্ষটি প্রথম এবং স্ট্যাকের নীচে সর্বশেষ।

অদলবদল ()সঙ্গে 7এবং তারপর কোড পয়েন্ট 8 mod স্বতন্ত্র সাংখ্যিক মান, যা সহজ এবং কাজ golfier স্ট্রিং চেয়ে সঙ্গে আছে পেতে নির্ণয় করে।

আরে ভেক্টরের শুরুতে কাজ করা গল্ফিয়ার, সুতরাং আমরা স্ট্যাকটি সেভাবেই তৈরি করি।

তারপরে এটি একটি )বা কখন দেখায় k==1এটি স্ট্যাকের শীর্ষে একটি অতিরিক্ত শূন্য যুক্ত করে এটি গল্ফিয়ার যুক্ত করে এটি সরিয়ে দেয়।



1

সিলোন, 285 266 বাইট

function f(variable String c){variable Integer[]s=[0];value o=>[s[0]else nothing,s=s.rest][0];void u(Integer i)=>s=[i,*s];while(c!=""){if(c[0:2]=="()"){u(1);c=c.rest;}switch(c[0])case(')'){u(o+o);}case(']'){u(-o+o);}case('>'){noop(o);}else{u(0);}c=c.rest;}return s;}

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

(লিওর পরামর্শের কারণে 19 বাইট সংরক্ষণ করা হয়েছে))

ফর্ম্যাট এবং মন্তব্য:

// Interpreter for ThirdFlak
// Question:    /codegolf//q/163242/2338
// This answer: /codegolf//a/163403/2338
//
// This function takes the code as a string, and returns the value
// of the stack as a sequence of Integers.
function f(variable String c) {
    // stack, in the beginning just a single 0.
    // Top element of the stack is the first, because push + pop is easier this way.
    variable Integer[] s = [0];
    // pop – used like an Integer variable (not a function – this saves the `()`), but has side effects.
    value o =>
        // `s[0]` is the first element of the stack. We tell the compiler
        // that it is non-null (otherwise we'll get an error at run time)
        // using the `else nothing`. `s.rest` is `s` without its first element.
        // Both together are wrapped into a 2-tuple, of which we then take just
        // the first element, to have both together in an expression instead
        // the longer way using an accessor block with a temporary variable and a return.
        // value o {
        //   value r = s[0] else nothing;
        //   s = s.rest;
        //   return r;
        // }
        [s[0] else nothing, s = s.rest][0];
    // push
    void u(Integer i) =>
        // a tuple enumeration, using the spread argument.
        s = [i, *s];
    // the main loop
    while (c != "") {
        if (c[0:2] == "()") {
            // »`()` is the only two-characters operator in Third-Flak. It increases the top of the third stack by 1.«
            // As `)` alone adds the two top elements together, we can just push a one here, and let the handling for `)` do the rest.
            u(1);
            c = c.rest;
        }
        switch (c[0])
        case (')') {
            // »`)` pops two elements from the third stack and pushes back their sum.«
            u(o + o);
        }
        case (']') {
            // »`]` pops two elements from the third stack and pushes back the result of subtracting the first from the second.«
            // As the o written first is the first one, we can't write this as a subtraction.
            u(-o + o);
        }
        case ('>') {
            // »`>` pops an element from the third stack.«
            // `o;` alone is not a valid statement, so we pass it to the `noop` function.
            noop(o);
        }
        else {
            // all other valid code characters are `(`, `[`, `<`, which all just push a 0.
            u(0);
        }
        c = c.rest;
    }
    return s;
}

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


আমি সত্যই সিলোন জানি না, তবে সম্ভবত আপনি সুইচের প্রথম কেসটি সরিয়ে ফেলতে পারেন এবং অন্য অংশটি সমস্ত খোলার বন্ধনীগুলি পরিচালনা করতে ব্যবহার করতে পারেন :)
লিও

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