সম্পাদনা: আপনারা কেউ কেউ সন্দেহ করেছেন, সরকারী দোভাষীতে একটি বাগ ছিল: এর মধ্যে রচনার .
ক্রমটি বিপরীত হয়েছিল। আমার দোভাষীর দুটি সংস্করণ ছিল এবং আমি এখানে ভুলটি ব্যবহার করেছি। উদাহরণগুলিও এই ভুল সংস্করণের জন্য লেখা হয়েছিল। আমি ভান্ডারটিতে দোভাষী এবং নীচের উদাহরণগুলি স্থির করেছি। বর্ণনাটিও >
কিছুটা অস্পষ্ট ছিল, তাই আমি এটি স্থির করেছি। এছাড়াও, এত দীর্ঘ সময় নেওয়ার জন্য ক্ষমা প্রার্থনা করে, আমি কিছু বাস্তব জীবনের জিনিসপত্রের মধ্যে পড়েছিলাম।
সম্পাদনা 2: আমার দোভাষীর প্রয়োগে একটি বাগ .
ছিল যার উদাহরণগুলিতে প্রতিফলিত হয়েছিল (তারা অপরিবর্তিত আচরণের উপর নির্ভর করেছিল)। বিষয়টি এখন ঠিক হয়ে গেছে।
ভূমিকা
শিফট হ'ল বেশ কয়েক বছর আগে তৈরি করা তবে আজ প্রকাশিত। এটি স্ট্যাক-ভিত্তিক, তবে হাস্কেলের মতো স্বয়ংক্রিয়ভাবে কার্চিংও রয়েছে।
সবিস্তার বিবরণী
শিফটে দুটি ডেটাটাইপ রয়েছে:
- কার্যাবলী, যা একটি স্বেচ্ছাসেবী ইতিবাচক আর্গুমেন্ট (ইনপুট সংখ্যা), এবং যা আউটপুট একটি তালিকা ফিরে। উদাহরণস্বরূপ, এমন একটি ফাংশন যা এর একমাত্র ইনপুটটির সদৃশ হয় সেটির আরতি 1 থাকে এবং এমন একটি ফাংশন যা তার দুটি ইনপুটগুলিকে অদলবদল করে আর্টি 2 থাকে।
- ফাঁকা, যা সবগুলি অভিন্ন এবং ফাংশন না হওয়া ছাড়া অন্য কোনও উদ্দেশ্য নেই।
একটি শিফট প্রোগ্রামে শূন্য বা ততোধিক কমান্ড থাকে, যার প্রতিটিই একক ASCII অক্ষর। মোট 8 টি কমান্ড রয়েছে:
!
( প্রযোজ্য ) একটি ফাংশন পপf
এবং একটি মানx
স্ট্যাক থেকে, এবং প্রযোজ্যf
করারx
। তাহলেf
arity 1 আছে, তালিকাf(x)
স্ট্যাক সামনে যোগ করা হয়। যদি এর অভেদ্যতা থাকে তবেn > 1
একটি নতুন-(n-1)
তদন্ত ফাংশনটিg
স্ট্যাকের দিকে ঠেলে দেওয়া হয়। এটি ইনপুট এবং রিটার্ন নেয় ।x1,x2,...,xn-1
f(x,x1,x2,...,xn-1)
?
( ফাঁকা ) স্ট্যাকের একটি ফাঁকা ঠেলাঠেলি করে।+
( ক্লোন ) স্ট্যাকের দিকে ধাক্কা দেয় এমন একটি আনারি ফাংশন যা এর ইনপুটটিকে নকল করে তোলে: কোনও মানx
ম্যাপ করা হয়[x,x]
।>
( শিফট ) স্ট্যাক করার জন্য একটি ইউনারী ফাংশন যা একটি লাগে পাহাড় জমেn
-ary ফাংশনf
, এবং একটি ফেরৎ(n+1)
-ary ফাংশনg
যে তার প্রথম আর্গুমেন্ট উপেক্ষা করেx
কলf
অবশিষ্ট বেশী, এবং tacksx
ফলাফলের সামনে। উদাহরণস্বরূপ,shift(clone)
একটি বাইনারি ফাংশন যা ইনপুট নেয়a,b
এবং ফেরত দেয়[a,b,b]
।/
( কাঁটাচামচ ) স্ট্যাকে একটি তিন ফাংশন যা তিন ইনপুট নেয় পাহাড় জমেa,b,c
, এবং আয়[b]
যদিa
একটি ফাঁকা, এবং[c]
অন্যথায়।$
( কল ) স্ট্যাকে push কর্মের একটি বাইনারি ফাংশন একটি ফাংশন পপ যেf
এবং একটি মানx
, এবং প্রযোজ্যf
করারx
ঠিক হিসাবে!
আছে।.
( চেইন ) একটি বাইনারি ফাংশন স্ট্যাকের দিকে ধাক্কা দেয় যা দুটি ফাংশন পপ করেf
এবংg
তাদের রচনাটি ফিরিয়ে দেয়: একটি ফাংশনh
যা একই ধরণের arity থাকেf
এবং যা সাধারণত ইনপুটগুলি গ্রহণf
করে, তাদের জন্য প্রযোজ্য , এবং তারপরে ফলাফলের জন্য পুরোপুরি প্রয়োগg
হয় (কলগুলি) এটি এর আধ্যাত্মিকতা হিসাবে যতবার নির্ধারিত হয়)f
এর ফলাফলের অবশিষ্টাংশের আউটপুট থেকে অব্যবহৃত আইটেমগুলি সহh
। উদাহরণস্বরূপ, অনুমান যেf
একটি বাইনারি ফাংশন যে তার দ্বিতীয় যুক্তি ক্লোনস, এবংg
হয় কল । যদি স্ট্যাকটি থাকে[f,g,a,b,c]
এবং আমরা তা করি.!!
, তবে এটিতে রয়েছে[chain(f,g),a,b,c]
; আমরা যদি!!
পরবর্তী কাজ করি, তবেf
প্রথমেa,b
উত্পাদন করা হয় ,[a,b,b]
এর পরেg
এর প্রথম দুটি উপাদানগুলিতে প্রয়োগ করা হয় কারণ এর উদারতা 2 হয়, উত্পাদন হয়[a(b),b]
এবং স্ট্যাকটি শেষ পর্যন্ত হবে[a(b),b,c]
।@
( বলুন ) একটি অবিচ্ছিন্ন ফাংশন ঠেলে দেয় যা কেবল তার ইনপুট দেয় এবং প্রিন্ট করে0
যে এটি ফাঁকা থাকলে, এবং1
যদি এটি কোনও ফাংশন ছিল।
মনে রাখবেন যে সমস্ত কমান্ডগুলি !
কেবল স্ট্যাকের জন্য একটি মানকে চাপ দেয়, ইনপুট সঞ্চালনের কোনও উপায় নেই এবং যে কোনও কিছুই আউটপুট দেওয়ার একমাত্র উপায় ব্যবহার করা হয় @
। একটি প্রোগ্রাম কমান্ডগুলি একে একে মূল্যায়ন করে, 0
এস বা 1
এস মুদ্রণ করে যখনই "বলুন" ডাকা হয় এবং বেরিয়ে আসে। এখানে বর্ণিত কোনও আচরণ (একটি ফাঁকা প্রয়োগ, দৈর্ঘ্যের 0 বা 1 স্ট্যাক প্রয়োগ করা, ফাঁকা জায়গায় "চেইন" কল করা ইত্যাদি) সংজ্ঞায়িত নয়: দোভাষী তার বিপর্যয় ঘটতে পারে, নিঃশব্দে ব্যর্থ হতে পারে, ইনপুট চাইতে বা যা কিছু করতে পারে whatever
কাজটি
আপনার কাজ হ'ল শিফ্টের জন্য দোভাষী লিখুন। এটি STDIN, কমান্ড লাইন, বা ফাংশন আর্গুমেন্ট থেকে একটি শিফ্ট প্রোগ্রামকে ব্যাখ্যা করার জন্য নেওয়া উচিত এবং STDOUT এ মুদ্রণ করা উচিত বা 0
এর এবং 1
এর ফলাফল (সম্ভবত অসীম) আউটপুট ফিরিয়ে আনতে হবে । যদি আপনি কোনও ফাংশন লিখেন তবে আপনাকে অবশ্যই কোনও উপায়ে অসীম দৈর্ঘ্যের আউটপুটগুলি অ্যাক্সেস করতে সক্ষম হতে হবে (পাইথনে জেনারেটর, হাস্কেলের অলস তালিকা ইত্যাদি)। বিকল্পভাবে, আপনি অন্য ইনপুট, একটি সংখ্যা নিতে পারেন n
এবং n
আউটপুটটির কমপক্ষে অক্ষরগুলি যদি এটির চেয়ে দীর্ঘ হয় তবে ফিরে আসতে পারেন n
।
সর্বনিম্ন বাইট গণনা জয়, এবং মান লুফোলগুলি অনুমোদিত নয়।
পরীক্ষার কেস
এই শিফট প্রোগ্রামটি মুদ্রণ করে 01
:
?@!@@!
বাম থেকে শুরু করে: একটি ফাঁকা ধাক্কা ধাক্কা বলে , তারপর আবেদন বলে ফাঁকা করতে। এই ফলাফল 0
। তারপর, ধাক্কা বলে দুইবার, এবং দ্বিতীয় আবেদন বলে প্রথম। এই ফলাফল 1
।
এই প্রোগ্রামটি চিরতরে লুপ করে, কোনও আউটপুট উত্পাদন করে না:
$+.!!+!!
কল এবং ক্লোন পুশ করুন , তারপরে তাদের কাছে চেইন প্রয়োগ করুন ( চেইন একটি বাইনারি ফাংশন হওয়ায় আমাদের দুটি !
সেকেন্ড দরকার )। এখন স্ট্যাকটিতে একটি ফাংশন রয়েছে যা একটি যুক্তি নেয়, এটি সদৃশ করে এবং দ্বিতীয়টিতে প্রথম অনুলিপিটি কল করে। এর সাথে , আমরা এই ফাংশনটির সদৃশ এবং এটিকে নিজে কল করি।+!!
এই প্রোগ্রামটি মুদ্রণ 0010
:
?@$.++>!.!!.!!.!!!!+?/!!!@!@>!!!
একটি ফাঁকা ঠেলা এবং বলুন । তারপরে, একটি বাইনারি ফাংশন রচনা করুন যা তার দ্বিতীয় যুক্তিকে b
অনুলিপি করে, তারপরে প্রথমটি অনুলিপি করে a
এবং এটি নিজের সাথে রচনা করে, তারপরে b
, ফিরে আসার অনুলিপিটিতে রচনাটি প্রয়োগ করে [a(a(b)),b]
। এটি বলার জন্য এবং ফাঁকাতে প্রয়োগ করুন , তারপরে স্ট্যাকের মধ্যে থাকা দুটি উপাদানকে বলুন ।
এই প্রোগ্রাম প্রিন্ট 0
। আপনি এতে যুক্ত হওয়া প্রতিটিটির !!!
জন্য এটি একটি অতিরিক্ত প্রিন্ট করে 0
।
?@+$>!>!+>!///!!>!>!.!!.!!.!!+!!!!
একটি ফাঁকা ঠেলা এবং বলুন । তারপরে, একটি বার্ষিক ফাংশন রচনা করুন যা f,g,x
ইনপুট এবং রিটার্ন হিসাবে গ্রহণ করে [f,f,g,g(x)]
। সেই ফাংশনটি ক্লোন করুন এবং এটিকে নিজেই বলুন , এবং ফাঁকা করুন। এই অ্যাপ্লিকেশনটি স্ট্যাক পরিবর্তন করে না, তাই আমরা যতবার চাই ফাংশনটি আবারও প্রয়োগ করতে পারি।
এই প্রোগ্রামটি অসীম অনুক্রমকে মুদ্রণ করে 001011011101111...
, যেখানে 1
সর্বদা এর সংখ্যা সর্বদা এক দ্বারা বৃদ্ধি পায়:
@?/!@>!??/!!>!+.!!.!!.!!.+>!.!!$$$$+$>!>!$>!>!+>!$>!>!>!+>!>!///!!>!>!>!.!!.!!.!!.!!.!!.!!.!!.!!.!!.!!+!!!!!
ভান্ডারটিতে একটি টীকাযুক্ত সংস্করণ রয়েছে।
f(x1, x2, ..., xn)
এবং g(y1, y2, ..., ym)
। কলিং .
উভয়কে পপ করে এবং একটি ফাংশনকে ধাক্কা দেয় h(z1, z2, ..., zn)
। এখন আপনি ধীরে ধীরে এটি দিয়ে কারি করে এই সমস্ত যুক্তিগুলি খেয়ে ফেলতে পারেন !
। এই n
ধরনের অ্যাপ্লিকেশনগুলির পরে , বাকী ফাংশনটির কেবল একটি যুক্তি ছিল, এবং সেই সময়ে এটি গণনা করে f(z1, z2, ..., zn)
(অর্থাত্ f
আপনি যে সমস্ত যুক্তি দিয়েছিলেন সেগুলি প্রয়োগ করা হয়েছে), যা কিছু নতুন মানকে ঠেলে দেয় এবং তারপরে অবিলম্বে m
স্ট্যাক থেকে মানগুলি গ্রহণ করে এবং g
তাদেরকে কল করে।
.
মার্টিন বর্ণিত ঠিক তেমনভাবে কাজ করে, মান ব্যতীত যদি f
কম তালিকার একটি তালিকা ফেরত দেয় m
তবে ফলাফলটি সংজ্ঞায়িত হয় (রচনাটি সার্থকতা রাখে n
, তাই এটি স্ট্যাক থেকে আরও যুক্তি খেতে পারে না)। মূলত, এর আউটপুটটি f
একটি অস্থায়ী স্ট্যাক হিসাবে ব্যবহৃত হয়, যার উপর ব্যবহারের সময় g
ধাক্কা দেওয়া হয় এবং প্রয়োগ করা হয় এবং এর ফলাফলটি মূল স্ট্যাকটিতে যুক্ত হয়। m
!