Prime Nerd Sniping Pattern

16

Jour le plus long de l'année - voici quelque chose pour perdre le temps supplémentaire ...


Aperçu

Notez que ce n'est pas un concours de popularité et pas un défi de sortie graphique - vous devez uniquement produire une chaîne de 65 536 zéros et uns. L'extrait de pile au bas de la question l'affichera sous la forme d'une image en noir et blanc de 256 x 256 et calculera votre score officiel. Vous pouvez ensuite enregistrer l'image et la télécharger dans votre réponse à côté de votre code (car la sortie de chaîne ne tiendra pas dans une réponse Stack Exchange de 30 000 caractères).


Notation

Le score d'une image est la somme des scores de ses pixels individuels. Le score d'un pixel individuel est la somme des sous - scores pour chacune des non-orthogonales , la distance premiers pixels qui sont d' une couleur opposée au pixel étant marqué. Le sous - score pour chaque pixel est 1/ppest la distance de premier choix.

Dans le contexte de cette question, les termes ont les définitions suivantes:

  • Non orthogonal: Un pixel n'est pas orthogonal au pixel évalué s'il n'est pas dans la même ligne et n'est pas dans la même colonne.

  • Distance principale: Un pixel est à une distance principale du pixel évalué s'il est séparé par une distance euclidienne qui est exactement un nombre premier. En particulier, la distance est la distance minimale mesurée toroïdalement - le pixel supérieur gauche est une distance dusqrt(2)pixel inférieur droit (les 4 bords enveloppent).

  • Couleur opposée: un pixel est de couleur opposée au pixel évalué si ses valeurs totalisent 1. Autrement dit, le premier est 0 et le second est 1, ou le premier est 1 et le second est 0.

L'extrait de pile comprend un exemple de code qui montre comment marquer une image, mais n'inclut aucune optimisation ni approche efficace, juste un code correct pour que la notation des images finales puisse être effectuée de manière cohérente.

Si quelque chose dans le code n'est pas correct, faites-le moi savoir dans les commentaires ou dans le chat .

JavaScript n'est pas nécessairement le meilleur langage pour répondre à ce défi particulier. Notez que le code Snippet ne donne délibérément aucun indice quant à des approches plus rapides. Il n'y aura que des gains d'efficience introduits qui ont déjà été démontrés dans une réponse existante.


Visualisation

Les pixels marquants

Pour une impression intuitive de la distribution des pixels de notation, voici (en violet) les pixels de distance principale non orthogonaux pour le pixel (128, 128) d'une image 256 par 256:

image de la distribution des distances principales non orthogonales


Une image aléatoire

Il s'agit de l'image générée aléatoirement à partir de l'exemple de réponse Python 3. Il a un score de 138 267,64 et vous donne quelque chose à battre.

image générée aléatoirement


Contribution

Le code ne nécessite pas d'entrée.

Production

Le code doit produire une chaîne de 65 536 zéros et uns, représentant les pixels d'une image en noir et blanc 256 x 256. Les chiffres doivent être une chaîne continue, sans séparateurs. Vous pouvez trouver le copier-coller plus facile si vous effectuez une sortie vers un fichier, mais cela dépend de vous.

Votre code peut également générer d'autres informations que vous jugez utiles, tant que la chaîne peut être copiée et collée dans l'extrait de pile. Par exemple, vous souhaiterez peut-être sortir la meilleure chaîne à ce jour dans un fichier et le meilleur score à STDOUT à intervalles réguliers, permettant à l'utilisateur de choisir quand arrêter la recherche.


Extrait de pile

Comme l'a souligné Sp3000 , l'extrait prenait 10 minutes pour calculer un score, ce qui est un peu trop lent, même pour une implémentation de référence délibérément inefficace. J'ai édité dans l'amélioration suggérée par Sp3000 de précalculer les décalages de pixels pour le score, et il faut maintenant quelques secondes pour calculer un score.


Si vous utilisez la sortie ou le code d'une autre réponse comme point de départ pour votre propre code, n'oubliez pas de donner un crédit et un lien vers la réponse à l'appui. Les réponses à cette question n'ont pas besoin de créditer l'exemple de réponse ou le code de la question.

Nous remercions Randall Munroe pour le terme Nerd Sniping

trichoplax
la source

Réponses:

36

CJam, score 276496.9062958626

2,128*_(]128*

Il s'avère être optimal, car: il n'y a pas de paires non orthogonales avec la distance 2. La distance doit donc être impaire, tout comme la distance au carré. Comme p 2 = x 2 + y 2 , l'un de x et y (au carré ou non) doit être impair et l'autre doit être pair. Ces points sont toujours de la couleur opposée sur cette image.

Ceci et son négatif sont également les seules solutions optimales. Dans une solution optimale, aucun pixel à distance non orthogonale ne devrait avoir la même couleur. Il y a des pixels opposés diagonalement adjacents comme (3,4) et (4,3). En remplissant des pixels de l'opposé de la couleur opposée, etc., nous pouvons obtenir une diagonale avec la même couleur. En commençant par chaque pixel de la diagonale, nous pouvons obtenir tous les anti-diagonaux remplis de la même manière. Notez qu'ils s'enroulent autour. C'est quand même optimal s'ils ne le font pas.

jimmy23013
la source
3
J'espérais qu'il faudrait plus de temps aux gens pour remarquer que ...
trichoplax
1
Il m'a fallu beaucoup de temps pour comprendre qu'il y avait une solution optimale lors de la rédaction de cette question, j'ai donc pensé que cela valait la peine d'être publié comme un défi. Comment l'avez-vous vu si rapidement? Était-ce simplement évident ou aviez-vous un processus de pensée particulier?
trichoplax
4
PS Je ne sais pas à quelle heure vous avez vu cette question mais une solution optimale 71 minutes après la publication de la question mérite une prime - je vais devoir attendre 2 jours avant de pouvoir l'attribuer ...
trichoplax
@trichoplax Dès votre première image, il semblait qu'il y avait plusieurs points dans la même diagonale. Je pensais utiliser des rayures plus larges au début. Et puis j'ai ouvert Gimp pour vérifier mon idée. Et à ma grande surprise, j'ai obtenu une image complètement noire lorsque je l'ai remplie avec ce motif.
jimmy23013
8
@trichoplax Étant donné que vous saviez qu'il y avait une solution optimale, je pense que vous auriez mieux fait de réviser la question pour la rendre moins résoluble. Bien que jimmy23013 l'ait trouvé rapidement, c'est toujours une question de temps jusqu'à ce que quelqu'un le trouve, et puis c'est fini.
xnor
1

Python 3, score 138267,64

Ceci est une réponse minimale comme exemple de ce qui est requis et comme quelque chose à battre ...

Il comprend

  • Le nom de la langue.
  • Le score de l'extrait de pile dans la question.
  • L'image enregistrée à partir de l'extrait de pile.
  • Le code utilisé pour produire la chaîne de 65 536 zéros et uns.

Production

image générée aléatoirement

Code

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)

C'est juste un exemple. Python n'est pas nécessairement le meilleur langage pour des réponses compétitives à ce défi particulier.

trichoplax
la source