Menu
Coddy logo textTech

Confronta le settimane

Fa parte della sezione Logica e flusso del percorso Swift di Coddy. Lezione 37 di 56.

Funzionalità finale: prendi i dati di due settimane e segnala la variazione per ogni abitudine.

Ogni settimana è un elenco separato di operazioni habit:day su una propria riga. Crea due dizionari come hai fatto finora, poi confrontali.

L'insieme interessante di abitudini è l'unione delle chiavi di entrambe le settimane (un'abitudine potrebbe comparire in una settimana ma non nell'altra). Itera su tale unione in ordine alfabetico.

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

?? 0 gestisce il caso della chiave mancante. weekA[name]?.count è il modo con concatenamento opzionale per leggere un conteggio senza prima scartare il valore opzionale; restituisce nil quando la chiave non è presente, che ?? 0 trasforma in zero.

challenge icon

Sfida

Medio

Leggi due righe di input, ciascuna contenente un elenco di voci habit:day separate da virgole (una per settimana). Per ogni abitudine presente in una delle due settimane, stampa una riga in questo formato:

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

dove a è il conteggio dei giorni unici della settimana 1, b è il conteggio dei giorni unici della settimana 2 e arrow è:

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

Stampa le abitudini in ordine alfabetico. Dopo le righe per abitudine, stampa una riga riepilogativa:

Improved: <n>

dove n è il numero di abitudini con freccia UP.

Con l'input read:1,read:3,workout:2 sulla riga 1 e read:1,read:2,read:5,yoga:7 sulla riga 2, l'output è:

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

Provalo tu

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: unione delle chiavi; per ogni abitudine '<name>: a -> b ARROW'; poi 'Improved: <n>'
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Playground Swift