Menu
Coddy logo textTech

Comparar Semanas

Parte da seção Lógica e Fluxo do Journey de Swift da Coddy — lição 37 de 56.

Recurso final: pegue duas semanas de dados e relate a mudança por hábito.

Cada semana é sua própria lista de operações habit:day em sua própria linha. Construa dois dicionários da mesma forma que você tem feito e, em seguida, compare-os.

O conjunto interessante de hábitos é a união de chaves em ambas as semanas (um hábito pode aparecer em uma semana, mas não na outra). Itere sobre essa união ordenada alfabeticamente.

let allKeys = Set(weekA.keys).union(weekB.keys).sorted()
for name in allKeys {
    let a = weekA[name]?.count ?? 0
    let b = weekB[name]?.count ?? 0
    print("\(name): \(a) -> \(b)")
}

O ?? 0 trata o caso de chave ausente. O weekA[name]?.count é a forma com encadeamento opcional de ler uma contagem sem fazer o unwrap primeiro; ele retorna nil quando a chave não existe, o que o ?? 0 transforma em zero.

challenge icon

Desafio

Médio

Leia duas linhas de entrada, cada uma sendo uma lista separada por vírgulas de entradas habit:day (uma por semana). Para cada hábito que aparecer em qualquer uma das semanas, imprima uma linha neste formato:

<habit>: <a> -> <b> <arrow>

onde a é a contagem de dias únicos da semana 1, b é a contagem de dias únicos da semana 2, e arrow é:

  • UP quando b > a
  • DOWN quando b < a
  • SAME quando b == a

Imprima os hábitos em ordem alfabética. Após as linhas por hábito, imprima uma linha de resumo:

Improved: <n>

onde n é a contagem de hábitos com a seta UP.

Para a entrada read:1,read:3,workout:2 na linha 1 e read:1,read:2,read:5,yoga:7 na linha 2, a saída é:

read: 2 -> 3 UP
workout: 1 -> 0 DOWN
yoga: 0 -> 1 UP
Improved: 2

Folha de consulta

Para obter a união de chaves de dois dicionários e iterar em ordem alfabética:

let allKeys = Set(weekA.keys).union(weekB.keys).sorted()
for name in allKeys {
    let a = weekA[name]?.count ?? 0
    let b = weekB[name]?.count ?? 0
    print("\(name): \(a) -> \(b)")
}

weekA[name]?.count usa encadeamento opcional para obter a contagem sem desembrulhar; retorna nil se a chave estiver ausente. ?? 0 converte esse nil para zero.

Experimente você mesmo

func parse(_ line: String) -> [String: [Int]] {
    var habits: [String: [Int]] = [:]
    if line.isEmpty { return habits }
    for op in line.components(separatedBy: ",") {
        let parts = op.components(separatedBy: ":")
        let day = Int(parts[1])!
        if !(habits[parts[0], default: []].contains(day)) {
            habits[parts[0], default: []].append(day)
        }
    }
    return habits
}
let weekA = parse(readLine()!)
let weekB = parse(readLine()!)

// TODO: união das chaves; por hábito '<name>: a -> b ARROW'; depois 'Improved: <n>'
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo