All MicroEvals
Crie, em um único arquivo `index.html`, um solver visual e c...
Create MicroEval
Header image for Crie, em um único arquivo `index.html`, um solver visual e c...

Crie, em um único arquivo `index.html`, um solver visual e c...

Prompt

Crie, em um único arquivo `index.html`, um solver visual e completo de Sokoban usando apenas HTML, CSS e JavaScript puro. Não use bibliotecas, serviços externos ou arquivos adicionais. O foco da avaliação é a correção e a qualidade do algoritmo, não a beleza da interface. ## Formato dos níveis A aplicação deve aceitar níveis em texto ASCII: # = parede espaço = chão . = objetivo @ = jogador $ = caixa * = caixa sobre objetivo + = jogador sobre objetivo Exemplo: ####### # # # .$@ # # # ####### ## Extensão avançada: Sokoban dinâmico Além das regras normais, o solver deve suportar níveis em JSON com: - caixas coloridas; - objetivos coloridos; - placas de pressão; - portas controladas por placas; - pisos de gelo. Exemplo estrutural: { "width": 10, "height": 8, "walls": [[0,0], [0,1]], "player": [3,2], "boxes": [ { "id": "B1", "color": "red", "position": [3,4] } ], "goals": [ { "id": "G1", "color": "red", "position": [5,7] } ], "plates": [ { "id": "P1", "position": [2,3], "controls": ["D1"] } ], "doors": [ { "id": "D1", "position": [4,5] } ], "ice": [[1,2], [1,3]] } ## Caixas e objetivos coloridos - Cada caixa só pode completar um objetivo da mesma cor. - Pode haver várias caixas e objetivos da mesma cor. - Uma caixa sobre um objetivo de cor diferente não conta como concluída. - A heurística precisa respeitar compatibilidade de cores. - O solver deve detectar quando não existe uma atribuição viável entre caixas e objetivos. ## Placas e portas - Uma placa fica ativa enquanto estiver ocupada pelo jogador ou por uma caixa. - Uma porta fica aberta quando pelo menos uma placa que a controla está ativa. - Uma placa pode controlar várias portas. - Uma porta pode ser controlada por várias placas. - A relação padrão é OR: basta uma das placas controladoras estar ativa. - Portas fechadas funcionam como paredes. - Uma ação que faria uma porta fechar sobre o jogador ou uma caixa é inválida. - O estado das portas deve ser recalculado depois de cada movimento. - O estado da busca deve incluir toda informação necessária para distinguir configurações com portas diferentes. ## Gelo - Quando jogador ou caixa entra em uma célula de gelo, continua deslizando na mesma direção. - O deslizamento termina na primeira célula fora do gelo. - Se o próximo movimento estiver bloqueado, a entidade para na célula atual. - O jogador não pode mudar de direção durante o deslizamento. - Uma caixa desliza após ser empurrada para o gelo. - Se uma caixa deslizante atingir outra caixa, ela para antes da colisão. - Se atingir uma parede ou porta fechada, para antes do obstáculo. - Cada célula atravessada conta como um passo. - O empurrão inicial conta como um único empurrão, independentemente da distância percorrida pela caixa. - Placas atravessadas durante um deslizamento não permanecem ativadas. - Ao final de cada deslocamento de uma célula, portas são recalculadas. - Se esse recálculo fechar uma porta sobre uma entidade, toda a ação é inválida e deve ser revertida. ## Ordem formal de uma ação O simulador, solver e validador devem seguir exatamente esta sequência: 1. escolher a direção; 2. verificar se o primeiro deslocamento é permitido; 3. mover jogador ou iniciar o empurrão; 4. aplicar um deslocamento de uma célula; 5. recalcular placas e portas; 6. rejeitar toda a ação se uma porta fechar sobre uma entidade; 7. continuar deslizando se a entidade estiver no gelo; 8. parar quando sair do gelo ou encontrar um bloqueio; 9. registrar o novo estado completo. O solver e o validador devem compartilhar apenas as definições das regras, mas não podem compartilhar resultados, cache ou conclusões sobre validade. ## Otimização A solução ótima deve minimizar, nesta ordem: 1. número de empurrões; 2. número de ações escolhidas pelo jogador; 3. número total de células percorridas, incluindo gelo. O solver deve provar que nenhuma solução lexicograficamente melhor permanece na fronteira antes de declarar optimalidade. ## Testes adicionais obrigatórios Inclua testes para: - caixa colocada no objetivo da cor errada; - caixas da mesma cor competindo por objetivos; - atribuição caixa–objetivo impossível; - caixa usada para manter uma porta aberta; - porta que fecha depois que o jogador deixa uma placa; - ação inválida porque uma porta fecharia sobre uma caixa; - porta aberta por qualquer uma de duas placas; - caixa deslizando sobre várias células de gelo; - caixa parando antes de outra caixa; - gelo que atravessa uma placa sem deixá-la ativa; - solução que exige retirar uma caixa de um objetivo; - solução que exige usar temporariamente uma caixa como peso; - nível solucionável sem gelo, mas impossível devido ao deslizamento; - deadlock envolvendo porta, placa e caixa; - nível em que a solução com menos passos possui mais empurrões; - nível em que duas soluções têm os mesmos empurrões, mas números diferentes de ações. ## Rastreamento e explicação Para cada solução, mostre uma timeline contendo: - estado completo antes da ação; - direção escolhida; - caixas movimentadas; - células atravessadas; - placas ativadas; - portas abertas e fechadas; - estado completo depois da ação; - custo acumulado. Quando uma ação for inválida, o validador deve informar a regra exata e o primeiro subpasso em que ela foi violada. ## Teste metamórfico A suíte também deve verificar propriedades que permanecem verdadeiras após transformar um nível: - renomear IDs não pode mudar o custo ótimo; - espelhar horizontalmente o nível não pode mudar sua solucionabilidade ou custo; - trocar cores de forma consistente não pode mudar o resultado; - alterar a ordem dos arrays do JSON não pode mudar o resultado; - repetir a execução deve produzir exatamente a mesma solução. Cada propriedade deve ser testada gerando automaticamente a versão transformada do nível, executando novamente o solver e comparando os resultados. ## Requisitos gerais obrigatórios Implemente também todas as regras tradicionais do Sokoban: - movimentos apenas nas quatro direções; - caixas podem ser empurradas, nunca puxadas; - apenas uma caixa pode ser empurrada por vez; - jogador e caixas não atravessam paredes, portas fechadas ou outras caixas; - o nível termina apenas quando todas as caixas estão nos objetivos compatíveis; - níveis inválidos devem ser rejeitados; - níveis impossíveis devem ser detectados sem loop infinito. Implemente um validador independente: validateSolution(level, actions) O validador deve reproduzir cada ação desde o estado inicial, incluindo cada subpasso no gelo, e verificar independentemente: - movimentos ilegais; - empurrões ilegais; - estado das placas e portas; - fechamento de porta sobre uma entidade; - colisões; - compatibilidade de cores; - contagem de ações, passos e empurrões; - condição final de vitória. Uma solução só pode ser aceita se passar nesse validador. A interface deve incluir: - editor/importador ASCII e JSON; - visualização do tabuleiro; - Resolver; - Cancelar; - Executar; - Pausar; - avançar e voltar uma ação; - reiniciar; - controle de velocidade; - timeline; - estatísticas da busca; - Executar todos os testes. A busca não pode bloquear a interface. Use Web Worker criado no próprio HTML ou processamento cooperativo. Diferencie claramente: - solução ótima comprovada; - nível provadamente impossível; - limite de tempo atingido; - limite de estados atingido; - execução cancelada; - erro de entrada. Não codifique soluções específicas para os níveis incluídos. O solver deve funcionar com níveis inéditos inseridos pelo usuário. Entregue diretamente um único `index.html` completo e funcional, sem explicações preliminares e sem trechos omitidos ou marcadores como “implementar depois”. ## Semântica sem ambiguidades - Todas as coordenadas JSON usam `[linha, coluna]`, começando em zero. - Toda célula dentro de `width × height` é chão, exceto quando estiver em `walls`. - No formato ASCII, caixas e objetivos possuem implicitamente a cor `"neutral"`. - O estado inicial das portas é calculado pela ocupação inicial das placas. - Uma porta sem nenhuma placa controladora torna o nível inválido. - IDs de caixas, placas e portas devem ser únicos. - Deve existir exatamente um jogador. - Para cada cor, a quantidade de caixas deve ser igual à quantidade de objetivos. - Paredes e portas não podem ocupar a mesma célula. - Portas, placas e gelo não podem compartilhar a mesma célula. - Objetivos podem coexistir com placas ou gelo. - Jogador e caixas podem começar sobre objetivos, placas ou gelo. - Entidades inicialmente sobre gelo permanecem paradas até participarem de uma ação. Durante um empurrão: 1. o jogador avança exatamente uma célula, ocupando a posição anterior da caixa; 2. a

A system prompt was added to support web rendering