Prime Nerd Sniping Pattern

16

Längster Tag des Jahres - hier ist etwas, um die zusätzliche Zeit zu verschwenden ...


Überblick

Beachten Sie, dass dies kein Beliebtheitswettbewerb und keine Herausforderung für die grafische Ausgabe ist. Sie müssen lediglich eine Zeichenfolge mit 65.536 Nullen und Einsen ausgeben. Das Stapel-Snippet unten in der Frage zeigt dies als 256 x 256-Schwarzweißbild an und berechnet Ihre offizielle Punktzahl. Anschließend können Sie das Bild speichern und zusammen mit Ihrem Code in Ihre Antwort hochladen (da die Zeichenfolgenausgabe nicht in eine Stapelaustauschantwort mit 30.000 Zeichen passt).


Wertung

Der Score eines Bildes ist die Summe der Scores seiner einzelnen Pixel. Der Wert eines einzelnen Pixel ist die Summe der Teilscores für jede der nicht-orthogonal , prime Abstand Pixel , die von sind entgegengesetzte Farbe zu dem Pixel erzielt wird. Der Unterpunkt für jedes derartige Pixel ist, 1/pwo pder Hauptabstand ist.

Im Zusammenhang mit dieser Frage haben die Begriffe die folgenden Definitionen:

  • Nicht orthogonal: Ein Pixel ist nicht orthogonal zu dem zu bewertenden Pixel, wenn es sich nicht in derselben Zeile und nicht in derselben Spalte befindet.

  • Primabstand: Ein Pixel befindet sich in einem Primabstand von dem zu bewertenden Pixel, wenn sie durch einen euklidischen Abstand getrennt sind, der genau eine Primzahl ist. Insbesondere ist Abstand der Mindestabstand, der toroidal gemessen wird - der obere linke Pixel ist ein Abstandsqrt(2)vom unteren rechten Pixel (alle 4 Kanten werden umbrochen).

  • Gegenüberliegende Farbe: Ein Pixel hat eine andere Farbe als das Pixel, das bewertet wird, wenn seine Werte 1 ergeben. Das heißt, das erste ist 0 und das zweite ist 1, oder das erste ist 1 und das zweite ist 0.

Das Stapel-Snippet enthält Beispielcode, der zeigt, wie ein Bild bewertet wird, enthält jedoch keine Optimierungen oder einen effizienten Ansatz, sondern nur den korrekten Code, damit die endgültigen Bilder konsistent bewertet werden können.

Wenn irgendetwas im Code nicht korrekt ist, lass es mich entweder in den Kommentaren oder im Chat wissen .

JavaScript muss nicht unbedingt die beste Sprache sein, um diese besondere Herausforderung zu beantworten . Beachten Sie, dass der Snippet-Code bewusst keine Hinweise auf schnellere Ansätze gibt. Es werden nur Effizienzen eingeführt, die bereits in einer vorhandenen Antwort gezeigt wurden.


Visualisierung

Die zählenden Pixel

Für ein intuitives Gefühl für die Verteilung der Scoring-Pixel sind hier (in Lila) die nicht-orthogonalen Primzahl-Abstandspixel für Pixel (128, 128) eines 256 × 256-Bildes:

Bild der nicht-orthogonalen Hauptentfernungsverteilung


Ein zufälliges Bild

Dies ist das zufällig generierte Bild aus der Python 3-Beispielantwort. Es hat eine Punktzahl von 138.267,64 und gibt Ihnen etwas zu schlagen.

zufällig erzeugtes Bild


Eingang

Der Code erfordert keine Eingabe.

Ausgabe

Der Code sollte eine Zeichenfolge von 65.536 Nullen und Einsen ausgeben, die die Pixel eines 256 x 256-Schwarzweißbilds darstellen. Die Ziffern sollten eine fortlaufende Zeichenfolge ohne Trennzeichen sein. Möglicherweise ist das Kopieren und Einfügen einfacher, wenn Sie in eine Datei ausgeben. Dies liegt jedoch bei Ihnen.

Ihr Code kann auch andere Informationen ausgeben, die Sie nützlich finden, solange die Zeichenfolge kopiert und in das Stapel-Snippet eingefügt werden kann. Beispielsweise möchten Sie möglicherweise in regelmäßigen Abständen die beste bisherige Zeichenfolge in einer Datei und die beste bisherige Punktzahl in STDOUT ausgeben, sodass der Benutzer auswählen kann, wann die Suche gestoppt werden soll.


