ট্র্যাক
/
Swift
Swift
/
অনুশীলনী
/
হাই স্কোর বোর্ড
হাই স্কোর বোর্ড

হাই স্কোর বোর্ড

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

ভূমিকা

ডিকশনারি হলো Swift-এর প্রধান কালেকশন টাইপগুলোর একটি। ডিকশনারি স্বতন্ত্র কী (key) ও সংশ্লিষ্ট মানের মধ্যে ক্রমহীন সম্পর্ক সংরক্ষণ করে। ডিকশনারির সব কী (key) একই টাইপের হতে হবে, আর সব মানও একই টাইপের হতে হবে।

ডিকশনারি লিটারেল লেখা হয় কমা দিয়ে আলাদা করা key: value জোড়ার আকারে, যা তৃতীয় বন্ধনীর ভেতরে রাখা হয়:

var addresses: Dictionary<String, String> = [
    "The Munsters": "1313 Mockingbird Lane",
    "The Simpsons": "742 Evergreen Terrace",
    "Buffy Summers": "1630 Revello Drive"
]

var sequences: [String: [Int]] = [
    "Euler's totient": [1, 1, 2, 2, 4, 2, 6, 4],
    "Lazy caterer": [1, 2, 4, 7, 11, 16, 22, 29, 37],
    "Carmichael": [561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841]
]

let constants = [
    "pi": 3.14159,
    "e": 2.71828,
    "phi": 1.618033,
    "avogadro": 6.02214076e23
]

ডিকশনারি টাইপ স্পষ্টভাবে দুইভাবে লেখা যায়: Dictionary<Key, Value> অথবা সংক্ষিপ্ত রূপ [Key: Value]।

খালি ডিকশনারি তৈরি করতে চাইলে তার কী (key) ও মানের টাইপ স্পষ্টভাবে উল্লেখ করুন:

var emptyDict1: [Int: Int] = [:]
var emptyDict2 = [Character: String]()
var emptyDict3 = Dictionary<Int, Double>()

মান অ্যাক্সেস করা

সাবস্ক্রিপ্ট নোটেশন ব্যবহার করে আপনি মান অ্যাক্সেস করতে পারেন: ডিকশনারির নামের পরে তৃতীয় বন্ধনীর ভেতরে কী (key) বসিয়ে দিন। যেহেতু কোনো কী (key) ডিকশনারিতে নাও থাকতে পারে, তাই সাবস্ক্রিপ্ট অ্যাক্সেস একটি অপশনাল (Value?) রিটার্ন করে। কী (key) উপস্থিত থাকলে Swift ভেতরে থাকা মানটি রিটার্ন করে; না থাকলে রিটার্ন করে nil:

let munster: String? = addresses["The Munsters"]
// Returns Optional("1313 Mockingbird Lane")

let carmichael = sequences["Carmichael"]
// Returns Optional([561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841])

let planck = constants["planck"]
// Returns nil

অপশনাল নিয়ে কাজ করা এড়াতে আপনি default প্যারামিটার দিয়ে একটি ডিফল্ট মান দিতে পারেন:

let e: Double = constants["e", default: 0]
// Returns 2.71828

let hoagie: [Int] = sequences["Hoagie", default: []]
// Returns []

let betty = addresses["Betty Cooper", default: "Address unknown"]
// Returns "Address unknown"

ডিকশনারি পরিবর্তন করা

var দিয়ে ডিক্লেয়ার করা পরিবর্তনযোগ্য ডিকশনারির ক্ষেত্রে আপনি সাবস্ক্রিপ্ট অ্যাসাইনমেন্ট দিয়ে কী (key) ও মানের জোড়া যোগ বা হালনাগাদ করতে পারেন:

sequences["Euler's totient"]?.append(contentsOf: [6, 4])
// sequences["Euler's totient"] is now [1, 1, 2, 2, 4, 2, 6, 4, 6, 4]

addresses["Betty Cooper"] = "111 Queens Ave."
addresses["Betty Cooper", default: "Address unknown"]
// Returns "111 Queens Ave."

