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.
Desafio
MédioLeia 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 é:
UPquandob > aDOWNquandob < aSAMEquandob == 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: 2Folha 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>'
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
1Strings a Fundo
Contagem e ÍndicesCase e TrimBusca em StringsDivisão e JunçãoSubstituindo SubstringsRecapitulação - Verificação de Nome de Usuário4Conjuntos
Criando ConjuntosUnião e InterseçãoSubtração e Diferença SimétricaSubconjunto e SuperconjuntoRecapitulação - Filtro de Tags7Projeto - Monitor de Hábitos
Visão Geral do ProjetoMarcar como Concluído10Projeto - Mecanismo de Quiz
Visão Geral do ProjetoFazer Perguntas2Intervalos e Strides
Fechado vs Meio-AbertoStrideMétodos de IntervaloIntervalos no SwitchRecapitulação - Grade de Calendário5Funções de Ordem Superior Parte 1
MapFilterReduceEncadeando map, filter, reduceRecapitulação - Estatísticas de Palavras