সত্যের সারণী দেওয়া, একটি স্ট্যাকাইলোগিক প্রোগ্রাম আউটপুট করুন যা এটি সন্তুষ্ট করে


17

স্ট্যাকাইলোগিক একটি প্রোগ্রামিং ভাষা যা আমি পূর্ববর্তী চ্যালেঞ্জের মধ্যে দিয়েছিলাম: স্ট্যাকাইলোগিক রান করুন । সম্পূর্ণ বিবরণ এবং উদাহরণের জন্য সেই পোস্টটি পড়ুন, তবে এটি কীভাবে প্যারাফ্রেসড কাজ করে তা এখানে:

স্ট্যাকাইলজিক ইনপুটটির জন্য 0'গুলি' নেয় এবং 1একক 0 বা 1সমাপ্তির পরে আউটপুট দেয় ।

একটি প্রোগ্রামে লাইন থাকে যা কেবলমাত্র অক্ষর 01?পাশাপাশি <লাইনগুলির একের শেষে থাকে। লাইনস খালি রাখা হতে পারে এবং সঙ্গে সঙ্গতিপূর্ণ <অন্তত একটি থাকতে হবে 0, 1অথবা ?এটা আগে।

এখানে একটি নমুনা প্রোগ্রাম যা দুটি বিটের NAND গণনা করে :

1
?<
11
?
0

প্রোগ্রামের প্রতিটি লাইনকে স্ট্যাক হিসাবে বিবেচনা করা হয়, বামদিকে নীচে এবং ডানদিকে শীর্ষ। স্পষ্টতই, কোনও প্রোগ্রামের প্রথম লাইনের আগে এবং শেষ লাইনের পরে একটি খালি স্ট্যাক (অর্থাত্ খালি লাইন) থাকে।

<, কার্সার নামে চিহ্ন স্ট্যাক শুরু করার জন্য যখন একটি প্রোগ্রাম চালানো হয়। মৃত্যুদন্ড কার্যকর হিসাবে নিম্নলিখিত:

  1. কর্সারটি বর্তমানে নির্দেশ করছে এমন স্ট্যাকের বাইরে শীর্ষ অক্ষরটি পপ করুন।

    • চরিত্রটি যদি হয় ?তবে ব্যবহারকারীকে একটি 0বা একটির জন্য অনুরোধ করুন 1এবং অভিনয় করুন যেন এটি চরিত্র।
    • চরিত্রটি যদি হয় 0তবে কার্সারটিকে একটি স্ট্যাক আপ করে নিন (বর্তমান লাইনের উপরে লাইনে)।
    • চরিত্রটি যদি হয় 1তবে কার্সারটিকে একটি স্ট্যাক নীচে সরান (বর্তমান লাইনের নীচে লাইনে)।
  2. যদি স্ট্যাকটি কার্সারটিতে চলে যায় তবে এটি ফাঁকা হয়, সর্বশেষ মানটি একটি স্ট্যাক (সর্বদা একটি 0বা 1) থেকে পপড আউটপুট করুন এবং প্রোগ্রামটি শেষ করুন।

  3. অন্যথায়, যদি স্ট্যাকটি কার্সারটি সরানো হয় তবে এটি খালি নয়, পদক্ষেপ 1 এ ফিরে যান এবং প্রক্রিয়াটি পুনরাবৃত্তি করুন।

এই চ্যালেঞ্জটির জন্য উপলব্ধি করার মূল বিষয়টি হ'ল সমস্ত স্ট্যাকাইলোগিক প্রোগ্রামগুলি সত্যের টেবিলে সমান । কিছু বুলিয়ান মানগুলির পূর্বনির্ধারিত সংখ্যার ইনপুট এবং ঠিক একটি বুলিয়ান হ'ল নির্ধারিত ফলাফল deter

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

বেস কেস

দুটি 0 ইনপুট সত্যের টেবিলগুলি সর্বদা আউটপুট 0বা হয় এমন টেবিলগুলি 1। এই টেবিলগুলির স্ট্যাকাইলোগিক সমতুল্য 0<এবং 1< যথাক্রমে।

সূচক পদক্ষেপ

ধরে নিই স্ট্যাকাইলোগিক যে কোনও এন-ইনপুট সত্যের সারণীটি অনুকরণ করতে পারে। এম = এন + 1 দিন

একটি এম-ইনপুট টেবিল, টি, দুটি এন-ইনপুট সারণি, টি 0 এবং টি 1 হিসাবে প্রকাশ করা যেতে পারে , অতিরিক্ত অতিরিক্ত ইনপুট বিট বি যখন বি 0 হয়, তখন টি 0 এর ফলাফল ব্যবহৃত হয়। বি যখন 1 হয়, তখন টি 1 এর ফলাফল ব্যবহৃত হয়।

উদাহরণস্বরূপ, সিউডোকোডের সাথে সম্পর্কিত 3-ইনপুট সত্যের টেবিল

if B:
    result = x OR y
else:
    result = x NAND y

হয়

B x y | result
0 0 0 | 1
0 0 1 | 1
0 1 0 | 1
0 1 1 | 0
1 0 0 | 0
1 0 1 | 1
1 1 0 | 1
1 1 1 | 1