constants["Gelfond's"] = 23.140692
// Compiler error: Cannot assign through subscript: 'constants' is a 'let' constant

ডিকশনারির উপর ইটারেশন করা

for-in লুপ ব্যবহার করে আপনি ডিকশনারির প্রতিটি কী (key) ও মানের জোড়ার উপর দিয়ে ইটারেশন করতে পারেন। প্রতিটি আইটেম দেওয়া হয় একটি (key, value) টাপল হিসেবে:

for (name, address) in addresses {
    print("\(name) lives at \(address)")
}

ডিকশনারি সাজানো

ডিকশনারি ক্রমহীন হওয়ায়, সেগুলো সাজালে কী (key) ও মানের জোড়ার একটি অ্যারে তৈরি হয়। আপনি sorted(by:) মেথডে একটি ক্লোজার পাস করতে পারেন, যা দুটি (key, value) টাপল তুলনা করে এবং প্রথম টাপলটি দ্বিতীয়টির আগে বসা উচিত হলে true রিটার্ন করে:

func sortByNameLengthThenValue(_ lhs: (key: String, value: Double), _ rhs: (key: String, value: Double)) -> Bool {
    let left = lhs.value + Double(lhs.key.count)
    let right = rhs.value + Double(rhs.key.count)
    return left < right
}

let sortedConstants = constants.sorted(by: sortByNameLengthThenValue)

নির্দেশনা

এই অনুশীলনীতে আপনি আপনার এলাকার আর্কেড হলের সবচেয়ে জনপ্রিয় গেমটির হাই স্কোর হিসাব রাখার একটি উপায় তৈরি করবেন।

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

1. একটি নতুন হাই স্কোর ডিকশনারি ডিফাইন করুন

এমন একটি ফাংশন newScoreBoard() তৈরি করুন যা কোনো প্যারামিটার নেয় না এবং একটি নতুন হাই স্কোর ডিকশনারি রিটার্ন করে, যেটি কী (key)-এর জন্য String টাইপের মান আর ভ্যালু হিসেবে Int টাইপের মান ব্যবহার করে।

2. হাই স্কোর ডিকশনারিতে খেলোয়াড় যোগ করুন

হাই স্কোর ডিকশনারিতে একজন খেলোয়াড় যোগ করতে addPlayer(_:_:_:) ডিফাইন করুন, যা একটি ফাংশন এবং ৩টি প্যারামিটার নেয়:

  • প্রথম প্যারামিটারটি হলো স্কোরের ডিকশনারি। এটি একটি in-out প্যারামিটার হওয়া উচিত।
  • দ্বিতীয় প্যারামিটারটি হলো একজন খেলোয়াড়ের নাম, একটি স্ট্রিং হিসেবে।
  • তৃতীয় প্যারামিটারটি হলো স্কোর, একটি ইন্টিজার হিসেবে। প্যারামিটারটি অপশনাল; তৃতীয় প্যারামিটারটি ডিফল্ট মান 0 দিয়ে ইমপ্লিমেন্ট করুন।
var highScores = newScoreBoard()
addPlayer(&highScores, "Dave Thomas")
// Returns ["Dave Thomas": 0]
addPlayer(&highScores, "José Valim", 486_373)
// Returns ["Dave Thomas": 0, "José Valim": 486_373]

3. স্কোর ডিকশনারি থেকে খেলোয়াড় সরান

হাই স্কোর ডিকশনারি থেকে একজন খেলোয়াড় সরাতে removePlayer(_:_:) ডিফাইন করুন, যা ২টি প্যারামিটার নেয়:

  • প্রথম প্যারামিটারটি হলো স্কোরের ডিকশনারি। এটি একটি in-out প্যারামিটার হওয়া উচিত।
  • দ্বিতীয় প্যারামিটারটি হলো খেলোয়াড়ের নাম, একটি স্ট্রিং হিসেবে।

খেলোয়াড়টি ডিকশনারিতে থাকলে এই ফাংশনটি তাকে সরিয়ে দেবে, আর না থাকলে কিছুই করবে না।

