ट्रैक
/
F#
F#
/
अभ्यास
/
बैंडवैगनर
बैंडवैगनर

बैंडवैगनर

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

परिचय

रिकॉर्ड

एक रिकॉर्ड कई फील्ड का संग्रह होता है। इन फील्ड के टाइप अलग-अलग हो सकते हैं, और ये सब आपस में जुड़ी होती हैं। रिकॉर्ड परिभाषित करने के लिए type कीवर्ड का उपयोग किया जाता है। रिकॉर्ड की फील्ड { और } के बीच लिखी जाती हैं, और हर फील्ड का एक नाम और एक टाइप होता है। रिकॉर्ड बनाने के लिए फील्ड के नाम लिखिए और { तथा } के बीच उनमें वैल्यू असाइन कीजिए। रिकॉर्ड बनाते समय हर फील्ड को वैल्यू असाइन करना ज़रूरी है। किसी रिकॉर्ड इंस्टेंस की फील्ड की वैल्यू डॉट-नोटेशन से पढ़ी जा सकती हैं।

रिकॉर्ड परिभाषित या बनाते समय हर फील्ड या तो अलग लाइन पर होनी चाहिए, या एक ही लाइन पर हो तो सेमीकोलन (;) से अलग होनी चाहिए।

// Define a record
type Address =
    { Street: string
      HouseNumber: int }

// Create a record
let oldAddress: Address =
    { Street = "Main Street"
      HouseNumber = 17 }

// Single-line alternative
type ConciseAddress = { Street: string; HouseNumber: int }
let conciseAddress: ConciseAddress = { Street = "Main Street"; HouseNumber = 17 }

चूँकि रिकॉर्ड अपरिवर्तनीय होते हैं, इसलिए एक बार रिकॉर्ड बन जाने के बाद उसकी फील्ड की वैल्यू कभी नहीं बदल सकतीं। अगर आप रिकॉर्ड की वैल्यू बदलना चाहते हैं, तो with कीवर्ड की मदद से मौजूदा रिकॉर्ड की एक प्रति बना सकते हैं, जिसमें एक या अधिक फील्ड की वैल्यू नई होती हैं।

// Copy the old address but change the house number
let newAddress: Address = { oldAddress with HouseNumber = 86 }
newAddress.Street      // => "Main Street"
newAddress.HouseNumber // => 86

रिकॉर्ड में संरचनात्मक समानता होती है, यानी एक ही रिकॉर्ड के दो इंस्टेंस जिनकी वैल्यू समान हों, बराबर माने जाते हैं।

डॉट-नोटेशन से रिकॉर्ड की फील्ड पढ़ी जा सकती हैं। इसके अलावा रिकॉर्ड को बाइंडिंग में और पैटर्न मैचिंग में डीकंस्ट्रक्ट भी किया जा सकता है:

let myAddress: Address = { Street = "Broadway"; HouseNumber = 123 }
let { Street = myStreet; HouseNumber = myHouseNumber } = myAddress

match myAddress with
| { HouseNumber = 1 } -> printfn "First house"
| { HouseNumber = houseNumber; Street = street } -> printfn "House number %d on %s" houseNumber street
// => "House number 123 on Broadway

निर्देश

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

चूँकि आपके पास अभी कोई पसंदीदा टीम नहीं है, आप एक एल्गोरिदम भी बना रहे हैं ताकि पता चले कि किसी टीम का साथ देना चाहिए या नहीं।

अपना खुद का किस-टीम-का-साथ-दें एल्गोरिदम बनाने में आपकी मदद के लिए आपके पास सात कार्य हैं।

1. मॉडल बनाइए

Coach रिकॉर्ड को नीचे दिए गए दो फील्ड के साथ बनाइए:

  • Name: कोच का नाम, जिसका टाइप string है।
  • FormerPlayer: बताता है कि कोच पहले खिलाड़ी था या नहीं, जिसका टाइप bool है।

Stats रिकॉर्ड को नीचे दिए गए दो फील्ड के साथ बनाइए:

  • Wins: जीत की संख्या, जिसका टाइप int है।
  • Losses: हार की संख्या, जिसका टाइप int है।

