Sie erhalten als Eingabe ein Graustufenbild. Ihre Aufgabe ist es, in Conways Game of Life ein statisches oder sich wiederholendes Muster zu finden , das dem eingegebenen Bild so nahe wie möglich kommt.
Ihre Ausgabe kann entweder ein Standbild oder eine sich wiederholende Animation in einem Format sein, das in GIF konvertiert werden kann. Die Abmessungen des Ausgabebilds sollten mit denen der Eingabe übereinstimmen und dürfen nur schwarze und weiße Pixel enthalten.
Wenn es sich bei der Ausgabe um eine Animation handelt, muss jeder Frame gemäß den Game of Life-Regeln mit einer Zelle pro Pixel aus dem vorherigen generiert werden. Die Animation muss eine Schleife bilden, wobei das erste Bild nach denselben Regeln aus dem letzten Bild generiert wird.
Wenn es sich bei der Ausgabe um ein Standbild handelt, muss bei Anwendung der Spielregeln dasselbe Bild erstellt werden. Dies bedeutet, dass keine "lebende" Zelle mehr als drei oder weniger als zwei "lebende" Nachbarn haben darf und keine "tote" Zelle genau drei "lebende" Nachbarn haben darf. (Beachten Sie, dass dies im Prinzip mit einer Animation wie oben beschrieben identisch ist, jedoch nur mit einem Frame.)
Zusätzliche Regeln und Erläuterungen:
Sie (oder Ihr Programm) können wählen, ob "lebende" Zellen als weiß und "tote" als schwarz dargestellt werden oder umgekehrt. Das heißt, Sie können dies entweder fest codieren oder Ihr Programm kann es basierend auf dem eingegebenen Bild auswählen. (Es muss jedoch für jedes Bild der Animation gleich sein.)
Die Randbedingungen sollten periodisch sein, dh die Zellen in der rechten Spalte haben Nachbarn in der linken Spalte usw.
Bei Animationen liegt die Framerate bei Ihnen (oder Ihrem Programm). Ich stelle mir vor, dass schnelle Bildraten gut für die Approximation grauer Pixel geeignet sind.
Bitte posten Sie mindestens zwei Ergebnisse in Ihrer Antwort. Wenn Sie die Ergebnisse aller unten aufgeführten Eingabebilder veröffentlichen können, ist dies vorzuziehen.
Es ist akzeptabel, die Testbilder zu verkleinern, wenn dies erforderlich ist, um GIFs mit ausreichend kleinen Dateigrößen zu erzielen. Wenn Sie auch auf größere Dateien verlinken möchten, ist das in Ordnung. Wenn Sie angeben möchten, können Sie einige Quelldateien mit höherer Auflösung suchen.
Bitte versuchen Sie, zu viele steuerbare Parameter in Ihrem Code zu vermeiden. Es ist am besten, wenn die einzige Eingabe Ihres Programms das Bild ist. Die Ausnahme ist, wenn Sie einen Parameter zum Steuern der Anzahl der Animationsrahmen haben möchten, da dies die Dateigröße beeinflusst.
Sie können externe Programme verwenden, um das Format der Eingabe- und Ausgabedateien zu ändern und / oder Ausgabefelder in eine Animation zu kompilieren, wenn Sie dies möchten. (Dies ist keine Herausforderung beim Umgang mit Dateiformaten.)
Dies ist ein Beliebtheitswettbewerb , daher gewinnt die Antwort mit den meisten Stimmen.
Hier finden Sie eine Auswahl von Testbildern, die größtenteils aus anderen Fragen auf dieser Website stammen. (Es ist möglich, dass ich später zusätzliche "Bonus" -Eingabebilder hinzufüge.)
Um den Anfang zu machen, hier ist ein sehr dummer Referenzversuch in Python 2, der die Tatsache ausnutzt, dass ein Block mit vier Quadraten eine stabile Struktur im Spiel des Lebens ist. Es skaliert das Eingabebild nur um den Faktor 4 neu und zeichnet dann einen Block, wenn das entsprechende Pixel dunkler als 0,5 ist.
from skimage import io
from skimage import transform
import sys
img = io.imread(sys.argv[1],as_grey=True)
source = transform.resize(img, [i/4 for i in img.shape])
img[:]=1
for x in xrange(source.shape[0]):
for y in xrange(source.shape[1]):
if source[x,y]<0.5:
img[x*4, y*4] = 0
img[x*4+1, y*4] = 0
img[x*4, y*4+1] = 0
img[x*4+1, y*4+1] = 0
io.imsave(sys.argv[2], img)
Hier sind einige Ausgaben aus dem Beispielcode. Ich bin sicher, dass viel bessere Ergebnisse möglich sind.
Antworten:
Python
Bitte schielen:
Der Code stempelt die weißesten Pixel mit dem am besten passenden Standardstillleben . Es gibt ein Cut-Off-Argument, mit dem Sie entscheiden können, ob die Rundung auf Schwarz-Weiß-Schwelle erfolgt. Ich habe mit Living-Is-White experimentiert und das Ergebnis ist fast dasselbe.
quelle
#Python
Java
Ein auf Kantenerkennung basierender Ansatz. Benötigt diese Textdatei im laufenden Verzeichnis.
Einige Ergebnisse:
quelle
C ++
Einfacher Pixelansatz unter Verwendung des Durchschnitts jedes 8x8-Gitters zur Auswahl eines 8x8-Ausgabegitters (eine "Farbtextur"). Jedes 8x8-Ausgangsraster hat oben und rechts einen 2-Zellen-Separator. In den verbleibenden 6 x 6 Pixeln wurden Raster von 4-Zellen-Stillleben bis zu 18-Zellen-Stillleben entworfen.
Das Programm fungiert als Filter von binärem PGM zu binärem PBM. Standardmäßig sind Bilder "dunkel". Schwarz ist der Tod und Weiß ist das Leben;
-i
invertiert dies.-g [value]
Fügt ein Gamma hinzu, mit dem Durchschnittswerte vor der Auswahl der Farbtexturen vorgewichtet werden.Ausgewählte Ergebnisse (Hinweis: Alle PBMs wurden mithilfe eines Drittanbieterprogramms zum Hochladen in PNGs konvertiert.):
Escher, Gamma 2.2
Mona Lisa, Gamma 2.2
Ozean, Gamma 2,2 invertiert
Welpe, Gamma 2.2
Verrat an Bildern, Gamma 2.2 invertiert
Mona Lisa Gamma 2.2, invertiert, zum Vergleich
quelle