O décimo quinto dia do Advent of Code foi ontem 15/12/2024! Se você caiu aqui hoje pela primeira vez, não deixe de ler os posts sobre o Dia 1, Dia 2, Dia 3, Dia 4, Dia 5, Dia 6, Dia 7, Dia 8, Dia 9, Dia 10, Dia 11, Dia 12, Dia 13 e Dia 14.
Classifiquei o décimo quinto problema como médio (parte 1) e médio (parte 2).
Dicas
- A primeira parte do problema é ler o labirinto (armazém) e os comandos do robô.
- Utilize as entradas de exemplo para testar a solução.
- Você precisa detectar na entrada do labirinto, onde estão as paredes, o robô e as caixas.
- Os comandos estão em várias linhas, fica mais fácil se você concatená-las em uma só string.
- Você pode implementar as direções do robô (comandos) usando vetores.
- Vetores também podem ser utilizados para marcar as posições das caixas e paredes.
- As paredes circundam todo o armazém, você não precisa de preocupar com o robô saindo do armazém.
- Para verificar se o robô pode se mexer, verifique se a nova posição está livre. Neste caso, mova o robô, atualizando a posição.
- Se a posição seguinte for ocupada por uma parede, o robô não pode se mexer e fica no mesmo lugar.
- Para saber se pode mover as caixas, você pode tentar recursivamente todas as caixas a partir da direção do movimento. A cada caixa, verifique se ela pode se mover (espaço em branco na direção do movimento). Caso uma das caixas não possa ser movida, o movimento é cancelado.
- Lembre-se que o robô pode empurrar várias caixas ao mesmo tempo. Uma função recursiva pode ajudar a resolver este problema.
- Na parte 1, as caixas são do mesmo tamanho das paredes, ou seja, cada caixa ocupa uma posição. Na parte 2, cada caixa ocupa duas posições.
- A parte 2 é um pouco mais complexa, pois você pode mover mais que colunas e linhas de caixas, mas partes inteiras do armazém.
- O movimento horizontal é semelhante ao da parte 1, pois cada caixa tem altura de apenas um caractere, como na parte 1.
- Cada movimento na parte 2 pode mover até 2 caixas ao mesmo tempo. Mas esse movimento é feito em cascata, logo estas duas caixas podem mover outras 2, 3, ou mais caixas. Cada movimento de caixa pode movimentar a cada passo, zero, uma ou duas caixas, mas pode ocasionar o movimento de muitas outras.
- Na parte 2, você precisa verificar se o movimento inteiro é válido. Por exemplo, quando as caixas sendo empurradas formam um V ou ficam presas em uma parede, todas tem que parar de se mover. Se você implementar a função de movimento como na parte 1, verá que as caixas vão se mexer em vários pedaços, o que leva a resposta errada.
Quanto de Python você precisa saber?
Os capítulos se referem ao meu livro Introdução à Programação com Python.