Prindeal (উচ্চারিত Prin-Dee-আল ) একটি নতুন গূঢ় : প্রোগ্রামিং ভাষা মাত্র চারটি কমান্ড আছে যা PR int- এ , মধ্যে crement , ডি crement , এবং আল আইএএস । এর ন্যূনতমতা থাকা সত্ত্বেও, চারটি কমান্ড চতুরতার সাথে একত্রিত করে প্রিনডিয়লে জটিল গাণিতিক ক্রিয়াকলাপ করা যেতে পারে।
এই কোড গল্ফ চ্যালেঞ্জের মধ্যে আপনার কাজটি হ'ল সংক্ষিপ্ততম প্রোগ্রামটি লিখুন যা প্রিনডিল কোড চালাতে পারে।
অনুমানটি দীর্ঘ তবে আমি যতটা সম্ভব পরিষ্কার করার চেষ্টা করেছি এবং আমি বিশ্বাস করি যে আপনি যদি প্রিনডিল শেখার চেষ্টা করেন তবে আপনি এটি বেশ মার্জিত বলে মনে করতে পারেন!
প্রিনডিলের ব্যাখ্যা দিচ্ছি
প্রাক-প্রক্রিয়াকরণ
একটি প্রিনডিল প্রোগ্রামের ব্যাখ্যা দেওয়ার আগে এই বিষয়গুলি থেকে এই ক্রম থেকে সরানো প্রয়োজন:
#
লাইনটি শেষ হওয়ার পরে কোনও চিহ্নের পরে এটি#
নিজেই। (এগুলি মন্তব্য।)- যে কোনও লাইনে শ্বেত স্পেস অনুসরণ করা।
- সম্পূর্ণ খালি লাইন।
উদাহরণস্বরূপ, প্রিনডিল প্রোগ্রাম
p cat #The next line has 7 trailing spaces.
p dog
#p mouse
মধ্যে প্রিপ্রোসেস করা হবে
p cat
p dog
এখান থেকে আমরা ধরে নেব এই প্রাক-প্রসেসিং পদক্ষেপটি সম্পন্ন হয়েছে।
ভেরিয়েবল
ভেরিয়েবলগুলি কীভাবে ব্যবহৃত হয় তা দেখানোর আগে আমাদের দ্রুত সংজ্ঞা দেওয়া দরকার।
ভেরিয়েবল (এবং ভেরিয়েবলের রেফারেন্স) হ'ল প্রিনডিল কমান্ডের যুক্তিগুলিতে যা প্রেরণ করা হয়। চলকগুলি সর্বদা গ্লোবাল থাকে , সুতরাং ভেরিয়েবলের পরিবর্তনগুলি যেখানেই ঘটে না কেন, সর্বত্র প্রতিফলিত হয়।
প্রতিটি পরিবর্তনশীল একটি অ-নেতিবাচক সালিসি-নির্ভুলতা পূর্ণসংখ্যার (0, 1, 2, 3, ...) ধারণ করে । ভেরিয়েবলগুলি প্রাক-প্রাথমিককরণের প্রয়োজন হয় না - তারা সর্বদা 0 ব্যবহার করা হয় বা ডাকা হওয়ার পরে সর্বদা 0 দিয়ে শুরু হয় ।
- একটি পরিবর্তনশীল নাম কারাকাস এবং আন্ডারস্কোর কোন খালি নয় এমন স্ট্রিংটি কোনো সংখ্যা দিয়ে শুরু হয় না হতে পারে [a-zA-Z_][0-9a-zA-Z_]*
এ Regex । এগুলি কেস সংবেদনশীল, তাই spiny_lumpsuck3r
এবং Spiny_lumpsuck3r
বিভিন্ন ভেরিয়েবল।
ফাঁসি
প্রিনডিল একটি অপরিহার্য প্রোগ্রামিং ভাষা। যখন একটি প্রিন্ডিল প্রোগ্রাম পরিচালিত হয় তখন এর স্টেটমেন্টগুলি উপরের থেকে নীচে থেকে ক্রমে কার্যকর হয় এবং তারপরে প্রোগ্রামটি শেষ হয়।
একটি প্রিন্ডিল প্রোগ্রামে প্রতিটি অ-ইন্ডেন্টেড লাইন হল একটি বিবৃতি যা একটি একক কমান্ড কার্যকর করতে জড়িত যা যুক্তি গ্রহণ করতে পারে বা নাও পারে।
ইনডেন্টড লাইনগুলি কেবলমাত্র ওরফে কমান্ডের পরে ঘটে । বিশেষত, একেক স্পেস সহ ঠিক তিনটি লাইন প্রতিটি উরফ কমান্ডের পরে ঘটে এবং এর একটি অংশ হিসাবে বিবেচিত হয়। সুতরাং ওরফে স্টেটমেন্টগুলি সত্যই চারটি লাইন দীর্ঘ। (এগুলি একটি লাইন হতে পারে, চারটি কেবল আরও বেশি পাঠযোগ্য))
অ- উরফ বিবৃতি
উপনাম বাদে, একটি প্রিন্ডিল প্রোগ্রামের প্রতিটি বিবৃতিতে ফর্ম রয়েছে:
[command name] [argument 1] [argument 2] [argument 3] ...
একটি স্বেচ্ছাসেবী যুক্তি থাকতে পারে (মোটেও কিছুই নয়)। প্রতিটি যুক্তি সর্বদা একটি পরিবর্তনশীল বা (যেমন আমরা ওরফে আলোচনা করার সময় দেখতে পাব ) একটি ভেরিয়েবলের একটি উল্লেখ ।
একবার মৃত্যুদন্ড কার্যকর করার পরে, প্রতিটি বিবৃতিতে ব্যর্থতা বা সাফল্য হিসাবে চিহ্নিত করা হয় যদি ত্রুটির মুখোমুখি হয়েছিল কি না তার উপর নির্ভর করে। (এটি কেবল তখনই গুরুত্বপূর্ণ যখন আমরা ওরফে ব্যবহার করতে পারি ))
অন্তর্নির্মিত প্রিন্ট , ইনক্রিমেন্ট এবং হ্রাস হ'ল উপরের ফর্মের বিবৃতি। তারা যা করে তা এখানে:
মুদ্রণটির কমান্ডের নাম রয়েছে
p
এবং এটি একটি যুক্তি গ্রহণ করে। এটি পাস করা ভেরিয়েবলের নাম মুদ্রণ করে এবং এর মান (দশমিকায়) "=" দ্বারা আলাদা হয়, তারপরে একটি নতুন লাইন। এটি সর্বদা সাফল্য হিসাবে চিহ্নিত করা হয় ।উদাহরণস্বরূপ, প্রিনডিল প্রোগ্রাম
p _MyVariable_321 p screaming_hairy_armadillo
আউটপুট হবে
_MyVariable_321 = 0 screaming_hairy_armadillo = 0
কারণ সমস্ত ভেরিয়েবল 0 থেকে শুরু হয় (সমান চিহ্নের আগে এবং পরে ফাঁকা স্থানগুলি আবশ্যক))
বর্ধনের কমান্ডের নাম রয়েছে
i
এবং একটি আর্গুমেন্ট নেয়। এটি ভেরিয়েবলের মান 1 বৃদ্ধি করেছে 1. এটি সর্বদা একটি সাফল্য হিসাবে পতাকাঙ্কিত হয় ..উদাহরণস্বরূপ, প্রোগ্রাম
i alpaca p alpaca i alpaca p alpaca
আউটপুট হবে
alpaca = 1 alpaca = 2
এর
alpaca
আগে কখনও অ্যাক্সেস না করা হলেও কীভাবে 0 থেকে 1 এ বাড়ানো হয়েছে তা দ্রষ্টব্য ।হ্রাসের কমান্ডের নাম রয়েছে
d
এবং এটি একটি যুক্তি নেয়। যদি ভেরিয়েবলটি পাস করা হয় ননজারো হয় তবে এর মান 1 দ্বারা হ্রাস হয় এবং বিবৃতিটিকে সাফল্য হিসাবে চিহ্নিত করা হয় । যদি ভেরিয়েবলটি 0 হয় তবে কিছুই করা হয় না এবং বিবৃতিটিকে ব্যর্থতা হিসাবে চিহ্নিত করা হয় ।উদাহরণস্বরূপ, প্রোগ্রাম
i malamute p malamute d malamute #success p malamute d malamute #failure p malamute d akita #failure p akita
আউটপুট হবে
malamute = 1 malamute = 0 malamute = 0 akita = 0
লক্ষ্য করুন যে মান 0 দিয়ে একটি ভেরিয়েবল হ্রাস হ'ল ব্যর্থতা তৈরির একমাত্র উপায় ।
ওরফে স্টেটমেন্ট ও বেনামে কমান্ড
ওরফে কমান্ড একটি বিশেষ সিনট্যাক্স এবং কারণ এটি নতুন কমান্ড সংজ্ঞায়িত করতে ব্যবহার করা যেতে পারে সবচেয়ে শক্তিশালী। ওরফে কমান্ড নাম a
এবং ওরফে বিবৃতি ফর্ম আছে:
a [name of new command]
[statement A]
[statement B]
[statement C]
যেখানে প্রত্যেকে যে [statement X]
কোনও নন- ওরফে স্টেটমেন্ট উপস্থাপন করে, অর্থাত ফর্মের সাথে কিছু [command name] [argument 1] [argument 2] [argument 3] ...
।
অ্যালাইজড কমান্ডের নাম হ'ল [name of new command]
বর্ণচিহ্নগুলি এবং আন্ডারস্কোরগুলির কোনও খালি খালি স্ট্রিং হতে পারে যা কোনও অঙ্কের সাথে শুরু হয় না - [a-zA-Z_][0-9a-zA-Z_]*
রেজেক্সে।
(এটি ভেরিয়েবল হিসাবে একই নামের তবে অ্যালাইজড কমান্ড এবং ভেরিয়েবলগুলি বিভিন্ন জায়গায় ব্যবহৃত বিভিন্ন জিনিস A কোনও পরিবর্তনকে কোনও খারাপ পরিণতি না দিয়ে কমান্ড হিসাবে একই নামকরণ করা যেতে পারে))
যখন একটি উপনাম বিবৃতি কার্যকর করা হয়, মূল চারটি p
i
d
a
কমান্ডের সাথে একটি নতুন কমান্ড যুক্ত হয় । নতুন কমান্ডটি [command name]
বিবৃতি হিসাবে ব্যবহার করা যেতে পারে এবং অন্যান্য নন- ওরফে কমান্ডের মতোই যুক্তি সহ কল করা যেতে পারে ।
যখন কোনও এলিয়াসেড কমান্ড নাম সহ একটি বিবৃতি কার্যকর করা হয়, তখন এর আসল উপন্যাসের বিবৃতি থেকে আরও দুটি বিবৃতি চালিত হয়:
[statement A]
সর্বদা চালানো হয়[statement B]
যদি চালানো হয়[statement A]
একটি ছিল সাফল্য[statement C]
[statement A]
একটি ব্যর্থতা যদি রান হয়
এ, বি, এবং সি স্টেটমেন্টগুলি সর্বদা অলসভাবে চালানো হয় , অর্থাৎ তারা চালানোর সময় ফ্লাইয়ে মূল্যায়ন করা হয়।
মৃত্যুদন্ড কার্যকর করার পরে, এলিয়াসড কমান্ড একই সাফল্য বা ব্যর্থতা পতাকা হিসাবে বি বা সি, যে কোন একটি কার্যকর করা হয়েছিল হিসাবে পতাকা হিসাবে চিহ্নিত করা হয় । ( ওরফে স্টেটমেন্টগুলিকে পতাকাঙ্কিত করার দরকার নেই যেহেতু তারা নিজের মধ্যে ঘটতে পারে না))
এলিয়াস উদাহরণ 1
বলুন আমরা একটি নতুন কমান্ড চাই যা ভেরিয়েবলকে
frog
দুবার বাড়িয়ে দেয় । এই ওরফে বিবৃতি এটি অর্জন করে:a increment_frog_twice i frog i frog d frog
বিবৃতি এ (
i frog
) সবসময় চলতে হয় এবং সবসময় একটি হিসাবে পতাকাঙ্কিত সাফল্য তাই বিবৃতি বি (i frog
) সবসময় চালানো হয় এবং পরিবর্তনশীলfrog
এইভাবে 2. দ্বারা মান বৃদ্ধি হয়increment_frog_twice
কমান্ড সবসময় একটি হিসাবে পতাকাঙ্কিত করা হয় বিজয় কারণ বিবৃতি বি সবসময় চালানো হয় এবং B সবসময় একটি হল সাফল্য । বিবৃতি সি (d frog
) কখনও চালানো হয় না।সুতরাং আউটপুট
a increment_frog_twice i frog i frog d frog p frog increment_frog_twice p frog
হবে
frog = 0 frog = 2
আমরা এই উদাহরণটিকে সাধারণীকরণ করতে পারি যাতে কোনও ভেরিয়েবল অ্যালিজেড কমান্ডকে একটি যুক্তি দিয়ে দুবার বাড়ানো যায়।
একটি উপনামের বিবৃতিতে ইতিবাচক পূর্ণসংখ্যা 1, 2, 3, ইত্যাদি 1 ম, 2 য়, 3 য়, ইত্যাদি উপস্থাপন করে যুক্তিগুলি অ্যালাইজড কমান্ডে প্রেরণ করা হয়। (এই যুক্তিগুলি প্লেইন ভেরিয়েবল বা ভেরিয়েবলের রেফারেন্স হতে পারে)) এই সংখ্যাগুলি কেবলমাত্র একটি উপন্যাসের বিবৃতিতে A, B, এবং C এর বিবৃতিতে উপস্থিত হতে পারে । তাদের অন্য কোথাও উপস্থিত হওয়া কোনও অর্থবোধ করে না।
এলিয়াস উদাহরণ 2
এটি সর্বশেষ উদাহরণটিকে সাধারণীকরণ করে - যে কোনও ভেরিয়েবল পাস হয়েছে
increment_twice
তা 2 দ্বারা বাড়ানো হবে কারণ1
এতে প্রথম আর্গুমেন্টে পাস হওয়া একটি রেফারেন্স:a increment_twice i 1 i 1 d 1 #never reached p toad increment_twice toad p toad
এই প্রোগ্রামের আউটপুট হবে
toad = 0 toad = 2
এরপরে আমরা আর একটি কমান্ড উপন্যাস করতে পারি যা দুটি যুক্তি গ্রহণ করে এবং
increment_twice
তাদের উভয়কে কল করে:a increment_twice i 1 i 1 d 1 #never reached a increment_both_twice increment_twice 1 increment_twice 2 d 1 #never reached increment_both_twice platypus duck p platypus p duck
এখানে আউটপুট হবে
platypus = 2 duck = 2
এটি উপলব্ধি করা জরুরী যে অ্যালাইজড কমান্ডগুলি পুনরাবৃত্ত হতে পারে, কারণ এখানেই তাদের আসল শক্তি রয়েছে। উদাহরণস্বরূপ, আমরা একটি কমান্ড তৈরি করতে পারি যা 0 তে পাস হওয়া কোনও ভেরিয়েবল সেট করে:
এলিয়াস উদাহরণ 3
set_to_zero
কমান্ড এক যুক্তি লাগে এবং 0 তার পরিবর্তনশীল সেট করে এবং একটি হিসাবে পতাকাঙ্কিত করা হয় বিজয় সম্পন্ন হলে ':a set_to_zero d 1 set_to_zero 1 i _dummy_ i oryx i oryx i oryx p oryx set_to_zero oryx p oryx
এই প্রোগ্রামের আউটপুট হবে
oryx = 3 oryx = 0
যা ঘটছে তা যখন
set_to_zero oryx
চালানো হয় তখনd 1
সাফল্যের সাথেoryx
3 থেকে 2 থেকে কমে যায়, তখনset_to_zero 1
তাকে বলা হয়, যাset_to_zero oryx
আবার কল করার মতো । সুতরাং প্রক্রিয়া পর্যন্ত পুনরাবৃত্তি করেd 1
একটি হল ব্যর্থতা , পুনরাবৃত্তির বাঁধন এবং বাড়ায়_dummy_
পরিবর্তনশীল তাই একটি সাফল্য উত্পাদিত হয়।
চ্যালেঞ্জ
একটি প্রোগ্রাম লিখুন যা প্রিনডিল কোড উপরোক্ত বর্ণিত ঠিক ঠিক সম্পাদন করতে পারে। স্টিডিন, কমান্ড লাইন বা একটি টেক্সট ফাইল হিসাবে প্রিন্ডিল কোডটি ধরুন। স্ট্যান্ডআউট বা আপনার ভাষার নিকটতম বিকল্পে প্রিন্ডিল প্রোগ্রামের আউটপুট প্রিন্ট করুন।
বিকল্পভাবে, আপনি কোডটি স্ট্রিং হিসাবে গ্রহণ করে এমন একটি ফাংশন লিখতে পারেন এবং আউটপুট স্ট্রিংটি মুদ্রণ করে বা ফেরত দেয়।
অতিরিক্ত হিসাবে, আপনি এটি ধরে নিতে পারেন:
- ইনপুট প্রিনডিল কোডটিতে কেবলমাত্র নিউলাইন এবং মুদ্রণযোগ্য এএসসিআইআই এবং (বিকল্পভাবে) এটি খালি রেখার সাথে শেষ হবে।
- ইনপুট কোডটি বৈধ প্রিনডিল হবে - ভালভাবে গঠিত এবং সিনট্যাক্টিক্যালি সঠিক।
- কোডটি চালানো কোনও অসীম লুপ তৈরি করবে না বা নির্দেশিত হয়নি এমন আদেশগুলি বা অবৈধ যুক্তিগুলির কোনও অবৈধ রেফারেন্স তৈরি করবে না।
- কমান্ড নাম
p
,i
,d
, এবংa
ওভার ওরফে করা হবে না। (আপনি ধরে নিতে পারবেন না যে ভেরিয়েবলগুলির এই নামগুলি থাকবে না))
এছাড়াও, আপনার ভেরিয়েবলের মানগুলি যথাযথভাবে স্বেচ্ছাসেবী-নির্ভুলতা পূর্ণসংখ্যার না হয় বলে কিছু যায় আসে না কারণ প্রায় 1000 এর চেয়ে কম সংখ্যক পরীক্ষা করা হবে। এটি ঠিক আছে যদি আপনার ভাষার পুনরাবৃত্তি সীমা থাকে (যেমন পাইথন ) যা আরও জটিল প্রিনডিল প্রোগ্রামগুলির মুখোমুখি হতে পারে যতক্ষণ না নীচের পরীক্ষার প্রোগ্রামটি কাজ করে।
পরীক্ষা প্রোগ্রাম
এখানে একটি বিশাল প্রিন্ডিল প্রোগ্রাম রয়েছে যা ডামি ভেরিয়েবলগুলি ( _
কনভেনশন দ্বারা শুরু করে) এবং অনেক সহায়ক সহায়ক ব্যবহারের মাধ্যমে সংযোজন, গুণ এবং এক্সপেনসেন্টেশনের ক্রিয়াকলাপ তৈরি করে :
#Command Definitions:
a s #flag as a success
i _
d _
d _
a f #flag as a failure
d _
d _
d _
a z #1 = zero
d 1
z 1
s
a n #1 = one
z 1
i 1
s
a move #2 += 1, 1 = zero
moveH 1 2
move 1 2
s
a moveH #move helper
d 1
i 2
f
a dupe #2 += 1, 3 += 1, 1 = zero
dupeH1 1 2 3
dupe 1 2 3
s
a dupeH1 #dupe helper
d 1
dupeH2 2 3
f
a dupeH2 #dupe helper
i 1
i 2
s
a copy #2 = 1
z 2
copyH 1 2
s
a copyH #copy helper
dupe 1 2 _copy
move _copy 1
s
a addTo #1 += 2
copy 2 _add
#testing comments #
move _add 1#in weird places # just because #
s
#it's a g##d idea
###
a add #1 = 2 + 3
#its a good idea
z 1
addH 1 2 3
s
##
#
a addH #add helper
#this is a comment
addTo 1 2 #as is this
addTo 1 3
s
a mul #1 = 2 * 3
mulH1 1 2
mulH2 1 3
s
a mulH1 #mul helper
z 1
copy 2 _mul
s
a mulH2 #mul helper
mulH3 1 2
mulH2 1 2
s
a mulH3 #mul helper
d _mul
addTo 1 2
f
a mulBy #1 *= 2
mul _mulBy 1 2
copy _mulBy 1
s
a pow #1 = 2^3
powH1 1 3
powH2 1 2
s
a powH1 #pow helper
n 1
copy 2 _pow
s
a powH2 #pow helper
powH3 1 2
powH2 1 2
s
a powH3 #pow helper
d _pow
mulBy 1 2
f
#Running Tests:
p A
p B
p C
n A #A = 1
n B #B = 1
add C A B #C = A + B = 1 + 1 = 2
p ____
p A
p B
p C
add B A C #B = A + C = 1 + 2 = 3
p ____
p A
p B
p C
mul d B C #d = B * C = 3 * 2 = 6
p ____
p d
mulBy d B #d = d * B = 6 * 3 = 18
p ____
p d
d A #A = A - 1 = 1 - 1 = 0
mulBy d A #d = d * A = 18 * 0 = 0
p ____
p d
pow A C B #A = C ^ B = 2 ^ 3 = 8
p ____
p A
p B
p C
pow A B C #A = B ^ C = 3 ^ 2 = 9
p ____
p A
p B
p C
pow C A B #C = A ^ B = 9 ^ 3 = 729
p ____
p A
p B
p C
(আপনি যদি এই কোডটি নিয়ে ঘুরে দেখেন তবে সচেতন হোন যে একই ভেরিয়েবলটিকে আর্গুমেন্ট হিসাবে একাধিকবার দেওয়া হলে অনেকগুলি কমান্ড ব্যর্থ হবে This এটি সহজেই ঠিক করা যায় তবে ফলাফল কোডটি দীর্ঘ is
আপনার প্রিনডিল ইন্টারপ্রেটার সঠিক আউটপুট উত্পাদন করতে সক্ষম হওয়া উচিত:
A = 0
B = 0
C = 0
____ = 0
A = 1
B = 1
C = 2
____ = 0
A = 1
B = 3
C = 2
____ = 0
d = 6
____ = 0
d = 18
____ = 0
d = 0
____ = 0
A = 8
B = 3
C = 2
____ = 0
A = 9
B = 3
C = 2
____ = 0
A = 9
B = 3
C = 729
স্কোরিং
বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী। টাইব্রেকার আগের জমাতে যায়।
ব্রাউনি বোনাস: প্রিনডিয়ালে একটি দুর্দান্ত প্রোগ্রাম লিখুন। আমি সংযোজন এবং গুণ প্রয়োগ করেছি, আপনি কি বিয়োগ বা বিভাগ করতে পারেন?
p
এবং তারপরেp p
, কোনটি 1 টি প্রিন্ট করবে, তাই না?