হাই স্কোর

হাই স্কোর

সহজ

নির্দেশনা

গেমের একজন খেলোয়াড়ের হাই স্কোর তালিকা পরিচালনা করুন।

আপনার কাজ হলো ক্লাসিক ফ্রগার গেমের একটি হাই স্কোর কম্পোনেন্ট তৈরি করা, যা সর্বকালের সবচেয়ে বেশি বিক্রি হওয়া ও সবচেয়ে আসক্তিকর গেমগুলোর একটি এবং আর্কেড যুগের একটি ক্লাসিক। আপনার কাজ হলো এমন মেথড লেখা, যেগুলো তালিকা থেকে সর্বোচ্চ স্কোর, সর্বশেষ যোগ করা স্কোর এবং তিনটি সর্বোচ্চ স্কোর রিটার্ন করে।

এই অনুশীলনীতে আপনি লিস্ট এবং অ্যারে নিয়ে কাজ করবেন। Lean-এ দুটিই খুব গুরুত্বপূর্ণ ডেটা স্ট্রাকচার।

লিস্ট

বেশিরভাগ ফাংশনাল ভাষার মতো, লিস্ট হলো Lean-এর একটি মৌলিক ডেটা স্ট্রাকচার।

একটি লিস্টের দুটি কনস্ট্রাক্টর থাকে: একটি খালি লিস্টের ([]) জন্য, আরেকটি এমন একটি লিস্টের জন্য যেখানে একটি এলিমেন্ট (head) ও আরেকটি লিস্ট (tail) থাকে। :: ব্যবহার করে লিস্টের সামনে এলিমেন্ট যোগ করা যায়, ফলে একটি নতুন লিস্ট তৈরি হয়:

let list := x :: xs -- prepending x to xs creates a new list where x is the head and xs is the tail

লিস্ট স্বভাবতই রিকার্সিভ, যা এগুলোকে ইনডাক্টিভ রিজনিং-এর জন্য খুব উপযুক্ত করে তোলে। এগুলো স্ট্রাকচারাল শেয়ারিংও সমর্থন করে: বিদ্যমান লিস্টটি কপি না করেই আপনি একটি নতুন এলিমেন্ট লিস্টের সামনে যোগ করতে পারেন:

let list1 := [1, 2]
let list2 := 0 :: list1
-- now both list1 and list2 share [1, 2]

তবে লিস্টের বেশিরভাগ অপারেশনে সময় লাগে লিস্টের দৈর্ঘ্যের সমানুপাতিক, কারণ পরের এলিমেন্টে পৌঁছাতে প্রতিটি এলিমেন্টের মধ্য দিয়ে যেতে হয়।

অ্যারে

একটি অ্যারে হলো ডাইনামিক সাইজের একটি অবিচ্ছিন্ন মেমরি ব্লক।

অনেক অপারেশনে অ্যারে লিস্টের চেয়ে অনেক বেশি দক্ষ হতে পারে:

  1. অ্যারেতে যেকোনো এলিমেন্ট অ্যাক্সেস করা দ্রুত এবং এটি কনস্ট্যান্ট টাইমে চলে।
  2. অ্যারে তৈরি হয়েছে ডাইনামিক অ্যারের আদলে, যা ক্যাশ লোকালিটি-এর কারণে আধুনিক সিস্টেমে বিশেষভাবে দক্ষ হয়।

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

Lean এই অসুবিধা কমাতে রেফারেন্স কাউন্টিং ব্যবহার করে। যতক্ষণ একটি অ্যারের প্রতি একটির বেশি রেফারেন্স না থাকে (অর্থাৎ এটি লিনিয়ারভাবে ব্যবহৃত হয়), ততক্ষণ কোনো কপি তৈরি হয় না এবং আপডেট ডেস্ট্রাক্টিভভাবে করা যায়।

Array API-এর অনেক ফাংশন, যেমন set এবং push, আনশেয়ারড ডেটার ক্ষেত্রে ডেস্ট্রাক্টিভ আপডেট করে।

ডু-নোটেশন

Lean ডু-নোটেশন সমর্থন করে, যা ইমপারেটিভ স্টাইলে কোড লেখার জন্য একটি এমবেডেড ভাষা।

do ব্লকের ভিতরে mut কিওয়ার্ড ব্যবহার করে মিউটেবল লোকাল ভ্যারিয়েবল ঘোষণা করা যায়, যেগুলো আবার অ্যাসাইন করা সম্ভব। অ্যারের মতো ডেটা স্ট্রাকচারের সঙ্গে ব্যবহার করলে এটি Lean-এর রানটাইম সিস্টেমকে নিরাপদ হলেই ভিতরে ভিতরে ইন-প্লেস ডেস্ট্রাক্টিভ আপডেট করার সুযোগ দেয়।

ডু-নোটেশন কেবল মোনাডের ভিতরেই ব্যবহার করা যায়। ইমপারেটিভ স্টাইলে কোড লেখার একটি সুবিধাজনক উপায়, যা পিওর থাকে এবং যার কোনো লক্ষণীয় সাইড ইফেক্ট নেই, হলো আইডেন্টিটি মোনাড ব্যবহার করা:

def sumArray (array : Array Nat) := Id.run do
    let mut sum := 0
    for element in array do
        sum := sum + element
    return sum

সূত্র

আশির দশকের আর্কেড গেম Frogger-এর প্রতি শ্রদ্ধাঞ্জলি
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Lean Exercism

হাই স্কোর শুরু করতে প্রস্তুত?

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