Team रिकॉर्ड को नीचे दिए गए तीन फील्ड के साथ बनाइए:

  • Name: टीम का नाम, जिसका टाइप string है।
  • Coach: टीम का कोच, जिसका टाइप Coach है।
  • Stats: टीम के आँकड़े, जिसका टाइप Stats है।

2. टीम का कोच बनाइए

createCoach फंक्शन लागू कीजिए जो पैरामीटर के रूप में कोच का नाम और उसकी पूर्व-खिलाड़ी स्थिति लेता है, और उसका Coach रिकॉर्ड लौटाता है:

createCoach "Larry Bird" true
// => { Name = "Larry Bird"; FormerPlayer = true }

3. टीम के आँकड़े बनाइए

createStats फंक्शन लागू कीजिए जो पैरामीटर के रूप में जीत की संख्या और हार की संख्या लेता है, और उसका Stats रिकॉर्ड लौटाता है:

createStats 58 24
// => { Wins = 58; Losses = 24 }

4. टीम बनाइए

createTeam फंक्शन लागू कीजिए जो पैरामीटर के रूप में टीम का नाम, कोच और रिकॉर्ड लेता है, और उसका Team रिकॉर्ड लौटाता है:

let coach = createCoach "Larry Bird" true
let record = createStats 58 24
createTeam "Indiana Pacers" coach record
// => { Name = "Indiana Pacers"
//      Coach = { Name = "Larry Bird"; FormerPlayer = true }
//      Stats = { Wins = 58; Losses = 24 } }

5. कोच बदलिए

NBA के मालिक बेसब्र होते हैं, और आपने देखा कि खराब टीम नतीजों के कारण अक्सर कोच बदल दिया जाता है। replaceCoach फंक्शन लागू कीजिए जो पैरामीटर के रूप में टीम और उसका नया कोच लेता है, और नए कोच वाली टीम लौटाता है:

let coach = createCoach "Larry Bird" true
let record = createStats 58 24
let team = createTeam "Indiana Pacers" coach record

let newCoach = createCoach "Isiah Thomas" true
replaceCoach team newCoach
// => { Name = "Indiana Pacers"
//      Coach = { Name = "Isiah Thomas"; FormerPlayer = true }
//      Stats = { Wins = 58; Losses = 24 } }

6. एक ही टीम की जाँच कीजिए

आँकड़ों में गहराई से उतरते समय, आप टीमों और उनके रिकॉर्ड की सूचियाँ रख रहे हैं। कभी-कभी आपसे गलती हो जाती है और आपकी सूची में एक ही चीज़ दो बार आ जाती है। isSameTeam फंक्शन लागू कीजिए जो दो टीमें लेता है और true लौटाता है अगर वे एक ही टीम हैं; अन्यथा false लौटाता है:

let pacersCoach = createCoach "Larry Bird" true
let pacersStats = createStats 58 24
let pacersTeam = createTeam "Indiana Pacers" pacersCoach pacersStats

let lakersCoach = createCoach "Del Harris" false
let lakersStats = createStats 61 21
let lakersTeam = createTeam "LA Lakers" lakersCoach lakersStats

isSameTeam pacersTeam lakersTeam
// => false

7. देखिए कि आपको किसी टीम का साथ देना चाहिए या नहीं

कई टीमों और मैचों को देखने के बाद, आपने एक एल्गोरिदम बना लिया है। अगर निम्नलिखित में से कोई एक बात सही है, तो आप उस टीम का साथ देते हैं:

  • कोच का नाम "Gregg Popovich" है
  • कोच पहले खिलाड़ी था
  • टीम का नाम "Chicago Bulls" है
  • टीम ने 60 या उससे अधिक मैच जीते हैं
  • टीम की हार जीत से अधिक है

rootForTeam फंक्शन लागू कीजिए जो एक टीम लेता है और true लौटाता है अगर आपको उस टीम का साथ देना चाहिए; अन्यथा return false:

let spursCoach = createCoach "Gregg Popovich" false
let spursStats = createStats 56 26
let spursTeam = createTeam "San Antonio Spurs" spursCoach spursStats
rootForTeam spursTeam
// => true
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
F# Exercism

बैंडवैगनर शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और F# को 18 कॉन्सेप्ट148 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।