Joe die Schlange hat Hunger.
Er isst Pixel für Pixel Bilder.
Er mag wirklich helle Pixel.
Die Herausforderung
Programmiere Joe, um die hellsten Pixel zu essen, die er finden kann, vorausgesetzt, er kann sich nur nach oben, unten, links oder rechts bewegen.
Spezifikationen
- Joe muss am oberen linken Pixel des Bildes beginnen.
- Joe kann sich bei jeder Bewegung nur um 1 horizontal oder vertikal bewegen
- Joe hat nur genug Zeit, um 1/3 der Pixelanzahl im Bild zu verschieben (1/3 so viele Bewegungen wie Pixel). Wenn die Anzahl der Pixel kein Vielfaches von 3 ist, runden Sie auf die nächste Ganzzahl ab.
- Joe kann seinen Weg kreuzen, obwohl das als 0 Helligkeit zählt
- Die Helligkeit basiert auf der Summe von r, g und b, sodass rgb (0,0,0) eine Helligkeit von 0 hat, während rgb (255,255,255) die maximale Helligkeit hat.
Eingang
Sie können das Bild eingeben, wie Sie möchten.
Ausgabe
- ein Bild, das das Endergebnis Ihres Bildes zeigt (wobei Schwarz Pixel sind).
- Die Menge der verbrauchten Helligkeit (bitte geben Sie den Bereich in Ihrer Antwort an)
Wertung
Ihr Programm wird benotet mit:
- Die durchschnittliche Helligkeit der Pixel, die Joe isst / Die durchschnittliche Helligkeit der Pixel im Bild *
* Sie können dies in Ihrem Programm fest codieren
Ihre Gesamtpunktzahl ist der Durchschnitt der Punkte für die folgenden Bilder:
Testbilder:
http://upload.wikimedia.org/wikipedia/en/thumb/f/f4/The_Scream.jpg/800px-The_Scream.jpg
code-challenge
image-processing
Stretch Maniac
quelle
quelle
[![image description](SE URL for downsized image)](URL for original image)
.Antworten:
C ++, Partitur:
1,420421,46766Dies ist im Wesentlichen eine etwas ausgefeiltere Version der beiden vorhandenen Lösungen: Von den vier möglichen Zügen wählt sie diejenige aus, die die Helligkeit maximiert. Anstatt nur die Helligkeit des Zielpixels zu betrachten, wird die gewichtete Summe der Pixelhelligkeit in der Nachbarschaft des Zielpixels betrachtet, wobei Pixel, die näher am Ziel liegen, ein größeres Gewicht haben.
BEARBEITEN: Die Verwendung von nichtlinearer Helligkeit bei der Nachbarschaftsberechnung verbessert die Punktzahl geringfügig.
Kompilieren mit
g++ joe.cpp -ojoe -std=c++11 -O3 -lcairo
. Benötigt Kairo.Laufen Sie mit
joe <image-file> [<radius>]
.<image-file>
ist das Eingangs-PNG-Bild.<radius>
(optionales Argument) ist der Radius der aufsummierten Nachbarschaft in Pixel (kleiner ist schneller, größer ist (ungefähr) besser). Gibt die Partitur und ein benanntes Bild ausout.<image-file>
.Ergebnisse
Noch mehr Augenschmaus
quelle
if (o_neighborhood > o_max_neighborhood) o_max = *o, o_max_neighborhood = o_neighborhood;
nur dieser Code setzt ihn. Aufgrund von Nan ist der Vergleich jedoch immer falsch, daher wird o_max nie gesetzt und nicht initialisiert verwendet.Python 3, Score = 1,57
Zuerst bewegt sich unsere Schlange durch das Bild und erzeugt vertikale Linien mit gleichem Abstand voneinander.
Wir können diese Schlange erweitern, indem wir zwei Punkte in einer vertikalen Linie nebeneinander nehmen und eine Schleife erstellen, deren Endpunkte sie sind.
Wir ordnen die Punkte paarweise an und speichern für jedes Paar die Größe und den durchschnittlichen Helligkeitswert der Schleife, die die größte durchschnittliche Helligkeit ergibt.
Bei jedem Schritt wählen wir das Paar mit dem höchsten Wert aus, erweitern seine Schleife, um die maximale durchschnittliche Helligkeit der Erweiterung zu erreichen, und berechnen die neue optimale Schleifengröße und den Helligkeitswert für das Paar.
Wir speichern die (value, size, point_pair) -Triplets in einer nach Wert sortierten Heap-Struktur, damit wir das größte Element (in O (1)) entfernen und das neue modifizierte Element (in O (log n)) effizient hinzufügen können.
Wir hören auf, wenn wir die Pixelzahlgrenze erreicht haben und diese Schlange wird die letzte Schlange sein.
Der Abstand zwischen den vertikalen Linien hat nur einen sehr geringen Einfluss auf das Ergebnis. Daher wurde eine konstante Anzahl von 40 Pixeln gewählt.
Ergebnisse
Hinweis: Das Originalbild "The Scream" war nicht verfügbar, daher habe ich ein anderes Bild "The Scream" mit ähnlicher Auflösung verwendet.
Gif zeigt den Vorgang der Schlangenerweiterung auf dem "Wirbel" -Bild:
Der Code nimmt einen (oder mehrere durch Leerzeichen getrennte) Dateinamen von stdin und schreibt die resultierenden Schlangenbilder in PNG-Dateien und druckt die Partituren nach stdout.
quelle
Python 2 (Ergebnis: 0.0797116)
Nur ein sehr einfacher und naiver, gieriger Algorithmus, um den Ball ins Rollen zu bringen.
Ausgabe:
quelle
sum of brightnesses of eaten pixels / amount of eaten pixels
ist die richtige Formel, richtig? Vielleicht ist es nur ein wirklich schrecklicher Algorithmus;)The average brightness of pixels Joe eats / The average brightness of the pixels in the picture*
Java (Ergebnis: 0.6949)
Ein einfacher Algorithmus, der das hellste Pixel der vier das aktuelle Pixel umgebenden Pixel auffrisst. Im Falle eines Unentschieden ist das Pixel zufällig, was bei jeder Ausführung zu unterschiedlichen Ergebnissen und resultierenden Bildern führt. Daher sind die unten stehenden Bewertungen die Durchschnittswerte von über 50 Ausführungen für jedes Bild.
Um es auszuführen, bearbeiten Sie entweder die drei Argumente (die als Klassenkonstanten existieren) in der Quelle oder übergeben Sie sie über die Befehlszeile in der Form,
java HungryImageSnake <source> <iterations> <printScores>
in der<source>
sich die Quelldatei des Bildes befindet, und geben Sie an,<iterations>
wie oft das Bild aufgenommen werden soll die durchschnittliche Punktzahl und das Speichern der besten Punktzahl über alle Iterationen) und<printScores>
ist wahr, um die Punktzahl jeder Iteration zu drucken, oder falsch, um nicht zu drucken.Durchschnittliche Punktzahl pro Bild über fünfzig Iterationen:
Die besten Ergebnisse nach Bild in den gleichen fünfzig Iterationen:
Die Bilder der Läufe mit der höchsten Punktzahl:
Wie aus den Bildern hervorgeht, wird weit weniger als ein Drittel der Pixel tatsächlich gefressen, da die Schlange gelegentlich zwischen den Pixeln stecken bleibt, die sie bereits gefressen hat. Dabei bleibt sie im toten Bereich stecken, bis die Zufälligkeit ihrer Bewegungen sie dazu bringt ein essbarer Teil des Bildes.
Auch als Folge des erneuten Verzehrs der Pixel durch die Schlange werden die Punktzahlen nach unten verschoben, da die Helligkeit der toten Pixel von Null erneut in den Durchschnitt einbezogen wird. Ich würde weitaus höhere Punktzahlen erwarten, wenn der Bewertungsalgorithmus dahingehend modifiziert würde, dass er nur durch die Anzahl der Züge dividiert wird, die zum Essen neuer Pixel geführt haben, anstatt durch alle Züge (einschließlich der Züge, bei denen die Schlange ein jetzt totes Pixel isst, das sie zuvor gegessen hat) ).
Ein besserer Ansatz wäre natürlich, für jedes Pixel eine Art Helligkeitsheuristik zu erstellen und den Pfad der
width * height / 3
Pixel mit der höchsten durchschnittlichen Helligkeit zu ermitteln, aber ich bezweifle, dass dieser Ansatz in der Laufzeit optimal ist, insbesondere bei größeren Bildern als Anzahl von möglichen Permutationen wäre sehr groß. Ich werde vielleicht später einen Versuch unternehmen und ihn in einer separaten Antwort veröffentlichen, wenn dies der Fall ist.quelle
Python 2, Score: 1,205
Ich habe vor einiger Zeit eine schnelle Python-Lösung zusammengestellt, aber vergessen, sie zu posten. Hier ist es. Es findet die reichsten Blöcke im Bild, fährt dann zu jedem Block und frisst die besten Blöcke auf, zu denen es kommt.
Ergebnisse
Beispiel Bild
Python 2.7-Code
quelle