Prime Nerd Sniping Pattern


16

Il giorno più lungo dell'anno - ecco qualcosa da perdere il tempo extra ...


Panoramica

Nota che questo non è un concorso di popolarità e non una sfida di output grafico: devi solo generare una stringa di 65.536 zero e uno. Lo snippet di stack nella parte inferiore della domanda visualizzerà questo come un'immagine in bianco e nero 256 per 256 e calcolerà il tuo punteggio ufficiale. È quindi possibile salvare l'immagine e caricarla nella risposta insieme al codice (poiché l'output della stringa non si adatta a una risposta Stack Exchange di 30.000 caratteri).


punteggio

Il punteggio di un'immagine è la somma dei punteggi dei suoi singoli pixel. Il punteggio di un singolo pixel è la somma dei punteggi parziali per ciascuna delle non ortogonali , distanza primi pixel che sono di colore opposto al pixel in azione. Il carattere di sottolineatura per ciascuno di questi pixel è 1/pdove si ptrova la distanza principale.

Nel contesto di questa domanda, i termini hanno le seguenti definizioni:

  • Non ortogonale: un pixel non è ortogonale al pixel oggetto del punteggio se non è nella stessa riga e non è nella stessa colonna.

  • Distanza principale: un pixel si trova a una distanza primaria dal pixel che viene segnato se sono separati da una distanza euclidea che è esattamente un numero primo. In particolare, la distanza è la distanza minima misurata toroidalmente - il pixel in alto a sinistra è una distanzasqrt(2)dal pixel in basso a destra (tutti i 4 bordi si avvolgono).

  • Colore opposto: un pixel ha un colore opposto al pixel da assegnare se i loro valori sono pari a 1. Cioè, il primo è 0 e il secondo è 1, oppure il primo è 1 e il secondo è 0.

Lo snippet di stack include un codice di esempio che mostra come assegnare un punteggio a un'immagine, ma non include alcuna ottimizzazione o un approccio efficiente, ma solo un codice corretto in modo che il punteggio delle immagini finali possa essere eseguito in modo coerente.

Se qualcosa nel codice non è corretto, per favore fatemi sapere nei commenti o nella chat .

JavaScript potrebbe non essere necessariamente la lingua migliore per rispondere a questa particolare sfida. Nota che il codice dello snippet non fornisce deliberatamente indizi su approcci più rapidi. Verranno introdotte solo efficienze che sono già state dimostrate in una risposta esistente.


visualizzazione

I pixel di punteggio

Per un'idea intuitiva della distribuzione dei pixel di punteggio, qui (in viola) sono riportati i pixel di distanza primi non ortogonali per pixel (128, 128) di un'immagine 256 per 256:

immagine della distribuzione della distanza primaria non ortogonale


Un'immagine casuale

Questa è l'immagine generata casualmente dalla risposta di esempio Python 3. Ha un punteggio di 138.267,64 e ti dà qualcosa da battere.

immagine generata casualmente


Ingresso

Il codice non richiede input.

Produzione

Il codice dovrebbe generare una stringa di 65.536 zero e uno, che rappresentano i pixel di un'immagine in bianco e nero 256 per 256. Le cifre dovrebbero essere una stringa continua, senza separatori. Potresti trovare più facile copiare e incollare se esegui l'output in un file, ma dipende da te.

Il codice può anche generare altre informazioni che ritieni utili, a condizione che la stringa possa essere copiata e incollata nello snippet dello stack. Ad esempio, potresti voler inviare la stringa migliore ma ancora in un file e il punteggio migliore ancora a STDOUT a intervalli regolari, consentendo all'utente di scegliere quando interrompere la ricerca.


Stack Snippet

Come sottolineato da Sp3000 , lo snippet impiegava 10 minuti per calcolare un punteggio, che è un po ' troppo lento, anche per un'implementazione di riferimento deliberatamente inefficiente. Ho modificato il miglioramento suggerito da Sp3000 di pre-calcolare gli offset dei pixel per il punteggio e ora ci vogliono alcuni secondi per calcolare un punteggio.


Se usi l'output o il codice di un'altra risposta come punto di partenza per il tuo codice, ricorda di dare credito e di collegarti alla risposta di supporto. Le risposte a questa domanda non devono accreditare la risposta di esempio o il codice nella domanda.

Ringraziamo Randall Munroe per il termine Nerd Sniping

Risposte:


36

CJam, punteggio 276496.9062958626

2,128*_(]128*

Risulta essere ottimale, perché: Non ci sono coppie non ortogonali con distanza 2. Quindi la distanza deve essere dispari, così come la distanza al quadrato. Dato che p 2 = x 2 + y 2 , uno di xey (al quadrato o no) deve essere dispari e l'altro deve essere pari. Questi punti hanno sempre il colore opposto in questa immagine.

Questo e il suo negativo sono anche le uniche soluzioni ottimali. In una soluzione ottimale, nessun pixel non ortogonale a prima distanza dovrebbe avere lo stesso colore. Vi sono pixel opposti adiacenti diagonalmente come (3,4) e (4,3). Riempiendo i pixel dell'opposto del colore opposto, ecc., Possiamo ottenere una diagonale con lo stesso colore. A partire da ciascun pixel nella diagonale, possiamo riempire tutte le anti-diagonali nello stesso modo. Si noti che si avvolgono. Tuttavia, è comunque ottimale.


3
Speravo che ci sarebbe voluto più tempo perché le persone notassero che ...
trichoplax,

1
Mi ci è voluto molto tempo per capire che c'era una soluzione ottimale quando si scriveva questa domanda, quindi ho pensato che valesse la pena pubblicare come una sfida. Come l'hai visto così velocemente? Era ovvio o hai avuto un particolare processo di pensiero?
trichoplax,

4
PS Non so a che ora hai visto questa domanda, ma una soluzione ottimale 71 minuti dopo che la domanda è stata pubblicata merita una taglia - Dovrò solo aspettare 2 giorni prima di poterlo assegnare ...
trichoplax

@trichoplax Dalla tua prima immagine, sembrava che ci fossero molti punti nella stessa diagonale. All'inizio stavo pensando di usare strisce più larghe. E poi ho aperto Gimp per verificare la mia idea. E con mia sorpresa, ho ottenuto un'immagine completamente nera quando l'ho riempita con questo motivo.
jimmy23013,

8
@trichoplax Dato che sapevi che esisteva una soluzione ottimale, penso che sarebbe stato meglio rivedere la domanda per renderla meno risolvibile. Sebbene jimmy23013 l'abbia trovato velocemente, è sempre una questione di tempo prima che qualcuno lo trovi, e poi è finito.
xnor

1

Python 3, punteggio 138267,64

Questa è una risposta minima come esempio di ciò che è richiesto e come qualcosa da battere ...

Include

  • Il nome della lingua.
  • Il punteggio dello snippet di stack nella domanda.
  • L'immagine salvata dallo snippet di stack.
  • Il codice utilizzato per produrre la stringa di 65.536 zero e uno.

Produzione

immagine generata casualmente

Codice

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)

Questo è solo un esempio. Python potrebbe non essere necessariamente il miglior linguaggio per le risposte competitive a questa particolare sfida.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.