যা নান্দের জন্য দুটি 2 ইনপুট সত্য টেবিল এবং বা মিউজিং বিট বি দিয়ে একে অপরের উপরে সজ্জিত is

এস 0 এবং এস 1 টি স্ট্যাকাইলোগিক প্রোগ্রাম হোন যা যথাক্রমে টি 0 এবং টি 1 কে সন্তুষ্ট করে (আমরা এগুলি প্রথম অনুমানের ভিত্তিতে জানি)। টি এসকে সন্তুষ্ট করে এমন প্রোগ্রাম এস এর পরে তৈরি করা যেতে পারে:

[lines of S0 excluding the cursor, with 0 appended to all lines below the cursor]
?<
[lines of S1 excluding the cursor, with 1 appended to all lines above the cursor]

এই বিন্যাসটি কার্যকরভাবে প্রথম ইনপুট বিটের (লাইন থেকে ) উপর ভিত্তি করে এস 0 এবং এস 1 এর মধ্যে ম্যাক্স করে ?<। যদি এটি হয় 0তবে কার্সারটি যুক্ত 00 এর আসল কার্সার অবস্থানে এস 0 এর উপরে উঠে যাবে, যা খালি স্ট্যাকের সাহায্যে শীর্ষ এবং নীচে সীমাবদ্ধ থাকবে এবং এইভাবে আসল এস 0 এর সাথে একরকম চলবে । তেমনিভাবে, যদি 1ইনপুট হয় তবে কার্সারটি 1'র ডাউন ডাউন এস 1 ' এর কার্সার অবস্থানে যাবে এবং এটি চালিয়ে যাবে যেমন এটি একা ছিল।

উদাহরণস্বরূপ, OR এবং NAND এর জন্য স্ট্যাকাইলোগিক প্রোগ্রামগুলি

?
?<

এবং

1
?<
11
?
0

এগুলি একীকরণ করা যায়

if B:
    result = x OR y
else:
    result = x NAND y

তাই ভালো:

1
?
110
?0
00
0
?<
?1
?

সুতরাং, কোনও সত্যের টেবিল স্ট্যাকাইলোগিক প্রোগ্রাম দ্বারা সিমুলেটেড করা যায়।

চ্যালেঞ্জ

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা 2 এন বুলিয়ান মানগুলির একটি তালিকা আকারে একটি এন ইনপুট ট্রুথ টেবিল (এন> 0) নেয় যা বাইনারি ক্রমে টেবিলের আউটপুটগুলি উপস্থাপন করে।

যে কোনও যুক্তিসঙ্গত ইনপুট ফর্ম্যাট ঠিক আছে। যেমন একটি ওআর সত্যের টেবিলের জন্য

x y | OR
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1

ইনপুটগুলির এই স্টাইলগুলির যে কোনওটি ভাল হবে:

0111

0, 1, 1, 1

0
1
1
1

[False, True, True, True]

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

উদাহরণস্বরূপ, যদি ইনপুটটি হয় 11100111তবে একটি বৈধ আউটপুট হবে

1
?
110
?0
00
0
?<
?1
?

তবে আরও অনেকে আছেন।

বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।

আপনার যদি কোনও অনুবাদকের প্রয়োজন হয় তবে মূল স্ট্যাকাইলজিক চ্যালেঞ্জটি দেখুন ।


আমরা এনকে দ্বিতীয় ইনপুট হিসাবে নিতে পারি?
ফাঁস নুন

প্রয়োজন হলে @LakyNun হ্যাঁ (বা 2 ^ এন)
ক্যালভিনের

উত্তর:


8

পাইথ, 53 বাইট

L?tb,lehJyMc2bsX0.e.e+W>_Wk-Yhb0ZkebJ\?,0]`hbjXF+yQ\<

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

এটি স্ট্যাকাইলোগিকের মধ্যে কীভাবে স্বেচ্ছাসেবী সত্যের টেবিলগুলি প্রয়োগ করা যায় তার চ্যালেঞ্জে বর্ণিত সিস্টেমটির সঠিক বাস্তবায়ন। আমরা কেবল সত্যের টেবিলটি অর্ধেকে কেটে ফেলি, এটি পুনরাবৃত্তভাবে প্রয়োগ করি এবং তারপরে যথাযথ হিসাবে 0 এবং 1 যুক্ত করি।

এটি একটি পুনরাবৃত্ত ফাংশন সংজ্ঞায়িত করে, যার রিটার্ন মান [1, ['0', '?', '1']], যেখানে প্রথম সংখ্যাটি পয়েন্টারের অবস্থান এবং বাকীটি স্ট্যাকাইলোগিক প্রোগ্রাম।

L?tb,lehJyMc2bsX0.e.e+W>_Wk-Yhb0ZkebJ\?,0]`hbjXF+yQ\<
                                                         Q = eval(input())
