Menu
Coddy logo textTech

Comparar semanas

Parte de la sección Lógica y Flujo del Journey de Swift de Coddy — lección 37 de 56.

Funcionalidad final: toma dos semanas de datos e informa el cambio por hábito.

Cada semana es su propia lista de operaciones habit:day en su propia línea. Construye dos diccionarios de la misma manera que lo has estado haciendo, luego compáralos.

El conjunto interesante de hábitos es la unión de claves a través de ambas semanas (un hábito puede aparecer en una semana pero no en la otra). Itera esa unión ordenada alfabéticamente.

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)")
}

El ?? 0 maneja el caso de clave faltante. El weekA[name]?.count es la forma con encadenamiento opcional de leer un conteo sin desempaquetar primero, devuelve nil cuando la clave no está presente, lo cual el ?? 0 convierte en cero.

challenge icon

Desafío

Intermedio

Lee dos líneas de entrada, cada una con una lista separada por comas de entradas habit:day (una por semana). Para cada hábito que aparezca en cualquiera de las dos semanas, imprime una línea con este formato:

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

donde a es el recuento de días únicos de la semana 1, b es el recuento de días únicos de la semana 2, y arrow es:

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

Imprime los hábitos en orden alfabético. Después de las líneas por hábito, imprime una línea de resumen:

Improved: <n>

donde n es el recuento de hábitos con la flecha UP.

Para la entrada read:1,read:3,workout:2 en la línea 1 y read:1,read:2,read:5,yoga:7 en la línea 2, la salida es:

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

Hoja de referencia

Para obtener la unión de claves de dos diccionarios e iterar alfabéticamente:

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 utiliza el encadenamiento opcional para obtener el conteo sin desempaquetar; devuelve nil si falta la clave. ?? 0 convierte ese nil en cero.

Pruébalo tú mismo

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ón de claves; por hábito '<name>: a -> b ARROW'; luego 'Improved: <n>'
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo