A tinta preta escura espalhou-se por toda a folha de papel da impressora! A solução óbvia é dobrar o papel para que as partes em preto e branco se encontrem e ambas se tornem cinza à medida que a tinta se difunde. Depois, desdobre e desdobre até o papel ficar igualmente cinza.
Encontrar a melhor maneira de fazer essas dobras é sua tarefa neste desafio de codificação. Este Pastebin contém quatro grades de tamanhos diferentes de uns e zeros. Cada grade representa um pedaço de papel espalhado por tinta que você deve ficar cinza. Zeros são papel e outros são tinta.
Nestas grades, apenas dobras horizontais e verticais ao longo dos espaços entre linhas e colunas são válidas. Quando uma dobra é feita, os pares de valores sobrepostos são calculados como média. As dobras são feitas uma de cada vez e sempre se desdobram. As dobras alteram apenas a distribuição da tinta, não o tamanho do papel.
Rn denota dobrar a borda esquerda da grade para a direita, começando após a enésima coluna. Dn denota dobrar a borda superior da grade para baixo, começando após a enésima linha. (n é indexado 1)
Exemplo
Dada esta grade
0 1 1 1
0 0 0 0
0 0 0 0
uma dobra D1 significa "dobre toda a linha superior para baixo e desdobre".
0 0.5 0.5 0.5
0 0.5 0.5 0.5
0 0 0 0
Então um R2 produzirá
0.25 0.5 0.5 0.25
0.25 0.5 0.5 0.25
0 0 0 0
e outro R2 não vai mudar nada.
Objetivo
Seu objetivo é escrever um algoritmo que encontre a melhor sequência de dobras de espalhamento de tinta para cada uma das quatro grades, usando exatamente 8 dobras de cada vez. As dobras podem ser qualquer combinação de Rs ou Ds.
Pontuação
A pontuação do seu envio é a soma das suas pontuações para cada grade. A pontuação de uma grade é a soma das diferenças absolutas entre cada um de seus valores e sua média (sua soma dividida por sua área). Pontuações mais baixas são melhores. Uma pontuação 0 é perfeita, mas provavelmente é impossível em apenas 8 dobras.
Você deve relatar suas quatro seqüências de dobramento de 8 etapas com seu código em sua resposta. Isso é para que possamos verificar se seu algoritmo realmente funciona.
Coloque-os neste formulário:
20*20R1D2R3D4R5D6R7D8
40*20R1D2R3D4R5D6R7D8
40*40R1D2R3D4R5D6R7D8
20*80R1D2R3D4R5D6R7D8
Aqui está um script Python que calculará sua pontuação de acordo com suas seqüências dobráveis.
Naturalmente, você não deve copiar o envio da sequência de outra pessoa. As seqüências para cada grade pertencem apenas à pessoa que as criou pela primeira vez.
Esclarecimentos
Idealmente, seu algoritmo funcionará bem em qualquer grade, embora você possa adaptá-lo a esses específicos.
Você deve enviar seu código com sua sequência. Para vencer, você precisa do conjunto de menor pontuação de sequências dobráveis de 8 etapas que ainda não foram publicadas e também de um algoritmo que resiste ao escrutínio público. Explique seu código, não ofusque-o.
A grade nunca deve conter números negativos.
Aplicam-se brechas padrão.
fonte
Respostas:
Pitão
Tenta exaustivamente diferentes combinações de dobras para as primeiras dobras, depois faz o resto das dobras usando uma abordagem gananciosa.
A abordagem exaustiva é limitada a uma faixa razoável de dobras no centro, de modo que não demore uma eternidade, sem ignorar muitas dobras possíveis para produzir um bom mínimo.
Corri usando pypy no meu macbook air.
Respostas:
Saídas:
Pontuação total: 7.91125 + 16.34375 + 42.13 + 32.30875 = 98.69375
Código:
fonte
C, 16,344 (4 minutos e 33 segundos)
Melhores movimentos encontrados até agora: D6, D13, R19, D9, D11, R21, D10, R20
Usa uma mistura de Monte Carlo e escalada. Pode ser feito para correr muito mais rápido, tenho certeza.
fonte