A matriz Wythoff é uma matriz infinita que consiste nos números Grundy de cada quadrado em um tabuleiro de xadrez no jogo de Wythoff .
Cada entrada nessa matriz é igual ao menor número não negativo que não aparece em nenhum lugar acima, à esquerda ou na diagonal a noroeste da posição da entrada.
O quadrado de 20 por 20 no canto superior esquerdo é assim:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20
2 0 1 5 3 4 8 6 7 11 9 10 14 12 13 17 15 16 20 18
3 4 5 6 2 0 1 9 10 12 8 7 15 11 16 18 14 13 21 17
4 5 3 2 7 6 9 0 1 8 13 12 11 16 15 10 19 18 17 14
5 3 4 0 6 8 10 1 2 7 12 14 9 15 17 13 18 11 16 21
6 7 8 1 9 10 3 4 5 13 0 2 16 17 18 12 20 14 15 11
7 8 6 9 0 1 4 5 3 14 15 13 17 2 10 19 21 12 22 16
8 6 7 10 1 2 5 3 4 15 16 17 18 0 9 14 12 19 23 24
9 10 11 12 8 7 13 14 15 16 17 6 19 5 1 0 2 3 4 22
10 11 9 8 13 12 0 15 16 17 14 18 7 6 2 3 1 4 5 23
11 9 10 7 12 14 2 13 17 6 18 15 8 19 20 21 4 5 0 1
12 13 14 15 11 9 16 17 18 19 7 8 10 20 21 22 6 23 3 5
13 14 12 11 16 15 17 2 0 5 6 19 20 9 7 8 10 22 24 4
14 12 13 16 15 17 18 10 9 1 2 20 21 7 11 23 22 8 25 26
15 16 17 18 10 13 12 19 14 0 3 21 22 8 23 20 9 24 7 27
16 17 15 14 19 18 20 21 12 2 1 4 6 10 22 9 13 25 11 28
17 15 16 13 18 11 14 12 19 3 4 5 23 22 8 24 25 21 26 10
18 19 20 21 17 16 15 22 23 4 5 0 3 24 25 7 11 26 12 13
19 20 18 17 14 21 11 16 24 22 23 1 5 4 26 27 28 10 13 25
Atualmente, não existe um algoritmo eficiente conhecido para calcular uma entrada arbitrária na matriz Wythoff. No entanto, sua tarefa neste problema é tentar projetar uma função heurística que diga se o número em uma coordenada específica wythoff(x, y)
é par ou ímpar.
Seu programa não pode conter mais de 64 KB (65.536 bytes) de código-fonte ou usar mais de 2 MB (2.097.152 bytes) de memória de trabalho.
Especialmente para uso de memória, isso significa que o tamanho máximo do conjunto de residentes do seu programa não pode exceder 2 MB a mais que o tamanho máximo do conjunto de residentes de um programa vazio nesse idioma. No caso de uma linguagem interpretada, seria o uso de memória do próprio intérprete / máquina virtual e, no caso de uma linguagem compilada, seria o uso de memória de um programa que executa o método principal e não faz nada.
Seu programa será testado na 10000 x 10000
matriz para valores de linha 20000 <= x <= 29999
e valores de coluna em 20000 <= y <= 29999
.
A pontuação do seu programa é a taxa de precisão (número de suposições corretas) que o seu programa alcança, com um código mais curto atuando como desempate.
01.R
é um 05AB1E que gera verdadeiro ou falso aleatoriamente. Seja 0 verdadeiro e 1 falso, meu programa teoricamente estará correto ~ 50% das vezes. Esta entrada é válida?Respostas:
Pitão; precisão = 54.074.818; tamanho = 65.526 bytes
Pontuações anteriores: 50.227.165; 50.803.687; 50.953.001
Essa abordagem divide todas as entradas exclusivas da matriz em 523.200 grupos e lê a melhor estimativa para o grupo (x, y) a partir de uma sequência binária. Você pode baixar o código fonte completo do Google Drive .
Eu usei as paridades de @ PeterTaylor para gerar a string e calcular a precisão.
fonte
CJam (precisão 50016828/100000000, 6 bytes)
(No pseudocódigo no estilo ALGOL para não-CJammers:)
return ((x + y) & 1) == 0
.Isso tem um desempenho melhor do que qualquer uma das outras duas dúzias de heurísticas simples que eu tentei. É ainda melhor do que qualquer combinação com os próximos dois melhores.
A pontuação assume que minha seção calculada da matriz está correta. Verificação independente bem-vinda. Estou hospedando os bits de paridade calculados em http://cheddarmonk.org/codegolf/PPCG95604-parity.bz2 (download de 8 MB, extrai para um arquivo de texto de 50 MB: como a matriz é simétrica em relação à diagonal principal, incluí apenas cada linha começando na diagonal principal, para compensar, transpor e OR bit a bit para obter o quadrado inteiro).
O código que eu usei para calcular é Java. Ele usa a definição de maneira bastante direta, mas com uma estrutura de dados definida que codifica os intervalos de execução para que seja rápido pular para o próximo valor permitido. Uma otimização adicional seria possível, mas ela é executada no meu desktop moderadamente antigo em cerca de duas horas e 1,5 GB de espaço de heap.
fonte
J, precisão = 50022668/10 8 = 50,0227%, 4 bytes
Pega as coordenadas como dois argumentos, calcula o LCM entre elas e o pega no módulo 2. A
0
significa que é par e a1
que é ímpar.O desempenho é baseado nos bits de paridade fornecidos por @ Peter Taylor .
A versão PRNG anterior, por 7 bytes,
2|?.@#.
tinha uma precisão de 50010491/10 8 .Explicação
fonte
1
apenas 25% do tempo, quando a proporção correta é quase exatamente 50%), e ainda assim é melhor do que muitas que não são obviamente tão ruins.AND
.