Stapel-Snippet

Wie von Sp3000 herausgestellt , benötigte das Snippet 10 Minuten, um eine Punktzahl zu berechnen, die selbst für eine absichtlich ineffiziente Referenzimplementierung etwas zu langsam ist. Ich habe in Sp3000 die vorgeschlagene Verbesserung der Vorberechnung der Pixel-Offsets für das Scoring bearbeitet, und es dauert jetzt einige Sekunden, um eine Punktzahl zu berechnen.


Wenn Sie die Ausgabe oder den Code einer anderen Antwort als Ausgangspunkt für Ihren eigenen Code verwenden, denken Sie bitte daran, das Guthaben anzugeben und auf die entsprechende Antwort zu verweisen. Bei Antworten auf diese Frage muss weder die Beispielantwort noch der Code in der Frage angegeben werden.

Dank an Randall Munroe für den Begriff Nerd Sniping

Trichoplax
quelle

Antworten:

36

CJam, Partitur 276496.9062958626

2,128*_(]128*

Es stellt sich als optimal heraus, weil: Es gibt keine nicht-orthogonalen Paare mit Abstand 2. Der Abstand muss also ungerade sein, und ebenso der Abstand zum Quadrat. Da p 2 = x 2 + y 2 ist , muss eines von x und y (quadriert oder nicht) ungerade und das andere gerade sein. Diese Punkte haben in diesem Bild immer die entgegengesetzte Farbe.

Dies und sein Negativ sind auch die einzig optimalen Lösungen. In einer optimalen Lösung sollten keine nicht orthogonalen Hauptabstandspixel die gleiche Farbe haben. Es gibt diagonal benachbarte gegenüberliegende Pixel wie (3,4) und (4,3). Durch Füllen von Pixeln mit der entgegengesetzten Farbe usw. können wir eine Diagonale mit derselben Farbe erhalten. Ausgehend von jedem Pixel in der Diagonale können alle Antidiagonalen auf dieselbe Weise gefüllt werden. Beachten Sie, dass sie herumlaufen. Es ist jedoch immer noch optimal, wenn dies nicht der Fall ist.

jimmy23013
quelle
3
Ich hatte gehofft, es würde länger dauern, bis die Leute bemerken, dass ...
trichoplax
1
Es hat lange gedauert, bis ich herausgefunden habe, dass es eine optimale Lösung gibt, als ich diese Frage schrieb. Daher dachte ich, dass es sich lohnt, sie als Herausforderung zu veröffentlichen. Wie hast du es so schnell gesehen? War es nur offensichtlich oder hatten Sie einen bestimmten Denkprozess?
Trichoplax
4
PS Ich weiß nicht, wann Sie diese Frage gesehen haben, aber eine optimale Lösung, die 71 Minuten nach dem Absenden der Frage gefunden wurde, verdient ein Kopfgeld - ich muss nur 2 Tage warten, bevor ich sie zuweisen kann ...
trichoplax
@trichoplax Von Ihrem ersten Bild an schien es, als gäbe es viele Punkte in derselben Diagonale. Am Anfang dachte ich darüber nach, breitere Streifen zu verwenden. Und dann öffnete ich Gimp, um meine Idee zu überprüfen. Und zu meiner Überraschung bekam ich ein komplett schwarzes Bild, als ich es mit diesem Muster füllte.
Jimmy23013
8
@trichoplax Da Sie wussten, dass es eine optimale Lösung gibt, wäre es meiner Meinung nach besser gewesen, die Frage zu überarbeiten, um sie weniger lösbar zu machen. Obwohl jimmy23013 es schnell gefunden hat, ist es immer eine Frage der Zeit, bis jemand es findet, und dann ist es vorbei.
21.
1

Python 3, Punktzahl 138267.64

Dies ist eine minimale Antwort als Beispiel für das, was benötigt wird, und als etwas zu schlagen ...

Es enthält

  • Der Name der Sprache.
  • Die Punktzahl aus dem Stack-Snippet in der Frage.
  • Das aus dem Stapel-Snippet gespeicherte Bild.
  • Der Code, der zum Erzeugen der Zeichenfolge aus 65.536 Nullen und Einsen verwendet wird.

Ausgabe

zufällig erzeugtes Bild

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)

Dies ist nur ein Beispiel. Python ist möglicherweise nicht die beste Sprache für kompetitive Antworten auf diese besondere Herausforderung.

Trichoplax
quelle