Kurzusok
/
Swift
Swift
/
Feladatok
/
Pontszámtábla
Pontszámtábla

Pontszámtábla

Tanulófeladat

Bevezetés

A szótárak a Swift egyik elsődleges gyűjteménytípusa. A szótár rendezetlen hozzárendeléseket tárol egyedi kulcsok és a hozzájuk tartozó értékek között. A szótárban minden kulcsnak azonos típusúnak kell lennie, és minden értéknek is ugyanazt a típust kell képviselnie.

A szótárliterálok vesszővel elválasztott key: value párokból állnak, szögletes zárójelbe zárva:

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
]

A szótártípusokat kétféleképpen írhatod le explicit módon: Dictionary<Key, Value> formában vagy a rövidített [Key: Value] szintaxissal.

Üres szótár létrehozásához add meg explicit módon a kulcs és az érték típusát:

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

Értékek elérése

Az értékeket indexelő jelöléssel érheted el: a szótár neve után szögletes zárójelbe írd a kulcsot. Mivel előfordulhat, hogy egy kulcs nincs benne a szótárban, az indexelő hozzáférés egy opcionális értéket (Value?) ad vissza. Ha a kulcs létezik, a Swift a becsomagolt értéket adja vissza, ha nem, akkor nil-t:

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

Ha el akarod kerülni az opcionálisokkal való munkát, megadhatsz egy alapértelmezett értéket a default paraméterrel:

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"

Szótárak módosítása

A var-ral deklarált módosítható szótáraknál indexelő értékadással adhatsz hozzá vagy frissíthetsz kulcs-érték párokat:

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

Szótár bejárása

A szótár minden kulcs-érték párján végigmehetsz egy for-in ciklussal. Minden elem egy (key, value) tuple-ként jelenik meg:

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

Szótárak rendezése

Mivel a szótárak rendezetlenek, a rendezésük kulcs-érték párok tömbjét eredményezi. A sorted(by:) metódusnak átadhatsz egy closure-t, amely két (key, value) tuple-t hasonlít össze, és true-t ad vissza, ha az első tuple-nek a második előtt kell szerepelnie:

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)

Utasítások

Ebben a feladatban egy módot valósítasz meg arra, hogy nyomon kövesd a helyi játéktermed legnépszerűbb játékának csúcspontszámait.

Hét függvényt kell megvalósítanod, amelyek mindegyike egy csúcspontszám-adatokat tároló szótár visszaadásához és módosításához kapcsolódik.

1. Definiálj egy új csúcspontszám-szótárat

Hozz létre egy newScoreBoard() függvényt, amely nem vár paramétert, és egy új csúcspontszám-szótárat ad vissza, amelyben a kulcsok String, az értékek pedig Int típusúak.

2. Adj játékosokat a csúcspontszám-szótárhoz

Ha játékost szeretnél hozzáadni a csúcspontszám-szótárhoz, definiáld az addPlayer(_:_:_:) függvényt, amely 3 paramétert vár:

  • Az első paraméter a pontszámok szótára. Ennek in-out paraméternek kell lennie.
  • A második paraméter a játékos neve stringként.
  • A harmadik paraméter a pontszám egész számként. A paraméter opcionális, a harmadik paramétert 0 alapértelmezett értékkel valósítsd meg.
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. Távolítsd el a játékosokat a pontszámok szótárából

Ha el szeretnél távolítani egy játékost a csúcspontszám-szótárból, definiáld a removePlayer(_:_:) függvényt, amely 2 paramétert vár:

  • Az első paraméter a pontszámok szótára. Ennek in-out paraméternek kell lennie.
  • A második paraméter a játékos neve stringként.

A függvény távolítsa el a játékost a szótárból, ha benne van, egyébként pedig ne tegyen semmit.

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. Állítsd vissza egy játékos pontszámát

Ha vissza szeretnéd állítani egy játékos pontszámát, definiáld a resetPlayer(_:_:) függvényt, amely 2 paramétert vár:

  • Az első paraméter a pontszámok szótára. Ennek in-out paraméternek kell lennie.
  • A második paraméter a játékos neve stringként, akinek a pontszámát vissza szeretnéd állítani.

A függvény a játékos pontszámát 0-ra állítja. Ha a játékos nincs benne a szótárban, akkor ne történjen semmi.

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

5. Frissítsd egy játékos pontszámát

Ha úgy szeretnéd frissíteni egy játékos pontszámát, hogy hozzáadsz az előző pontszámhoz, definiáld az updateScore függvényt, amely 3 paramétert vár:

  • Az első paraméter a pontszámok szótára. Ennek in-out paraméternek kell lennie.
  • A második paraméter a játékos neve stringként, akinek a pontszámát frissíteni szeretnéd.
  • A harmadik paraméter a pontszám, amelyet hozzá szeretnél adni a tárolt csúcspontszámhoz.
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. Kérj listát a játékosokról a nevük szerint rendezett pontszámokkal

Definiáld az orderByPlayers függvényt, amely 1 paramétert vár:

  • Az első paraméter a pontszámok szótára.

A függvény egy (String, Int) tuple-ökből álló tömböt ad vissza, ami a játékosokat és csúcspontszámaikat tartalmazza, a játékos neve szerint növekvő sorrendbe rendezve.

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. Kérj listát a játékosokról a pontszámuk szerint csökkenő sorrendben

Ha listát szeretnél kapni a játékosokról a pontszámuk szerint csökkenő sorrendben, definiáld az orderByScores függvényt, amely 1 paramétert vár:

  • Az első paraméter a pontszámok szótára.

A függvény egy (String, Int) tuple-ökből álló tömböt ad vissza, ami a játékosokat és csúcspontszámaikat tartalmazza, a játékos pontszáma szerint csökkenő sorrendbe rendezve.

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)]
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Swift Exercism

Készen állsz elkezdeni a(z) Pontszámtábla feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Swift nyelvet 35 fogalom116 feladat segítségével, valódi emberi mentorálással, mindez ingyen.