পিৎজা পাই

পিৎজা পাই

লার্নিং অনুশীলনী

ভূমিকা

অন্য অনেক ভাষার মতোই Common Lisp-এ সংখ্যা কয়েকটি ভিন্ন ধরনের হয়ে থাকে। এর মধ্যে সবচেয়ে মৌলিক দুটি ধরন হলো:

ইন্টিজার

অন্য অনেক ভাষার মতো Common Lisp-এও ইন্টিজার থাকে। এগুলো হলো দশমিক বিন্দু ছাড়া পূর্ণসংখ্যা (যেমন -6, 0, 25, 1234 ইত্যাদি)।

ইন্টিজারের আকার নিয়ে Common Lisp কোনো সীমা বেঁধে দেয় না। ইন্টিজার যত খুশি বড় হতে পারে (নেগেটিভ হলে যত খুশি ছোটও হতে পারে)।

সাধারণভাবে, আপনি যদি শুধু পূর্ণসংখ্যা নিয়ে কাজ করেন, তাহলে ইন্টিজারকেই প্রাধান্য দেওয়া উচিত, কারণ অনেকগুলো গণনার পর ফ্লোটিং পয়েন্ট সংখ্যায় যে নির্ভুলতা হারায়, ইন্টিজারে তা হয় না।

ফ্লোটিং পয়েন্ট সংখ্যা

অন্য অনেক ভাষার মতো Common Lisp-এও ফ্লোটিং পয়েন্ট সংখ্যা থাকে। এগুলো হলো দশমিক বিন্দুসহ ভগ্নাংশ বা পূর্ণসংখ্যা (যেমন 3.14, -1.7, 99.99, 2048.0)।

পাটিগণিত

বেশিরভাগ কাজে Common Lisp পাটিগণিতের সাধারণ অপারেটরগুলোই ব্যবহার করে, তবে বেশি পরিচিত "ইনফিক্স-নোটেশনের" বদলে "প্রিফিক্স-নোটেশন" ব্যবহারে এটি কিছুটা আলাদা।

আরও স্পষ্টভাবে বুঝতে:

;; Infix-notation (non-lisp languages)
1 + 2 + 3 + 4 + 5 ; => 15
;; Prefix-notation (lisp languages)
(+ 1 2 3 4 5)     ; => 15

প্রিফিক্স নোটেশন 2 + 2-এর মতো কিছু অপারেশনকে (+ 2 2)-এর মতো কিছুটা অপরিচিত রূপে বদলে দিলেও, একসাথে একাধিক সংখ্যা নিয়ে কাজ করা অনেক সহজ করে তোলে।

মৌলিক গণিত

যোগ, বিয়োগ, গুণ ও ভাগের জন্য Common Lisp-এ সব সাধারণ ফাংশনই আছে: +, -, *, /।

ভাগ করার সময় ভাগশেষ জানার দরকার হতে পারে। সেটি করা হয় mod (মডুলো) ফাংশন দিয়ে, যা আর্গুমেন্ট হিসেবে একটি সংখ্যা ও একটি ভাজক নেয়:

(mod 4 2)  ; => 0
(mod 2 4)  ; => 2
(mod 10 3) ; => 1

সংখ্যা তুলনা

সবশেষে, ভিন্ন ভিন্ন সংখ্যা তুলনা করার জন্য = (সমান), /= (সমান নয়) এবং >= (বড় বা সমান) ফাংশনগুলো আপনার কাজে লাগতে পারে। এই তুলনাগুলো ট্রু হলে (যেমন (= 1 1)) এগুলো T রিটার্ন করে, আর ফলস হলে (যেমন (> 0 1)) NIL রিটার্ন করে।

নির্দেশনা

Lisp এলিয়েন লিলি রান্না করতে ভালোবাসেন। তিনি বন্ধুদের নিয়ে একটি পিৎজা পার্টি করতে চান, কিন্তু উপকরণগুলোর সর্বোচ্চ ব্যবহার করতে চাইলে শুরুর আগেই ঠিক জানতে চান, কোন উপকরণ কতটা লাগবে।

এটি সমাধান করতে লিলি পরিকল্পনার কিছু কাজ স্বয়ংক্রিয় করার জন্য একটি প্রোগ্রামের খসড়া করেছেন, কিন্তু সেটি শেষ করতে আপনার সাহায্য দরকার। আনুপাতিকভাবে নিখুঁত সেই পিৎজা পার্টিটি করতে আপনি কি লিলিকে সাহায্য করবেন?

