চ্যালেঞ্জ
আপনার চ্যালেঞ্জটি হ'ল লিসপ-জাতীয় ভাষার জন্য একজন দোভাষীকে ডিজাইন করা, যা এখান থেকে তৈরি করা হবে: জিএলিস্প । GLisp এর প্রোগ্রাম কোডটি নীচের আকারে বন্ধনীর সাহায্যে নির্বিচারে পরিমাণে নেস্টেড এক্সপ্রেশন নিয়ে গঠিত:
(func arg1 arg2 ...)
নোট করুন যে দোভাষীকে অবশ্যই বন্ধনী, ফাংশন এবং তর্কগুলির আগে এবং পরে এক্সট্রান্সিয়াস হোয়াইটস্পেস অক্ষরের জন্য মঞ্জুরি দিতে হবে।
প্রকারভেদ
আপনি চার ধরণের, পূর্ণসংখ্যা, তালিকা, বুলিয়ান এবং ফাংশন প্রয়োগ করবেন। পূর্ণসংখ্যা এবং বুলিয়ান মানগুলি তাদের নিজস্ব বাক্য গঠন সহ সুস্পষ্টভাবে উত্স কোডের মধ্যে sertedোকানো যেতে পারে। আপনার দোভাষীকে অবশ্যই ধরে নিতে হবে যে সংখ্যার অক্ষরগুলির একটি রান একটি পূর্ণসংখ্যা বোঝায় (স্পষ্টভাবে নেতিবাচক পূর্ণসংখ্যার সন্নিবেশ করার জন্য আপনাকে একটি সিনট্যাক্স প্রয়োগ করতে হবে না)। তোমার অনুবাদক এছাড়াও অনুমান করা আবশ্যক true
এবং false
বুলিয়ান মান মনোনীত হয়। ফাংশনগুলি ব্যবহারকারী দ্বারা সুস্পষ্টভাবে সংজ্ঞায়িত করা যায় না এবং সর্বদা একটি একক মান (একক মান হিসাবে যে কোনও দৈর্ঘ্যের গণনাগুলির তালিকা) ফেরত দেবে।
ক্রিয়াকলাপ
নিম্নলিখিত ফাংশনগুলি প্রয়োগ করা প্রয়োজন এবং এটি ফাংশন , আরটি ফর্ম্যাটটিতে রয়েছে । যদি একটি আরটিটি n
প্লাস চিহ্ন দ্বারা এগিয়ে যায়, তবে সেগুলি n
বা আরও আর্গুমেন্টকে বোঝায় । আপনি ধরে নিতে পারেন যে কোনও ফাংশনে প্রদত্ত সমস্ত আর্গুমেন্ট একই ধরণের, অন্যথায় নির্দিষ্ট না করে unless আপনি এটি ধরেও নিতে পারেন যে যদি কোনও ক্রিয়াকলাপটি কোনও ক্রিয়াকলাপী টাইপের জন্য নির্দিষ্ট না করা থাকে, তবে আপনি ধরে নিতে পারেন যে সেই ফাংশনের কোনও যুক্তি কখনই সেই ধরণের হবে না। নিম্নলিখিত চিত্রের মতো যুক্তিগুলি উল্লেখ করা হবে:
(func argument1 argument2 ... argumentn)
+ , 2+
- সমস্ত যুক্তি যদি পূর্ণসংখ্যার ধরণের হয় তবে আপনাকে অবশ্যই আর্গুমেন্টের যোগফলটি ফেরত দিতে হবে
- সমস্ত আর্গুমেন্ট যদি তালিকার ধরণের হয় তবে আপনাকে অবশ্যই আর্গুমেন্টের সংবর্ধনাটি ক্রমবর্ধমান ক্রমে ফিরে আসতে হবে (
arg1+arg2+ ...
) - যদি সমস্ত আর্গুমেন্ট বুলিয়ান ধরণের হয় তবে আপনাকে অবশ্যই যুক্তিগুলির ক্রম সমস্ত লজিকালটি ফিরিয়ে দিতে হবে
(+ 1 2 3 4 5) -> 15
(+ (list 1 2) (list 3 4)) -> (list 1 2 3 4)
(+ true true true) -> true
- , 2+
- সমস্ত যুক্তি যদি পূর্ণসংখ্যার ধরণের হয় তবে আপনাকে অবশ্যই আর্গুমেন্টের পার্থক্যটি ফিরিয়ে দিতে হবে (
arg1-arg2- ...
) - যদি সমস্ত আর্গুমেন্ট বুলিয়ান ধরণের হয় তবে আপনাকে অবশ্যই যুক্তিগুলির অনুক্রমের লজিক্যাল যেকোনটি দিতে হবে
(- 8 4 3) -> 1
(- 0 123) -> -123
(- true false false true false) -> true
- সমস্ত যুক্তি যদি পূর্ণসংখ্যার ধরণের হয় তবে আপনাকে অবশ্যই আর্গুমেন্টের পার্থক্যটি ফিরিয়ে দিতে হবে (
* , 2+
- সমস্ত যুক্তি যদি পূর্ণসংখ্যার ধরণের হয় তবে আপনাকে অবশ্যই যুক্তির পণ্যটি ফিরিয়ে দিতে হবে
- যদি একটি যুক্তি তালিকার ধরণের থাকে এবং অন্যটি পূর্ণসংখ্যার টাইপের হয় (আপনি ধরে নিতে পারেন যে এগুলি কেবলমাত্র প্রদত্ত আর্গুমেন্টই হবে), আপনাকে অবশ্যই বারবার আইটেমগুলির সাথে একটি নতুন তালিকা ফিরিয়ে দিতে হবে ।
arg1
arg2
(* 1 2 3 4 5) -> 120
(* (list 1 2 3) 2) -> (list 1 2 3 1 2 3)
/ , 2+
- সমস্ত যুক্তি যদি পূর্ণসংখ্যার ধরণের হয় তবে আপনাকে অবশ্যই আর্গুমেন্টের ভাগফলটি ফেরত দিতে হবে (
arg/arg2/ ...
) (আপনি ধরে নিতে পারেন যে বিভাগটি ধারাবাহিকভাবে সম্পন্ন হয়েছে এবং প্রতিটি পদক্ষেপের দশমিক অংশটি কাটা হয়েছে) - যদি একটি যুক্তি তালিকার ধরণের এবং অন্যটি ফাংশন টাইপের হয় তবে আপনাকে অবশ্যই প্রতিটি মানের সাথে মানচিত্র তৈরি করার পরে ফলাফলটি তালিকাটি ফিরিয়ে দিতে হবে
arg2
(/ 100 10 3) -> 3
(/ (list 1 2 3) inc) -> (list 2 3 4)
- সমস্ত যুক্তি যদি পূর্ণসংখ্যার ধরণের হয় তবে আপনাকে অবশ্যই আর্গুমেন্টের ভাগফলটি ফেরত দিতে হবে (
% , 2
- সমস্ত যুক্তি যদি পূর্ণসংখ্যার ধরণের হয় তবে আপনাকে অবশ্যই আর্গুমেন্টের মডুলাসটি ফিরিয়ে দিতে হবে
(% 4 2) -> 0
= , 2+
- সমস্ত আর্গুমেন্টের ধরণ এবং মান উভয়ই যদি এক হয় তবে আপনাকে অবশ্যই সত্য ফিরে আসতে হবে। অন্যথায়, মিথ্যা ফিরে।
(= 0 0 0) -> true
(= 0 false (list)) -> false
তালিকা , 0+
- প্রকার নির্বিশেষে আপনাকে অবশ্যই সমস্ত আর্গুমেন্টের একটি তালিকা ফেরত দিতে হবে। যদি কোনও যুক্তি না দেওয়া হয়, তবে আপনাকে অবশ্যই একটি খালি তালিকা ফিরিয়ে দিতে হবে
(list 3 4 (list 5)) -> (list 3 4 (list 5))
ইনক , 1
- যদি আর্গুমেন্টটি পূর্ণসংখ্যার ধরণের হয় তবে আপনাকে অবশ্যই একের দ্বারা পূর্ণসংখ্যার পূর্ণসংখ্যা ফেরত দিতে হবে
- যদি আর্গুমেন্ট তালিকার প্রকারের হয় তবে আপনাকে অবশ্যই তালিকাটি ঘড়ির কাঁটার বিপরীতে একক ঘোরানো উচিত
(inc 1) -> 2
(inc (list 1 2 3)) -> (list 3 1 2)
ডিস , ২
- যদি আর্গুমেন্টটি পূর্ণসংখ্যার ধরণের হয় তবে আপনাকে অবশ্যই এক এক করে পূর্ণসংখ্যাটি ফেরত দিতে হবে
- যদি আর্গুমেন্ট তালিকার ধরণের হয় তবে আপনাকে অবশ্যই তালিকাটি ঘোরার ঘড়ির কাঁটার বিপরীতে একক ঘোরানো উচিত
(dec 1) -> 0
(dec (list 1 2 3)) -> (list 2 3 1)
যদি , 3
- যদি কোনও প্রকারের তিনটি আর্গুমেন্ট দেওয়া হয় : সত্যতার মানটি যদি সত্য হয় তবে
arg1
ফিরেarg2
আসুন, অন্যথায় ফিরে আসুনarg3
(if (not (list 1)) 8 false) -> false
- যদি কোনও প্রকারের তিনটি আর্গুমেন্ট দেওয়া হয় : সত্যতার মানটি যদি সত্য হয় তবে
না , 1
- যদি কোনও ধরণের আর্গুমেন্ট দেওয়া হয়, এর সত্য মান
arg1
যদি মিথ্যা হয় তবে ফিরে যানtrue
, অন্যথায় ফিরে আসুনfalse
। (not (list)) -> true
- যদি কোনও ধরণের আর্গুমেন্ট দেওয়া হয়, এর সত্য মান
লেন , ২
- যদি তালিকার প্রকারের একটি আর্গুমেন্ট দেওয়া হয় তবে এর দৈর্ঘ্যটি ফিরিয়ে দিন
arg1
(len (list 4 2 true (list 3) (list))) -> 5
- যদি তালিকার প্রকারের একটি আর্গুমেন্ট দেওয়া হয় তবে এর দৈর্ঘ্যটি ফিরিয়ে দিন
সত্য সারণী
:, 0, (list), false -> false
যেখানে (list)
একটি খালি তালিকা বোঝায়। আর সব কিছু true
।
আপনার দোভাষী হ'ল একটি সম্পূর্ণ প্রোগ্রাম হতে পারে যা স্টিডিন বা কোনও ফাইল থেকে উত্স ইনপুট পড়বে বা এমন কোনও ফাংশন যা উত্সটিকে স্ট্রিং হিসাবে গ্রহণ করে এবং আউটপুট মানটি ফেরত দেয়।
তাহলে সাবেক নির্বাচন, জন্য আউটপুট পূর্ণসংখ্যার কেবল সংখ্যা, জন্য Booleans হয় true
বা false
, এবং তালিকার জন্য একটি স্থান বন্ধনী (যেমন। মধ্যে লেখা মান ক্রম পৃথক হয়েছে (1 2 3 4 (5 6 7))
-এর মানে (list 1 2 3 4 (list 5 6 7))
)।
যদি পরবর্তীটি বেছে নেওয়া হয় তবে মানটি অবশ্যই প্রয়োগের ভাষার অনুরূপ প্রকারে প্রত্যাবর্তন করতে হবে, বা যদি একই ধরণের কোনও উপস্থিত না থাকে তবে একটি কাস্টম প্রকার। তালিকাসমূহ যদি ভাষাটির নেই বিন্যাস বা ভেক্টর হিসেবে ফিরে যেতে পারে তালিকা ধরন, Booleans ভাষায় একটি বুলিয়ান টাইপ, অথবা যদি ভাষা তাদের সমর্থন করে না একটি কাস্টম প্রকার ফিরিয়ে দিতে হবে।
পরীক্ষার মামলা
(list 1 2 3 (list 4 5 true)) -> (1 2 3 (4 5 true))
(/ 4000 (+ 1 2 3 4 (* 5 8))) -> 80
(+ (not (- (len (list 5 6 7)) (/ 10 3))) true) -> true
(if ( len (list ) ) 4 (if (+ (= 8 8 8) (not (list 4))) 8 5)) -> 5
ব্যাখ্যা
- আপনার দোভাষী আপনি যে কোনওভাবেই অবৈধ ইনপুটটি মোকাবেলা করতে পারেন, তবে এটি অবশ্যই একটি ব্যতিক্রম ছুঁড়ে ফেলবে না (যদিও এটি কোনও ত্রুটি বার্তা প্রিন্ট করতে পারে এবং সহজেই প্রস্থান করতে পারে)
- কার্যকারিতা সর্বদা আর্গুমেন্টের বাম থেকে ডানদিকে মূল্যায়ন করবে
- অবৈধ ইনপুট হ'ল এমন কোনও ইনপুট যা সিন্টেক্সিকভাবে ভুল। এর মধ্যে মেলে না এমন বন্ধনী, শূন্য দ্বারা বিভাগ এবং আংশিক প্রয়োগিত ফাংশন (বোনাস না দিয়ে) অন্তর্ভুক্ত রয়েছে তবে এতে সীমাবদ্ধ নয়
- কারণ
=
, যদি মানগুলির কোনও আলাদা হয় বা প্রকারগুলির কোনও পৃথক হয় তবে ফিরে আসুনfalse
বোনাসেস
- আপনি আংশিক প্রয়োগিত ফাংশন সমর্থন করলে * 0.8 স্কোর করুন । উদাহরণস্বরূপ,
((+ 2) 3)
হিসাবে একই হবে(+ 2 3)
, কিন্তু যেমন জিনিস জন্য অনুমতি দেয়(/ (list 1 2 3) (+ 2))
। আপনি ধরে নিতে পারেন যে কোনও ফাংশন তার ন্যূনতম সংখ্যার চেয়ে কম আর্গুমেন্ট গ্রহণ করলে আংশিকভাবে প্রয়োগ করা হয় is - স্কোর * 0.85 আপনি যদি আর্গুমেন্টগুলি
if
ফেরত না দেওয়া হয় তবে তা প্রয়োগ না করে যদি তা মূল্যায়ন না করেন
এটি কোড-গল্ফ, সুতরাং সর্বনিম্ন বাইট গণনা সহ দোভাষী!
(+ 3 (if false 5))
? সাধারণভাবে বলতে গেলে, আসলে "কিছুই ফিরিয়ে দিচ্ছেন না"? পুনরায় যোগ করার জন্য আপনি কোনও ইউনিটের ধরণ উল্লেখ করেননি
(+ bool bool...)
লজিক্যাল অ্যান্ড এবং (- bool bool...)
লজিক্যাল ওআর? মানক রিং স্বরলিপিটি +
ও ও এ্যান্ড এর জন্য ব্যবহার করবে *
। ২. "অবৈধ ইনপুট" এর মতো বিষয়গুলি (/ 2 0)
কী সিন্ট্যাক্টিকভাবে সঠিকভাবে প্রচ্ছন্ন করার উদ্দেশ্যে করা হয়েছে ? ৩. কারণ =
, মানগুলি যদি একই রকম না হয় তবে এটি কি ফিরে আসা উচিত false
? ৪. সংজ্ঞাটি not
পিছনের দিকে উপস্থিত বলে মনে হয়। 5. টোকেনগুলি কী কী? আপনি বলছেন যে দোভাষীকে অবশ্যই অতিরিক্ত শ্বেতস্পেস পরিচালনা করতে হবে, তবে আপনি কোন সাদা স্থানের উপর নির্ভর করতে পারবেন তা বলবেন না। এই জাতীয় জটিল প্রশ্নের জন্য আপনার সত্যিকার অর্থে স্যান্ডবক্স ব্যবহার করা উচিত যাতে স্পেকটি পরীক্ষা করা যায়।
((+ 2 3) 4)
সমান 9
বা ত্রুটি? উল্লেখযোগ্যভাবে, ভার-আরগ ফাংশনগুলির জন্য, কখনই আবেদনটি আংশিক বিবেচনা করা উচিত তা স্পষ্ট নয়। এটি ((if true (+ 2 3) (- 5)) 4)
(if (not (array 1)) 8 false) -> false
?