L?tb,lehJyMc2bsX0.e.e+W>_Wk-Yhb0ZkebJ\?,0]`hb
L                                                 def y(b): return
 ?tb                                              if b[1:] (base case on false)
                                      ,0]`hb      else: [0, str([0])]
                                                  then:
           c2b                                    Cut the input in half
         yM                                       Map y over the halves
        J                                         Store that in J
    ,leh                                          The cursor position is the length 
                                                  of the body of the first function
                 .e                 J             enum-map, where k is the index
                                                  and b is the value, over J
                   .e             eb              enum-map, Y is the index and
                                                  Z is the value, over body of b
                     +W         Zk                Add to Z (line) k (the overall 
                                                  index, 0 or 1) conditional on
                          -Yhb                    Y (line index) - cursor
                       _Wk                        Negated if k
                      >       0                   > 0
               X0                    \?           Add '?' to the first element
              s                                   Concatenate, giving the body

jXF+yQ\<
    yQ      Call the above on the input
   +  \<    Append a '<'
 XF         Splat the 3 element list into the 'append-at' function,
            adding the curson in the right place
j           Join on newlines and print.

ঠিক আছে ... আমি আমার সমাধানটি শুধরানোর জন্য ঘরে ফিরে গিয়েছিলাম ...
লিকি নুন

3

পাইথন 3, 352 208 205 বাইট

এটি এখনও খুব অবারিত এবং আমি পরে একটি ব্যাখ্যা যুক্ত করার চেষ্টা করব। কিছু সংশোধন করার পরে, আমি 144 147 বাইট অপসারণ করতে সক্ষম হয়েছি ।

f=lambda x,l=len,r=range:'\n'.join(*x)if l(x)<2 else f([[x[i][j]+['0',''][j<=l(x[i])//2]for j in r(l(x[i]))]+[['?','?<'][l(x)<3]]+[x[i+1][j]+['1',''][j>=l(x[i])//2]for j in r(l(x[i]))]for i in r(0,l(x),2)])

একটি ফাংশন fযা সত্যের টেবিলের মানগুলির ফর্মটির বুলিয়ানগুলির তালিকা হিসাবে ইনপুট নেয় ['1','1','1','0','0','1'...], যেখানে '1'সত্য এবং মিথ্যা হয় এবং '0'স্ট্যাকাইলোগিক প্রোগ্রাম দেয়।

আইডিয়নে চেষ্টা করে দেখুন

আপনি যদি একটি উত্পাদিত প্রোগ্রাম পরীক্ষা করতে চান তবে আপনি গামার কর্পস এর উত্তল দোভাষীটি এখানে ব্যবহার করতে পারেন ।

কিভাবে এটা কাজ করে

এটি একটি পুনরাবৃত্ত ফাংশন এবং প্রশ্নে বর্ণিত সূক্ষ্ম পদ্ধতি ব্যবহার করে।

শূন্য- সূচকযুক্ত পুনরাবৃত্তি স্তরে a, ফাংশনটি n/2 a+1তালিকাভুক্ত ইনপুট প্রোগ্রামগুলি থেকে ইনপুট স্ট্যাকাইলোগিক প্রোগ্রামগুলি তৈরি করে n a। তালিকার সাথে দুটি প্রোগ্রামের সমস্ত সংলগ্ন জোড়া যোগ করে এটি করা হয় ?; যেহেতু কার্সার সর্বদা প্রতিটি উপাদান প্রোগ্রামের মাঝামাঝি উপাদান থাকে, তাই যুক্ত হওয়া প্রোগ্রামগুলির প্রতিটি লাইনকে পুনরুক্ত করে প্রয়োজনীয় সংযোজন 0বা 1সম্পাদন করা যেতে পারে এবং বর্তমান লাইনটির সূচক কম বা সমান / বৃহত্তর হলে সংযোজন করা যাবে যথাযথ হিসাবে মধ্যম সূচক থেকে সমান বা সমান। তালিকায় যদি মাত্র দুটি প্রোগ্রাম থাকে তবে পরবর্তী পুনরাবৃত্ত কলটি চূড়ান্ত প্রোগ্রামটি দেবে; যেহেতু এটির জন্য একটি কার্সার প্রয়োজন, পরিবর্তে যোগদানের পরে এটি ঘটে ?<

যখন তালিকাটির দৈর্ঘ্য রয়েছে 1, তখন তালিকায় অবশ্যই পুরো প্রোগ্রাম সহ একটি মাত্র উপাদান থাকতে হবে। সুতরাং, প্রোগ্রামের সমস্ত লাইন একটি নতুন লাইনে যোগ দেওয়া হয়েছে, এবং তারপরে ফিরে আসবে।

একটি উদাহরণ এটি চিত্রিত করতে সহায়তা করে:

Take the input ['1', '1', '1', '0', '0', '1', '1', '1'].

Level  Return value

0  [['1', '?', '1'], ['1', '?', '0'], ['0', '?', '1'], ['1', '?', '1']]
1  [['1', '?', '10', '?', '11', '?', '0'], ['0', '?', '10', '?', '11', '?', '1']]
2  [['1', '?', '10', '?', '110', '?0', '00', '?<', '01', '?1', '101', '?', '11', '?', '1']]
3  '1\n?\n10\n?\n110\n?0\n00\n?<\n01\n?1\n101\n?\n11\n?\n1'

which when printed gives:

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