চ্যালেঞ্জটি হ'ল যতক্ষণ সম্ভব কম অক্ষরে অক্ষরযুক্ত ল্যাম্বডা ক্যালকুলাসের জন্য একটি অনুবাদক লিখুন । আমরা টাইপযুক্ত ল্যাম্বডা ক্যালকুলাসটি নিম্নলিখিতভাবে সংজ্ঞায়িত করেছি:
বাক্য গঠন
নিম্নলিখিত তিন ধরণের অভিব্যক্তি রয়েছে:
একটি ল্যাম্বডা এক্সপ্রেশন ফর্ম রয়েছে
(λ x. e)
যেখানেx
কোনও আইনি পরিবর্তনশীল নাম এবংe
কোনও আইনি অভিব্যক্তি হতে পারে । এখানেx
প্যারামিটারe
বলা হয় এবং ফাংশন বডি বলা হয়।সরলতার স্বার্থে আমরা আরও বিধিনিষেধ যোগ করি যে
x
বর্তমানে একই নামের সাথে কোনও ভেরিয়েবল থাকা উচিত নয় । একটি ভেরিয়েবল স্কোপে থাকা শুরু হয় যখন এর নামটি এর মাঝে উপস্থিত হয়(λ
এবং.
এটি সংশ্লিষ্ট স্কোপ হতে থামে)
।- ফাংশন আবেদনপত্র হয়েছে
(f a)
যেখানেf
এবংa
আইনি অভিব্যক্তি রয়েছে। এখানেf
ফাংশনa
বলা হয় এবং আর্গুমেন্ট বলা হয়। - একটি ভেরিয়েবলের এমন ফর্ম রয়েছে
x
যেখানেx
আইনী ভেরিয়েবলের নাম।
শব্দার্থবিদ্যা
একটি যুক্তি যুক্তি দিয়ে ফাংশন বডিটিতে প্রতিটি পরামিতি প্রতিস্থাপন করে একটি ফাংশন প্রয়োগ করা হয়। আরো আনুষ্ঠানিকভাবে ফর্ম একটি অভিব্যক্তি ((λ x. e) a)
, যেখানে x
একটি পরিবর্তনশীল নাম এবং e
এবং a
এক্সপ্রেশন, মূল্যায়ণ (অথবা হ্রাস করা) অভিব্যক্তি হয় e'
যেখানে e'
প্রতিটি সংঘটন প্রতিস্থাপন ফল x
মধ্যে e
দিয়ে a
।
একটি সাধারণ ফর্ম একটি অভিব্যক্তি যা আরও মূল্যায়ন করা যায় না।
চ্যালেঞ্জ
আপনার মিশনটি, আপনি যদি এটি গ্রহণ করতে চান, তবে এমন একটি দোভাষী লিখতে হবে যা তার ইনপুট হিসাবে কোনও টাইপযুক্ত ল্যাম্বডা ক্যালকুলাসের কোনও মুক্ত ভেরিয়েবল থাকে না এবং তার আউটপুট হিসাবে প্রকাশের স্বাভাবিক রূপ (বা তার সাথে আলফা-সম্মিলিত) উত্পাদন করে takes । যদি অভিব্যক্তির কোনও সাধারণ ফর্ম না থাকে বা এটি কোনও বৈধ এক্সপ্রেশন না হয় তবে আচরণটি সংজ্ঞায়িত।
ক্ষুদ্রতম সংখ্যক অক্ষরের সাথে সমাধানটি জিততে পারে।
কয়েকটি নোট:
- ইনপুট হয় স্টিডিন বা কমান্ড লাইন আর্গুমেন্ট হিসাবে দেওয়া ফাইলের নাম থেকে পড়তে পারে (আপনাকে কেবল একটি বা অন্যটি প্রয়োগ করতে হবে - উভয়ই নয়)। আউটপুট stdout যায়।
- বিকল্পভাবে আপনি কোনও ফাংশন সংজ্ঞায়িত করতে পারেন যা ইনপুটটিকে স্ট্রিং হিসাবে গ্রহণ করে এবং আউটপুটটিকে স্ট্রিং হিসাবে ফিরিয়ে দেয়।
- যদি নন-এসসিআইআই অক্ষরগুলি আপনার পক্ষে সমস্যাযুক্ত হয় তবে আপনি
\
λ এর পরিবর্তে ব্যাকস্ল্যাশ ( ) অক্ষরটি ব্যবহার করতে পারেন λ - আমরা বাইটগুলি নয়, অক্ষরের সংখ্যা গণনা করি, সুতরাং আপনার উত্স ফাইলটি ইউনিকোড হিসাবে এনকোড করা থাকলেও one একটি অক্ষর হিসাবে গণনা করা হয়।
- আইনী ভেরিয়েবলের নামগুলিতে এক বা একাধিক লোয়ার কেস বর্ণ থাকে, অর্থাত্ a এবং z এর মধ্যে অক্ষর (অক্ষরগুলির নাম, বড় হাতের অক্ষর বা ল্যাটিন-অক্ষরকে সমর্থন করার প্রয়োজন নেই - যদিও এটি করা আপনার সমাধানটিকে অকার্যকর করবে না)।
- যতদূর এই চ্যালেঞ্জ সম্পর্কিত, কোনও বন্ধনী alচ্ছিক নয়। প্রতিটি ল্যাম্বদা এক্সপ্রেশন এবং প্রতিটি ফাংশন অ্যাপ্লিকেশন হ'ল এক জোড়া বন্ধনী দ্বারা ঘিরে থাকবে। কোনও পরিবর্তনশীল নাম বন্ধনী দ্বারা বেষ্টিত হবে না।
- সিন্ট্যাকটিক চিনির মতো লেখার
(λ x y. e)
জন্য(λ x. (λ y. e))
সমর্থন করার প্রয়োজন নেই। - যদি কোনও ফাংশনটি মূল্যায়নের জন্য যদি 100 এর বেশি সংখ্যার পুনরাবৃত্তির গভীরতা প্রয়োজন হয়, তবে আচরণটি অনির্ধারিত। এটি সমস্ত ভাষায় অপ্টিমাইজেশন ছাড়াই কার্যকর করার জন্য পর্যাপ্ত পরিমাণের চেয়ে কম হওয়া উচিত এবং এখনও বেশিরভাগ এক্সপ্রেশন কার্যকর করতে সক্ষম হতে হবে large
- আপনি এটি ধরেও নিতে পারেন যে উদাহরণগুলির মধ্যে ব্যবধানটি হবে যেমন, ইনপুটটির শুরু এবং শেষে
λ
বা.
কোনও.
এবং একটি ফাংশন এবং তার তর্ক এবং এর পরে এবং ঠিক পরে একটি জায়গার আগে কোনও স্থান নেইλ
।
নমুনা ইনপুট এবং আউটপুট
ইনপুট:
((λ x. x) (λ y. (λ z. z)))
আউটপুট:
(λ y. (λ z. z))
ইনপুট:
(λ x. ((λ y. y) x))
আউটপুট:
(λ x. x)
ইনপুট:
((λ x. (λ y. x)) (λ a. a))
আউটপুট:
(λ y. (λ a. a))
ইনপুট:
(((λ x. (λ y. x)) (λ a. a)) (λ b. b))
আউটপুট:
(λ a. a)
ইনপুট:
((λ x. (λ y. y)) (λ a. a))
আউটপুট:
(λ y. y)
ইনপুট:
(((λ x. (λ y. y)) (λ a. a)) (λ b. b))
আউটপুট:
(λ b. b)
ইনপুট:
((λx. (x x)) (λx. (x x)))
আউটপুট: যে কোনও কিছুই (এটি কোনও অভিব্যক্তির উদাহরণ যা কোনও সাধারণ রূপ নয়)
ইনপুট:
(((λ x. (λ y. x)) (λ a. a)) ((λx. (x x)) (λx. (x x))))
আউটপুট:
(λ a. a)
(এটি একটি অভিব্যক্তির একটি উদাহরণ যা আপনি ফাংশন কলের আগে যুক্তিগুলি মূল্যায়ন করলে স্বাভাবিক হয় না এবং দুঃখের সাথে এমন একটি উদাহরণ যার জন্য আমার চেষ্টা করা সমাধান ব্যর্থ হয়েছে)ইনপুট:
((λ a. (λ b. (a (a (a b))))) (λ c. (λ d. (c (c d)))))
আউটপুট:
`(λ a. (λ b. (a (a (a (a (a (a (a (a b))))))))))
চার্চ সংখ্যায় এটি 2 ^ 3 গণনা করে।
(\y. a)
।