Track
/
Swift
Swift
/
Esercizi
/
Tabellone dei punteggi
Tabellone dei punteggi

Tabellone dei punteggi

Esercizio di apprendimento

Introduzione

I dizionari sono uno dei tipi di collezione principali di Swift. Un dizionario memorizza associazioni non ordinate tra chiavi uniche e i valori corrispondenti. Tutte le chiavi di un dizionario devono essere dello stesso tipo, ed anche tutti i valori devono condividere lo stesso tipo.

I literal dei dizionari si scrivono come coppie key: value separate da virgole e racchiuse tra parentesi quadre:

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
]

I tipi dei dizionari si possono scrivere esplicitamente in due modi: Dictionary<Key, Value> oppure la sintassi abbreviata [Key: Value].

Per creare un dizionario vuoto, specifica esplicitamente i tipi delle chiavi e dei valori:

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

Accesso ai valori

Puoi accedere ai valori usando la notazione subscript: metti la chiave tra parentesi quadre dopo il nome del dizionario. Poiché una chiave potrebbe non esistere nel dizionario, l'accesso tramite subscript restituisce un optional (Value?). Se la chiave è presente, Swift restituisce il valore incapsulato; in caso contrario, restituisce 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

Per evitare di lavorare con gli optional, puoi fornire un valore predefinito usando il parametro 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"

Modificare i dizionari

Per i dizionari mutabili dichiarati con var, puoi aggiungere o aggiornare coppie chiave-valore tramite assegnazione con subscript:

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

Iterare su un dizionario

Puoi iterare su ogni coppia chiave-valore di un dizionario usando un ciclo for-in. Ogni elemento viene fornito come una tupla (key, value):

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

Ordinare i dizionari

Poiché i dizionari non sono ordinati, ordinarli produce un array di coppie chiave-valore. Puoi passare una closure al metodo sorted(by:) che confronta due tuple (key, value) e restituisce true se la prima tupla deve comparire prima della seconda:

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)

Istruzioni

In questo esercizio, implementerai un modo per tenere traccia dei punteggi più alti del gioco più popolare della tua sala giochi.

Hai 7 funzioni da implementare, tutte legate alla restituzione e alla manipolazione di un dizionario di dati sui punteggi.

1. Definire un nuovo dizionario dei punteggi

Crea una funzione newScoreBoard() che non accetta parametri e restituisce un nuovo dizionario dei punteggi, che usa valori di tipo String per le chiavi e valori di tipo Int come valori.

2. Aggiungere giocatori al dizionario dei punteggi

Per aggiungere un giocatore al dizionario dei punteggi, definisci addPlayer(_:_:_:), una funzione che accetta 3 parametri:

  • Il primo parametro è il dizionario dei punteggi. Deve essere un parametro in-out.
  • Il secondo parametro è il nome di un giocatore, come stringa.
  • Il terzo parametro è il punteggio, come numero intero. Il parametro è opzionale: implementa il terzo parametro con un valore predefinito di 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. Rimuovere giocatori dal dizionario dei punteggi

Per rimuovere un giocatore dal dizionario dei punteggi, definisci removePlayer(_:_:), che accetta 2 parametri:

  • Il primo parametro è il dizionario dei punteggi. Deve essere un parametro in-out.
  • Il secondo parametro è il nome del giocatore, come stringa.

Questa funzione deve rimuovere il giocatore dal dizionario se è presente, altrimenti non deve fare nulla.

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. Azzerare il punteggio di un giocatore

Per azzerare il punteggio di un giocatore, definisci resetPlayer(_:_:), che accetta 2 parametri:

  • Il primo parametro è il dizionario dei punteggi. Deve essere un parametro in-out.
  • Il secondo parametro è il nome del giocatore, come stringa, il cui punteggio vuoi azzerare.

La funzione imposta a 0 il punteggio del giocatore. Se il giocatore non è nel dizionario, non deve succedere nulla.

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

5. Aggiornare il punteggio di un giocatore

Per aggiornare il punteggio di un giocatore aggiungendolo al punteggio precedente, definisci updateScore, che accetta 3 parametri:

  • Il primo parametro è il dizionario dei punteggi. Deve essere un parametro in-out.
  • Il secondo parametro è il nome del giocatore, come stringa, il cui punteggio vuoi aggiornare.
  • Il terzo parametro è il punteggio che vuoi aggiungere al punteggio più alto memorizzato.
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. Ottenere un elenco di giocatori con i punteggi ordinati per nome

Definisci la funzione orderByPlayers, che accetta 1 parametro:

  • Il primo parametro è il dizionario dei punteggi.

La funzione restituisce un array di tuple (String, Int) che sono i giocatori e i loro punteggi più alti, ordinati in ordine crescente per nome del giocatore.

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. Ottenere un elenco di giocatori ordinati per punteggio in ordine decrescente

Per ottenere un elenco di giocatori ordinati per punteggio in ordine decrescente, definisci orderByScores, che accetta 1 parametro:

  • Il primo parametro è il dizionario dei punteggi.

La funzione restituisce un array di tuple (String, Int) che sono i giocatori e i loro punteggi più alti, ordinati in ordine decrescente per punteggio del giocatore.

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)]
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Swift Exercism

Vuoi iniziare Tabellone dei punteggi?

Iscriviti a Exercism per imparare e padroneggiare Swift con 35 concetti116 esercizi e il mentoring di persone reali, tutto gratis.