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.
Desafío
IntermedioLee 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:
UPcuandob > aDOWNcuandob < aSAMEcuandob == 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: 2Hoja 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>'
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
1Strings a fondo
Conteo e índicesMayúsculas, minúsculas y TrimBúsqueda en StringsDividir y unirReemplazo de subcadenasResumen: Validación de usuario4Conjuntos
Crear conjuntosUnión e intersecciónResta y diferencia simétricaSubconjunto y superconjuntoResumen - Filtro de etiquetas7Proyecto - Seguimiento de hábitos
Descripción general del proyectoMarcar como completado10Proyecto - Motor de cuestionarios
Descripción general del proyectoHacer preguntas2Rangos e Intervalos
Cerrados vs. SemiabiertosSaltos (Stride)Métodos de RangosRangos en SwitchResumen - Cuadrícula de calendario5Funciones de orden superior Pt. 1
MapFilterReduceEncadenar map, filter, reduceResumen - Estadísticas de palabras