1. ডোর অনুপাত

সবার আগে বলে নিই, প্রতিটি দুর্দান্ত পিৎজার শুরুটা হয় সুস্বাদু ডো দিয়ে!

লিলি পাতলা, মুচমুচে আর একটু মোটা ক্রাস্টের পিৎজা পছন্দ করেন। মাঝের অংশের জন্য ডো লাগে সবসময় ২০০g, কিন্তু ক্রাস্টের প্রতি ২০cm-এর জন্য লাগে ৪৫g ডো।

ভাগ্যক্রমে, লিলি পিৎজার সংখ্যা (n) আর তাদের ব্যাস (d) থেকে ডোর গ্রাম (g) হিসাব করার সমীকরণটি বের করেছেন:

g = n * (((45 * pi * d) / 20) + 200)

লিলির একটি ফাংশন দরকার যা:

  • পিৎজার সংখ্যা (n) আর তাদের ব্যাস (d) নেয়
  • এবং নিকটতম গ্রামে (g) পূর্ণ করে প্রয়োজনীয় ডো রিটার্ন করে।

উদাহরণস্বরূপ, ৩০cm ব্যাসের ৪টি পিৎজা বানাতে:

(dough-calculator 4 30) ; => 1648

2. এক ছিটে সস

লিলি সস লাগানোর ব্যাপারে খুব খুঁটিনাটি খেয়াল রাখেন, তবে তাঁর পিৎজার আকার সবসময় একই রকম হয় না।

ব্যাস (d) বের করতে তিনি নিচের সমীকরণটি ব্যবহার করেন, যেখানে লাগানো সস (s) একটি ভ্যারিয়েবল:

d = square-root of ((40 * s) / (3 * pi))

লিলির এমন একটি ফাংশন দরকার যা লাগানো প্রতি মিলিলিটার সস (s) থেকে পিৎজার ব্যাস (d) হিসাব করে।

উদাহরণস্বরূপ, লিলি ২৫০ml সস ব্যবহার করে থাকলে:

(size-from-sauce 250) ; => 32.57

3. একটু চিজ, প্লিজ

লিলির গ্রহে সব চিজ আসে নিখুঁত ঘনক আকারে, আর বিক্রি হয় আকার অনুযায়ী। (আর কী আশা করেছিলেন? এ যে এলিয়েনদের গ্রহ...)

আবারও লিলি একটি সমীকরণ বের করেছেন, যেটি বলে l বাহুর দৈর্ঘ্যের একটি চিজ ঘনক থেকে d ব্যাসের কতটি পিৎজা (n) তৈরি হয়:

n = (2 * (l^3)) / (3* pi * (d^2))

এমন একটি ফাংশন তৈরি করুন যা:

  • একটি চিজ ঘনকের বাহুর দৈর্ঘ্য (l) আর পিৎজাগুলোর ব্যাস (d) নেয়,
  • এবং নিচের দিকে রাউন্ড করে তৈরি হওয়া পিৎজার সংখ্যা (n) রিটার্ন করে।

উদাহরণস্বরূপ, ২৫x২৫x২৫cm চিজ ঘনক আর ৩০cm ব্যাসের পিৎজা হলে:

(pizzas-per-cube 25 30) ; => 3

4. ন্যায্য ভাগ

সবশেষে, লিলি চান তাঁর পিৎজাগুলো প্রতিটি ৮ টুকরো করে কাটা হোক আর বন্ধুদের মধ্যে সমানভাবে ভাগ করা হোক।

এমন একটি ফাংশন তৈরি করুন যা:

  • কতগুলো পিৎজা আর কতজন বন্ধু, তা নেয়
  • এবং বন্ধুদের মধ্যে পিৎজাগুলো সমানভাবে ভাগ করা গেলে T রিটার্ন করে, নাহলে NIL।

উদাহরণস্বরূপ:

;; For splitting 3 pizzas between 4 friends
(fair-share-p 3 4) ; => T
;; For splitting 2 pizzas between 3 friends
(fair-share-p 2 3) ; => NIL
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Common Lisp Exercism

পিৎজা পাই শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Common Lisp ট্র্যাকের 27টি কনসেপ্ট92টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।