Simulador de Poções
1. Visão Geral do Problema e Arquitetura da Solução
O simulador funciona como um interpretador de comandos sequenciais. Você recebe um estado inicial (Estabilidade e Volume) e deve processar uma linha de texto contendo múltiplas instruções separadas por ponto e vírgula (;).
A cada instrução processada, três coisas podem acontecer:
- Alteração direta dos atributos da poção (Estabilidade e Volume).
- Ocorrência de um conflito de ingredientes (se adicionados consecutivamente sem uma ação intermediária).
- Violação de uma regra crítica de segurança (causando a interrupção imediata do preparo com
FALHA).
2. Revisão dos Assuntos Pertinentes
Para resolver este problema de forma, vamos revisar alguns conceitos:
2.1. Manipulação e Higienização de Strings
As instruções fornecidas na entrada não seguem uma padronização exata. Podem conter espaços extras no início ou fim, além de letras maiúsculas e minúsculas misturadas (ex: aDiCiONAR AgUa Da lUa).
.lower(): Retorna uma cópia da string com todas as letras em minúsculo..strip(): Remove os espaços em branco no início e no final da string..split(separador): Divide uma string em uma lista de sub-strings com base em um caractere delimitador. Qual o caracter delimitador nesse caso?- Fatiamento (Slicing) ou Métodos de Verificação: Para saber se uma instrução é a adição de um ingrediente, você pode verificar se ela começa com um texto específico (ex: usar
.startswith("alguma coisa")ou verificar o pedaço inicial da stringinstrucao[:10]).
2.2. Dicionários Aninhados (Dicionários de Dicionários)
O grimorio fornecido é uma estrutura de dados aninhada. Para acessar as informações de um item, você precisa navegar por múltiplos níveis de chaves.
Exemplo conceitual de acesso:
# Para acessar o tipo de um ingrediente específico:
tipo_do_item = grimorio['ingredientes'][nome_do_ingrediente]['tipo']
# Para acessar a alteração de estabilidade de uma ação:
alt_estabilidade = grimorio['acoes'][nome_da_acao]['estabilidade']Dica: Se você tentar acessar uma chave que não existe no dicionário, o Python gerará um erro do tipo KeyError. Certifique-se de limpar a string do comando perfeitamente antes de usá-la como chave.
2.3. Controle de Fluxo e Estruturas de Repetição (Loops e Break)
Você precisará iterar sobre a lista de instruções. Como o enunciado diz que o preparo é interrompido imediatamente se uma das métricas falhar, lembre-se que você pode interromper qualquer tipo de laço utilizando o comando break.
As verificações de segurança devem ocorrer após cada modificação dos valores de estabilidade e volume da poção.
2.4. Variáveis de Estado
O simulador precisa “lembrar” do que aconteceu no passo anterior para identificar se houve conflito entre ingredientes.
- Se o comando atual for a adição de um ingrediente, você deve verificar qual foi o tipo do último ingrediente adicionado.
- Se o comando atual for uma Ação, o histórico de ingrediente anterior deve ser “limpo” ou “reiniciado”, pois ações quebram a consecutividade das adições.
Fique atento a alguns pontos como:
- Faz diferença eu adicionar
reagentedepoisbaseoubasedepoisreagente? - E no caso de
reagente,organicoe depoisbase? Há conflito?
3. Desestruturando a Lógica Passo a Passo
Planeje seu código antes de começar a escrever. Não dá certo resolver tudo em uma sentada!
Lembre-se:
- Entrada: quais são os valores de entrada? Você vai processar as instruções conforme lê ou guardando elas numa lista? Você vai “padronizar” a forma das instruções antes ou depois?
- Processamento: a cada instrução, à uma série de atributos sobre a poção que precisam ser atualizados. Lembre-se que, ao violar as condições de estabilidade ou volume, o processamento é interrompido imediatamente e a poção falha.
- Saída: após processar, você pode verificar se deu tudo certo (ou não) e o que precisa ser impresso.
4. Pontos de Maior Dificuldade dos Alunos
- Casamento de Chaves de Conflito: No
grimorio, as chaves de conflito estão estruturadas no formato'tipo1+tipo2'(ex:'reagente+base'). No entanto, a ordem em que os ingredientes são colocados pode variar. Se um aluno adicionar umabasee depois umreagente, a string montada pode acabar sendo'base+reagente', que não existe no dicionário e causará um erro. É preciso pensar em uma forma de validar a combinação independentemente da ordem em que os dois tipos aparecem. - Extração do Nome do Ingrediente: Separar o texto fixo
"adicionar "do nome real do ingrediente exige atenção com os índices de fatiamento ou com substituições de strings, lembrando sempre de higienizar o resultado. - Ordem das Operações no Conflito: O enunciado e a explicação passo a passo mostram que quando ocorre um conflito, os atributos do ingrediente atual alteram a poção, mas os efeitos do conflito também alteram a estabilidade e o volume. Fique atento à ordem correta descrita no exemplo do passo a passo (Teste 03) para garantir que as métricas não zerem antes da hora ou computem valores errados.
- DICA! Apenas 40% dos casos de testes possuem conflitos na saída. Logo, antes de começar a se preocupar com os conflitos, tente codar desconsiderando essa parte e confira se você está passando nos casos sem
Efeitos ocorridos:.
5. Problemas e Erros Comuns (O que EVITAR)
Não interromper o loop imediatamente após a falha:
Muitos alunos verificam as métricas apenas no final do programa, depois que o laço processou todas as instruções. Se a poção explodir ou evaporar no passo 2, nenhum outro comando subsequente deveria ser processado. Continuar a execução distorcerá os valores finais de Estabilidade e Volume.
Esquecer de resetar o histórico após uma Ação:
Se o aluno adicionar um ingrediente do tipo catalisador, depois executar a ação mexer e, em seguida, adicionar um ingrediente do tipo reagente, não deve ocorrer conflito. Se o seu código esquecer de limpar o “último tipo adicionado” quando uma ação acontece, o simulador acusará um conflito falso.
Iniciar o Volume Atual com o valor do Volume Máximo:
O volume máximo do caldeirão é o limite de capacidade (volume_maximo), mas o volume inicial do líquido da poção sempre começa em 0. Cuidado para não confundir as duas variáveis na hora de fazer contas.
Modificar o dicionário original do Grimório:
Não tente alterar a estrutura do dicionário grimorio fornecido no código base. Use-o estritamente para leitura e consulta de informações.
Não tratar espaços extras gerados pelo .split(';'):
Se a entrada terminar com um ponto e vírgula (ex: mexer; esfriar;), o método .split(';') gerará uma string vazia '' como último elemento da lista. Se o seu código tentar buscar essa string vazia no dicionário de ações ou ingredientes sem verificar antes se ela é válida, o programa quebrará com KeyError.
Bom trabalho no desenvolvimento do código! Testem cada comando isoladamente antes de juntar tudo no programa final e podem me mandar as dúvidas por email!