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.
Sfida
MedioLeggi 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 è:
UPquandob > aDOWNquandob < aSAMEquandob == 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: 2Provalo 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>'
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Conteggio e indiciMaiuscole, minuscole e rimozione degli spaziRicerca nelle stringheSuddivisione e unioneSostituzione di sottostringheRiepilogo - Verifica del nome utente4Insiemi
Creare insiemiUnione e intersezioneDifferenza e differenza simmetricaSottoinsieme e sovrainsiemeRiepilogo - Filtro per tag7Progetto - Tracciatore di abitudini
Panoramica del progettoSegna come completato10Progetto - Motore di quiz
Panoramica del progettoPorre domande2Intervalli e passi
Intervalli chiusi e semiapertiPassoMetodi degli intervalliIntervalli in switchRiepilogo - Griglia del calendario5Funzioni di ordine superiore Parte 1
MapFilterReduceConcatenare map, filter e reduceRiepilogo - Statistiche sulle paroleEsercitati da solo: Playground Swift