Patrón de francotiradores Prime Nerd


16

El día más largo del año: aquí hay algo para perder el tiempo extra ...


Visión general

Tenga en cuenta que este no es un concurso de popularidad y no un desafío de salida gráfica: solo se requiere que envíe una cadena de 65,536 ceros y unos. El Fragmento de pila en la parte inferior de la pregunta mostrará esto como una imagen en blanco y negro de 256 por 256 y calculará su puntaje oficial. Luego puede guardar la imagen y subirla a su respuesta junto con su código (ya que la salida de la cadena no cabe en una respuesta de intercambio de pila de 30,000 caracteres).


Puntuación

La puntuación de una imagen es la suma de las puntuaciones de sus píxeles individuales. La puntuación de un píxel individual es la suma de los resultados parciales de cada uno de los no ortogonales , distancia primeros píxeles que son del color opuesto al píxel de ser puntuados. El subpunto para cada píxel es 1/pdónde pestá la distancia principal.

En el contexto de esta pregunta, los términos tienen las siguientes definiciones:

  • No ortogonal: un píxel no es ortogonal al píxel que se puntúa si no está en la misma fila y no está en la misma columna.

  • Distancia máxima : un píxel está a una distancia máxima del píxel que se puntúa si está separado por una distancia euclidiana que es exactamente un número primo. En particular, la distancia es la distancia mínima medida toroidalmente: el píxel superior izquierdo está a una distancia delsqrt(2)píxel inferior derecho (los 4 bordes se envuelven).

  • Color opuesto: un píxel es de color opuesto al píxel que se puntúa si sus valores suman 1. Es decir, el primero es 0 y el segundo es 1, o el primero es 1 y el segundo es 0.

El fragmento de pila incluye un código de ejemplo que muestra cómo puntuar una imagen, pero no incluye optimizaciones ni un enfoque eficiente, solo el código correcto para que la puntuación de las imágenes finales se pueda hacer de manera consistente.

Si algo en el código no es correcto, hágamelo saber en los comentarios o en el chat .

Puede que JavaScript no sea necesariamente el mejor lenguaje para responder a este desafío en particular. Tenga en cuenta que el código Snippet deliberadamente no da pistas sobre enfoques más rápidos. Solo se introducirán eficiencias que ya se han demostrado en una respuesta existente.


Visualización

Los píxeles de puntuación

Para una sensación intuitiva de la distribución de los píxeles de puntuación, aquí (en morado) se encuentran los píxeles de distancia principal no ortogonales para el píxel (128, 128) de una imagen de 256 por 256:

imagen de distribución de distancia principal no ortogonal


Una imagen al azar

Esta es la imagen generada al azar de la respuesta de Python 3 de ejemplo. Tiene un puntaje de 138,267.64 y te da algo para vencer.

imagen generada al azar


Entrada

El código no requiere entrada.

Salida

El código debe generar una cadena de 65.536 ceros y unos, que representan los píxeles de una imagen en blanco y negro de 256 por 256. Los dígitos deben ser una cadena continua, sin separadores. Es posible que copiar y pegar sea más fácil si exporta a un archivo, pero esto depende de usted.

Su código también puede generar otra información que le resulte útil, siempre que la cadena se pueda copiar y pegar en el Fragmento de pila. Por ejemplo, es posible que desee generar la mejor cadena hasta un archivo y la mejor puntuación hasta STDOUT a intervalos regulares, lo que permite al usuario elegir cuándo detener la búsqueda.


Fragmento de pila

Como señaló Sp3000 , el fragmento tardó 10 minutos en calcular un puntaje, que es demasiado lento, incluso para una implementación de referencia deliberadamente ineficiente. He editado en la mejora sugerida por Sp3000 de precomputar los desplazamientos de píxeles para la puntuación, y ahora toma unos segundos calcular una puntuación.


Si utiliza la salida o el código de otra respuesta como punto de partida para su propio código, recuerde dar crédito y vincular a la respuesta de apoyo. Las respuestas a esta pregunta no necesitan acreditar la respuesta de ejemplo o el código en la pregunta.

Crédito a Randall Munroe por el término Nerd Sniping

Respuestas:


36

CJam, puntaje 276496.9062958626

2,128*_(]128*

Resulta óptimo, porque: No hay pares no ortogonales con distancia 2. Por lo tanto, la distancia debe ser impar, y también lo es la distancia al cuadrado. Como p 2 = x 2 + y 2 , uno de x e y (al cuadrado o no) debe ser impar, y el otro debe ser par. Esos puntos siempre están en el color opuesto en esta imagen.

Esta y su negativa son también las únicas soluciones óptimas. En una solución óptima, ningún píxel de distancia principal no ortogonal debe tener el mismo color. Hay píxeles opuestos diagonalmente adyacentes como (3,4) y (4,3). Al llenar píxeles del opuesto del color opuesto, etc., podemos obtener una diagonal con el mismo color. A partir de cada píxel en diagonal, podemos rellenar todos los antiagoniales de la misma manera. Tenga en cuenta que se envuelven. Sin embargo, sigue siendo óptimo si no lo hacen.


3
Esperaba que la gente
demorara

1
Me tomó mucho tiempo darme cuenta de que había una solución óptima al escribir esta pregunta, así que pensé que valdría la pena publicarlo como un desafío. ¿Cómo lo viste tan rápido? ¿Era obvio o tenía un proceso de pensamiento particular?
trichoplax

44
PD: No sé a qué hora vio esta pregunta, pero una solución óptima 71 minutos después de que se publicó la pregunta merece una recompensa. Tendré que esperar 2 días antes de poder asignarla ...
trichoplax

@trichoplax Desde su primera imagen, parecía que había muchos puntos en la misma diagonal. Estaba pensando en usar franjas más anchas al principio. Y luego abrí Gimp para verificar mi idea. Y para mi sorpresa, obtuve una imagen completamente negra cuando la llené con este patrón.
jimmy23013

8
@trichoplax Dado que sabía que había una solución óptima, creo que sería mejor revisar la pregunta para que sea menos solucionable. Aunque jimmy23013 lo encontró rápido, siempre es cuestión de tiempo hasta que alguien lo encuentre, y luego se termina.
xnor

1

Python 3, puntaje 138267.64

Esta es una respuesta mínima como un ejemplo de lo que se requiere, y como algo para vencer ...

Incluye

  • El nombre del idioma.
  • El puntaje del fragmento de pila en la pregunta.
  • La imagen guardada del fragmento de pila.
  • El código utilizado para producir la cadena de 65,536 ceros y unos.

Salida

imagen generada al azar

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)

Esto es solo un ejemplo. Python puede no ser necesariamente el mejor lenguaje para respuestas competitivas a este desafío en particular.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.