Trilhas
/
Swift
Swift
/
Exercícios
/
Placar de Recordes
Placar de Recordes

Placar de Recordes

Exercício de aprendizagem

Introdução

Dicionários são um dos principais tipos de coleção do Swift. Um dicionário armazena associações não ordenadas entre chaves únicas e os valores correspondentes. Todas as chaves de um dicionário precisam ser do mesmo tipo, e todos os valores também precisam compartilhar o mesmo tipo.

Os literais de dicionário são escritos como pares key: value separados por vírgula e entre colchetes:

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
]

Os tipos de dicionário podem ser escritos explicitamente de duas formas: Dictionary<Key, Value> ou a sintaxe abreviada [Key: Value].

Para criar um dicionário vazio, especifique explicitamente os tipos de chave e de valor:

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

Acessando valores

Você pode acessar valores usando a notação de subscrito: coloque a chave entre colchetes depois do nome do dicionário. Como uma chave pode não existir no dicionário, o acesso por subscrito retorna um optional (Value?). Se a chave estiver presente, o Swift retorna o valor encapsulado; se não estiver, retorna 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

Para não precisar lidar com optionals, você pode fornecer um valor padrão usando o parâmetro 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"

Modificando dicionários

Em dicionários mutáveis declarados com var, você pode adicionar ou atualizar pares de chave-valor usando atribuição por subscrito:

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

Iterando sobre um dicionário

Você pode iterar sobre cada par de chave-valor de um dicionário usando um laço for-in. Cada item é fornecido como uma tupla (key, value):

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

Ordenando dicionários

Como os dicionários não têm ordem, ordená-los produz um array de pares de chave-valor. Você pode passar uma closure ao método sorted(by:) que compara duas tuplas (key, value) e retorna true se a primeira tupla deve aparecer antes da segunda:

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)

Instruções

Neste exercício, você vai implementar uma forma de acompanhar as pontuações máximas do jogo mais popular do fliperama da sua região.

Você tem 7 funções para implementar, todas relacionadas a retornar e manipular um dicionário de dados de pontuações máximas.

1. Defina um novo dicionário de pontuações máximas

Crie uma função newScoreBoard() que não recebe parâmetros e retorna um novo dicionário de pontuações máximas que usa valores do tipo String para as chaves e valores do tipo Int como os valores.

2. Adicione jogadores ao dicionário de pontuações máximas

Para adicionar um jogador ao dicionário de pontuações máximas, defina addPlayer(_:_:_:), uma função que recebe 3 parâmetros:

  • O primeiro parâmetro é o dicionário de pontuações. Ele deve ser um parâmetro de entrada e saída.
  • O segundo parâmetro é o nome de um jogador como string.
  • O terceiro parâmetro é a pontuação como um número inteiro. O parâmetro é opcional; implemente o terceiro parâmetro com um valor padrão de 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. Remova jogadores do dicionário de pontuações

Para remover um jogador do dicionário de pontuações máximas, defina removePlayer(_:_:), que recebe 2 parâmetros:

  • O primeiro parâmetro é o dicionário de pontuações. Ele deve ser um parâmetro de entrada e saída.
  • O segundo parâmetro é o nome do jogador como string.

Essa função deve remover o jogador do dicionário se ele estiver nele e não fazer nada caso contrário.

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. Redefina a pontuação de um jogador

Para redefinir a pontuação de um jogador, defina resetPlayer(_:_:), que recebe 2 parâmetros:

  • O primeiro parâmetro é o dicionário de pontuações. Ele deve ser um parâmetro de entrada e saída.
  • O segundo parâmetro é o nome do jogador como string, cuja pontuação você deseja redefinir.

A função define a pontuação do jogador como 0. Se o jogador não estiver no dicionário, nada deve acontecer.

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

5. Atualize a pontuação de um jogador

Para atualizar a pontuação de um jogador somando à pontuação anterior, defina updateScore, que recebe 3 parâmetros:

  • O primeiro parâmetro é o dicionário de pontuações. Ele deve ser um parâmetro de entrada e saída.
  • O segundo parâmetro é o nome do jogador como string, cuja pontuação você deseja atualizar.
  • O terceiro parâmetro é a pontuação que você deseja somar à pontuação máxima armazenada.
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. Obtenha uma lista de jogadores com pontuações ordenada pelo nome do jogador

Defina a função orderByPlayers, que recebe 1 parâmetro:

  • O primeiro parâmetro é o dicionário de pontuações.

A função retorna um array de tuplas (String, Int) que são os jogadores e suas pontuações máximas, ordenadas em ordem crescente pelo nome do jogador.

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. Obtenha uma lista de jogadores ordenada pela pontuação do jogador em ordem decrescente

Para obter uma lista de jogadores ordenada pelas pontuações em ordem decrescente, defina orderByScores, que recebe 1 parâmetro:

  • O primeiro parâmetro é o dicionário de pontuações.

A função retorna um array de tuplas (String, Int) que são os jogadores e suas pontuações máximas, ordenadas em ordem decrescente pela pontuação do jogador.

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)]
Editar via GitHub O link abre em uma nova janela ou aba
Swift Exercism

Tudo pronto para começar Placar de Recordes?

Crie sua conta no Exercism para aprender e dominar Swift com 35 conceitos116 exercícios e mentoria humana de verdade, tudo de graça.