একটি বোলিং গেমের স্কোর করুন।
বোলিং হলো এমন একটি গেম, যেখানে খেলোয়াড়েরা ত্রিভুজে সাজানো পিন ফেলে দেওয়ার জন্য একটি ভারী বল রোল করে। একটি বোলিং গেমের স্কোর হিসাব রাখতে কোড লিখুন।
গেমটি ১০টি ফ্রেম নিয়ে গঠিত। ফ্রেম শুরু করার সময় ১০টি পিন দাঁড়ানো থাকে এবং একটি ফ্রেম এক বা দুটি বল নিক্ষেপে গঠিত হয়। ফ্রেমের হিসাব করার জন্য তিনটি ক্ষেত্র রয়েছে।
ওপেন ফ্রেম হলো এমন একটি অবস্থা, যেখানে ফ্রেমের জন্য ১০-এর কম স্কোর রেকর্ড করা হয়। এক্ষেত্রে ফ্রেমের স্কোর হলো ফেলে দেওয়া পিনের সংখ্যা।
স্পেয়ার হলো এমন একটি অবস্থা, যেখানে দ্বিতীয় নিক্ষেপে দশটি পিনই ফেলে দেওয়া হয়। একটি স্পেয়ারের মোট মান হলো ১০-এর সাথে পরের নিক্ষেপে ফেলে দেওয়া পিনের সংখ্যা যোগ করা।
স্ট্রাইক হলো এমন একটি অবস্থা, যেখানে প্রথম নিক্ষেপেই দশটি পিন ফেলে দেওয়া হয়। একটি স্ট্রাইকের মোট মান হলো ১০-এর সাথে পরের দুটি নিক্ষেপে ফেলে দেওয়া পিনের সংখ্যা যোগ করা। কোনো স্ট্রাইকের ঠিক পরেই যদি আরেকটি স্ট্রাইক হয়, তবে আরও একবার বল না ছোড়া পর্যন্ত প্রথম স্ট্রাইকের মান নির্ণয় করা যায় না।
এখানে তিন ফ্রেমের একটি উদাহরণ:
| ফ্রেম ১ | ফ্রেম ২ | ফ্রেম ৩ |
|---|---|---|
| X (strike) | 5/ (spare) | 9 0 (open frame) |
ফ্রেম ১ হলো (১০ + ৫ + ৫) = ২০
ফ্রেম ২ হলো (৫ + ৫ + ৯) = ১৯
ফ্রেম ৩ হলো (৯ + ০) = ৯
এর মানে হলো চলমান মোট স্কোর ৪৮।
গেমের দশম ফ্রেম একটি বিশেষ ক্ষেত্র। কেউ যদি স্পেয়ার বা স্ট্রাইক করে, তবে সে যথাক্রমে একটি বা দুটি ফিল বল পায়। দশম ফ্রেমের মোট হিসাব করার জন্য ফিল বল থাকে। ফিল বলে স্ট্রাইক বা স্পেয়ার করলে খেলোয়াড় আরও ফিল বল পায় না। দশম ফ্রেমের মোট মান হলো ফেলে দেওয়া পিনের মোট সংখ্যা।
X1/ (একটি স্ট্রাইক ও একটি স্পেয়ার) দশম ফ্রেমের ক্ষেত্রে মোট মান ২০।
XXX (তিনটি স্ট্রাইক) দশম ফ্রেমের ক্ষেত্রে মোট মান ৩০।
একটি বোলিং গেমের স্কোর হিসাব রাখতে কোড লিখুন। এটিকে দুটি অপারেশন সমর্থন করতে হবে:
roll(pins : int) কল করা হয়।
আর্গুমেন্ট হলো ফেলে দেওয়া পিনের সংখ্যা।score() : int কেবল গেমের একেবারে শেষে কল করা হয়।
এটি ওই গেমের মোট স্কোর রিটার্ন করে।এই অনুশীলনীটি সম্পূর্ণ করতে আপনাকে score ফাংশনটি ইমপ্লিমেন্ট করতে হবে, যা বোলিং রোলের একটি সিকোয়েন্স নেয় এবং চূড়ান্ত স্কোর বা উপযুক্ত এরর রিটার্ন করে:
score :: [Int] -> Either BowlingError Int
data BowlingError = IncompleteGame
| InvalidRoll { rollIndex :: Int, rollValue :: Int }
deriving (Eq, Show)
এই ডেফিনিশনগুলো ইতিমধ্যেই দেওয়া আছে, তবে ফাংশনটি ডিফাইন করা আপনার হাতেই।
মনে রাখবেন, টেস্ট স্যুট আশা করে রোলগুলোর নম্বর শূন্য থেকে শুরু হবে।
Exercism-এ সাইন আপ করুন, Haskell ট্র্যাকের 107টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।