Prime Nerd Sniping Pattern


16

Dia mais longo do ano - aqui está algo para desperdiçar o tempo extra ...


Visão geral

Observe que este não é um concurso de popularidade nem um desafio gráfico de saída - você só precisa gerar uma sequência de 65.536 zeros e uns. O snippet de pilha na parte inferior da pergunta exibirá isso como uma imagem em preto e branco de 256 por 256 e calculará sua pontuação oficial. Em seguida, você pode salvar a imagem e enviá-la para sua resposta juntamente com o seu código (já que a saída da string não caberá em uma resposta de 30.000 caracteres do Exchange Stack).


Pontuação

A pontuação de uma imagem é a soma das pontuações de seus pixels individuais. A pontuação de um pixel individual é a soma dos subescores de cada um dos pixels de distância principal não ortogonais , que são de cores opostas ao pixel que está sendo pontuado. A sub-pontuação de cada pixel é onde está a distância principal.1/pp

No contexto desta pergunta, os termos têm as seguintes definições:

  • Não ortogonal: um pixel não é ortogonal ao pixel que está sendo pontuado, se não estiver na mesma linha e não estiver na mesma coluna.

  • Distância principal: um pixel está a uma distância principal do pixel que está sendo pontuado se for separado por uma distância euclidiana que seja exatamente um número primo. Em particular, a distância é a distância mínima medida toroidalmente - o pixel superior esquerdo está a uma distância dosqrt(2)pixel inferior direito (todas as quatro arestas são quebradas).

  • Cor oposta: um pixel é de cor oposta ao pixel que está sendo pontuado se seus valores somarem 1. Ou seja, o primeiro é 0 e o segundo é 1, ou o primeiro é 1 e o segundo é 0.

O Snippet de pilha inclui código de exemplo que mostra como classificar uma imagem, mas não inclui otimizações ou uma abordagem eficiente, apenas o código correto para que a pontuação das imagens finais possa ser feita de maneira consistente.

Se alguma coisa no código não estiver correta, informe-me nos comentários ou no chat .

O JavaScript pode não ser necessariamente o melhor idioma para responder a esse desafio específico. Observe que o código do snippet não fornece deliberadamente pistas sobre abordagens mais rápidas. Somente serão introduzidas eficiências que já foram demonstradas em uma resposta existente.


Visualização

Os pixels de pontuação

Para uma sensação intuitiva da distribuição dos pixels de pontuação, aqui (em roxo) estão os pixels de distância principal não ortogonais do pixel (128, 128) de uma imagem de 256 por 256:

imagem da distribuição da distância principal não ortogonal


Uma imagem aleatória

Esta é a imagem gerada aleatoriamente a partir da resposta de exemplo do Python 3. Tem uma pontuação de 138.267,64 e oferece a você algo para vencer.

imagem gerada aleatoriamente


Entrada

O código não requer entrada.

Resultado

O código deve gerar uma sequência de 65.536 zeros e uns, representando os pixels de uma imagem em preto e branco de 256 por 256. Os dígitos devem ser uma sequência contínua, sem separadores. Pode ser mais fácil copiar e colar se você imprimir em um arquivo, mas isso depende de você.

Seu código também pode gerar outras informações que você achar úteis, desde que a sequência possa ser copiada e colada no Snippet de Pilha. Por exemplo, você pode enviar a melhor sequência de caracteres para um arquivo e a melhor pontuação para STDOUT em intervalos regulares, permitindo que o usuário escolha quando parar a pesquisa.


Snippet de pilha

Como fora apontado por SP3000 , o trecho estava levando 10 minutos para calcular a pontuação, que é um pouco demasiado lento, mesmo para uma implementação de referência deliberadamente ineficiente. Editei na melhoria sugerida pelo Sp3000 de pré-calcular as compensações de pixel para a pontuação e agora leva alguns segundos para calcular uma pontuação.


Se você usar a saída ou o código de outra resposta como ponto de partida para o seu próprio código, lembre-se de dar crédito e vincular à resposta de suporte. As respostas a esta pergunta não precisam creditar a resposta de exemplo ou o código na pergunta.

Agradecemos a Randall Munroe pelo termo Nerd Sniping

Respostas:


36

CJam, pontuação 276496.9062958626

2,128*_(]128*

Ele é ideal, porque: Não há pares não ortogonais com a distância 2. Portanto, a distância deve ser ímpar e a distância ao quadrado. Como p 2 = x 2 + y 2 , um de x e y (quadrado ou não) deve ser ímpar e o outro deve ser par. Esses pontos estão sempre na cor oposta nesta imagem.

Essa e sua negativa também são as únicas soluções ótimas. Em uma solução ideal, nenhum pixel de distância primária não ortogonal deve ter a mesma cor. Existem pixels opostos adjacentes na diagonal, como (3,4) e (4,3). Ao preencher pixels do oposto da cor oposta, etc., podemos obter uma diagonal com a mesma cor. A partir de cada pixel na diagonal, podemos obter todos os anti-diagonais preenchidos da mesma maneira. Observe que eles envolvem. Ainda é ótimo se não o fizerem.


3
Eu estava esperando que seria necessário mais tempo para que as pessoas aviso de que ...
Trichoplax

11
Levei muito tempo para descobrir que havia uma solução ideal ao escrever esta pergunta, então pensei que valeria a pena postar como um desafio. Como você o viu tão rapidamente? Era óbvio ou você teve um processo de pensamento específico?
Trichoplax

4
PS: Eu não sei a que horas você viu essa pergunta, mas uma solução ideal, 71 minutos após a publicação da pergunta, merece uma recompensa - só vou ter que esperar 2 dias para atribuí-la ...
trichoplax

@trichoplax Desde a sua primeira imagem, parecia haver muitos pontos na mesma diagonal. Eu estava pensando em usar faixas mais largas no começo. E então eu abri o Gimp para verificar minha ideia. E para minha surpresa, obtive uma imagem completamente preta quando a preenchi com esse padrão.
precisa saber é o seguinte

8
@trichoplax Dado que você sabia que havia uma solução ideal, acho que seria melhor revisar a questão para torná-la menos solucionável. Embora jimmy23013 o tenha achado rápido, é sempre uma questão de tempo até que alguém o encontre e depois termine.
xnor

1

Python 3, pontuação 138267.64

Esta é uma resposta mínima como um exemplo do que é necessário e como algo a ser vencido ...

Inclui

  • O nome do idioma
  • A pontuação do snippet de pilha na pergunta.
  • A imagem salva no snippet de pilha.
  • O código usado para produzir a sequência de 65.536 zeros e uns.

Resultado

imagem gerada aleatoriamente

Código

from random import random

output_string = ''
filename = '65536digits.txt'

for t in range(65536):
    digit = int(random() * 2)
    output_string += str(digit)

with open(filename, 'w') as output_file:
    output_file.write(output_string)

Este é apenas um exemplo. O Python pode não ser necessariamente a melhor linguagem para respostas competitivas para esse desafio em particular.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.