var highScores = ["Dave Thomas": 0, "José Valim": 486_373]
removePlayer(&highScores, "Dave Thomas")
// Returns ["José Valim": 486_373]
removePlayer(&highScores, "Rose Fanaras")
// Returns ["José Valim": 486_373]

4. একজন খেলোয়াড়ের স্কোর রিসেট করুন

একজন খেলোয়াড়ের স্কোর রিসেট করতে resetPlayer(_:_:) ডিফাইন করুন, যা ২টি প্যারামিটার নেয়:

  • প্রথম প্যারামিটারটি হলো স্কোরের ডিকশনারি। এটি একটি in-out প্যারামিটার হওয়া উচিত।
  • দ্বিতীয় প্যারামিটারটি হলো খেলোয়াড়ের নাম, একটি স্ট্রিং হিসেবে, যার স্কোর আপনি রিসেট করতে চান।

ফাংশনটি খেলোয়াড়ের স্কোর 0 করে দেবে। খেলোয়াড়টি ডিকশনারিতে না থাকলে কিছুই হওয়া উচিত নয়।

var highScores = ["Dave Thomas": 486_373, "José Valim": 10]
resetScore(&highScores, "Dave Thomas")
// Returns ["Dave Thomas": 0, "José Valim": 10]

5. একজন খেলোয়াড়ের স্কোর আপডেট করুন

আগের স্কোরের সাথে যোগ করে একজন খেলোয়াড়ের স্কোর আপডেট করতে updateScore ডিফাইন করুন, যা ৩টি প্যারামিটার নেয়:

  • প্রথম প্যারামিটারটি হলো স্কোরের ডিকশনারি। এটি একটি in-out প্যারামিটার হওয়া উচিত।
  • দ্বিতীয় প্যারামিটারটি হলো খেলোয়াড়ের নাম, একটি স্ট্রিং হিসেবে, যার স্কোর আপনি আপডেট করতে চান।
  • তৃতীয় প্যারামিটারটি হলো সেই স্কোর, যা আপনি সংরক্ষিত হাই স্কোরের সাথে যোগ করতে চান।
var highScores = ["Dave Thomas": 0, "José Valim": 486_373]
addPlayer(&highScores, "Freyja Ćirić", 12_771_008)
updateScore(&highScores, "Freyja Ćirić", 73)
// Returns ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_081]

6. খেলোয়াড়ের নাম অনুযায়ী সাজানো স্কোরসহ খেলোয়াড়দের একটি অ্যারে পান

orderByPlayers ফাংশনটি ডিফাইন করুন, যা ১টি প্যারামিটার নেয়:

  • প্রথম প্যারামিটারটি হলো স্কোরের ডিকশনারি।

ফাংশনটি (String, Int) টাপলের একটি অ্যারে রিটার্ন করবে, যেখানে থাকবে খেলোয়াড়েরা এবং তাদের হাই স্কোর, খেলোয়াড়ের নাম অনুযায়ী ঊর্ধ্বক্রমে সাজানো।

var highScores = ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_091]
orderByPlayers(highScores)
// Returns [("Dave Thomas", 0), ("Freyja Ćirić", 12_771_091), ("José Valim", 486_373)]

7. খেলোয়াড়ের স্কোর অনুযায়ী অবরোহ ক্রমে সাজানো খেলোয়াড়দের একটি অ্যারে পান

স্কোর অনুযায়ী অবরোহ ক্রমে সাজানো খেলোয়াড়দের একটি অ্যারে পেতে orderByScores ডিফাইন করুন, যা ১টি প্যারামিটার নেয়:

  • প্রথম প্যারামিটারটি হলো স্কোরের ডিকশনারি।

ফাংশনটি (String, Int) টাপলের একটি অ্যারে রিটার্ন করবে, যেখানে থাকবে খেলোয়াড়েরা এবং তাদের হাই স্কোর, খেলোয়াড়ের স্কোর অনুযায়ী অবরোহ ক্রমে সাজানো।

var highScores = ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_091]
orderByScores(highScores)
// Returns [("Freyja Ćirić", 12_771_091), ("José Valim", 486_373), ("Dave Thomas", 0)]
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Swift Exercism

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

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