ट्रैक
/
Swift
Swift
/
अभ्यास
/
हाई स्कोर बोर्ड
हाई स्कोर बोर्ड

हाई स्कोर बोर्ड

सीखने का अभ्यास

परिचय

डिक्शनरी Swift के प्रमुख संग्रह प्रकारों में से एक हैं। एक डिक्शनरी अलग-अलग की और उनसे जुड़ी वैल्यू के बीच क्रम-रहित संबंध संग्रहीत करती है। डिक्शनरी में हर की का टाइप एक ही होना चाहिए, और हर वैल्यू का टाइप भी एक ही होना चाहिए।

डिक्शनरी लिटरल को कॉमा से अलग किए गए 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]।

खाली डिक्शनरी बनाने के लिए उसके की और वैल्यू के टाइप स्पष्ट रूप से बताइए:

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

वैल्यू तक पहुँचना

आप सबस्क्रिप्ट नोटेशन की मदद से वैल्यू पढ़ सकते हैं: डिक्शनरी के नाम के बाद चौकोर ब्रैकेट में की लिखिए। क्योंकि हो सकता है कि कोई की डिक्शनरी में मौजूद न हो, इसलिए सबस्क्रिप्ट से पढ़ने पर एक ऑप्शनल (Value?) लौटता है। अगर की मौजूद है, तो 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 से घोषित बदलने योग्य डिक्शनरी में आप सबस्क्रिप्ट असाइनमेंट की मदद से की-वैल्यू जोड़े जोड़ या बदल सकते हैं:

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, value) ट्यूपल के रूप में मिलता है:

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

डिक्शनरी को क्रमबद्ध करना

क्योंकि डिक्शनरी क्रम-रहित होती है, उसे क्रमबद्ध करने पर की-वैल्यू जोड़ों का एक ऐरे मिलता है। आप 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)

निर्देश

इस अभ्यास में आपको अपने नज़दीकी आर्केड हॉल के सबसे लोकप्रिय गेम के हाई स्कोर का हिसाब रखने का एक तरीका बनाना है।

आपको 7 फंक्शन बनाने हैं, जो सब हाई स्कोर के डेटा की एक डिक्शनरी लौटाने और उसमें बदलाव करने से जुड़े हैं।

1. नई हाई स्कोर डिक्शनरी बनाइए

एक फंक्शन newScoreBoard() बनाइए जो कोई पैरामीटर नहीं लेता और एक नई हाई स्कोर डिक्शनरी लौटाता है। इस डिक्शनरी में की String टाइप की होती हैं और वैल्यू Int टाइप की।

2. हाई स्कोर डिक्शनरी में खिलाड़ी जोड़िए

हाई स्कोर डिक्शनरी में एक खिलाड़ी जोड़ने के लिए addPlayer(_:_:_:) बनाइए। यह एक फंक्शन है जो 3 पैरामीटर लेता है:

  • पहला पैरामीटर स्कोर की डिक्शनरी है। यह एक इन-आउट पैरामीटर होना चाहिए।
  • दूसरा पैरामीटर खिलाड़ी का नाम है, जो एक स्ट्रिंग है।
  • तीसरा पैरामीटर स्कोर है, जो एक पूर्णांक है। यह पैरामीटर वैकल्पिक है, इसे 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(_:_:) बनाइए, जो 2 पैरामीटर लेता है:

  • पहला पैरामीटर स्कोर की डिक्शनरी है। यह एक इन-आउट पैरामीटर होना चाहिए।
  • दूसरा पैरामीटर खिलाड़ी का नाम है, जो एक स्ट्रिंग है।

अगर खिलाड़ी डिक्शनरी में है, तो यह फंक्शन उसे डिक्शनरी से हटा दे। अगर नहीं है, तो कुछ नहीं होना चाहिए।

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(_:_:) बनाइए, जो 2 पैरामीटर लेता है:

  • पहला पैरामीटर स्कोर की डिक्शनरी है। यह एक इन-आउट पैरामीटर होना चाहिए।
  • दूसरा पैरामीटर खिलाड़ी का नाम है, जो एक स्ट्रिंग है और जिसका स्कोर आप रीसेट करना चाहते हैं।

यह फंक्शन खिलाड़ी का स्कोर 0 कर देता है। अगर खिलाड़ी डिक्शनरी में नहीं है, तो कुछ नहीं होना चाहिए।

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

5. किसी खिलाड़ी का स्कोर अपडेट कीजिए

किसी खिलाड़ी का स्कोर उसके पिछले स्कोर में जोड़कर अपडेट करने के लिए updateScore बनाइए, जो 3 पैरामीटर लेता है:

  • पहला पैरामीटर स्कोर की डिक्शनरी है। यह एक इन-आउट पैरामीटर होना चाहिए।
  • दूसरा पैरामीटर खिलाड़ी का नाम है, जो एक स्ट्रिंग है और जिसका स्कोर आप अपडेट करना चाहते हैं।
  • तीसरा पैरामीटर वह स्कोर है जिसे आप संग्रहीत हाई स्कोर में जोड़ना चाहते हैं।
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 फंक्शन बनाइए, जो 1 पैरामीटर लेता है:

  • पहला पैरामीटर स्कोर की डिक्शनरी है।

यह फंक्शन (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 बनाइए, जो 1 पैरामीटर लेता है:

  • पहला पैरामीटर स्कोर की डिक्शनरी है।

यह फंक्शन (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 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।