Ihre Aufgabe ist es, ein Programm zu erstellen, das bei gegebenem Eingabebild ein Ausgabebild derselben Größe erstellt, wobei alle Pixel nach Hexadezimalwerten sortiert sind.
Ihr Programm kann:
- Sortieren Sie die Pixel von links nach rechts und dann nach unten oder sortieren Sie sie zuerst in Spalten und dann nach rechts. In jedem Fall ist das obere linke Pixel das kleinste und das untere rechte das größte.
- Verwenden Sie Transparenz, dies ist jedoch nicht erforderlich.
- Sortieren Sie nach RGB, aber Sie können CMY oder ein anderes Format mit mindestens 3 Werten verwenden. Sie können auswählen, nach welchen Werten sortiert werden soll. (HSV kann einige schöne Bilder geben)
- Verwenden Sie jedes bekannte Bildformat, das die meisten Computer öffnen können.
Regeln:
- Die Ausgabe muss auf die Festplatte geschrieben oder in eine Datei umgeleitet werden.
- Die Eingabe erfolgt als Befehlszeilenargument in Form eines relativen Pfads zum Bild oder über die Befehlszeile.
- Das ist Code Golf, also gewinnt der kürzeste Code in Bytes!
Antworten:
Pyth - 10 Bytes
Liest das Bild, reduziert die Bitmap, sortiert und teilt die Bitmap erneut auf und schreibt dann.
Funktioniert aus offensichtlichen Gründen nicht online. Nimmt Eingaben als relativen Pfad zur Bilddatei und gibt sie in aus
o.png
.Ausgabe von American Gothic:
quelle
JavaScript (ES6),
383377354 ByteLauffähige Demo:
Code-Snippet anzeigen
Wie dieser Code funktioniert, wird verwendet
getImageData
, um ein Array des Formulars abzurufenUnd
map
es zu einem Array der FormDamit werden die R-Werte auf Arrays des RGBA-Satzes abgebildet, und die B-, G- und A-Werte werden zu Null-Arrays mit dem Mindestwert. Wenn wir dieses Array sortieren, werden alle
[0,0,0,0]
Arrays nach unten und die Real-Value-Arrays nach oben sortiert:Wir überfliegen das obere Viertel des Arrays (um die von uns erstellten leeren Werte zu verlieren), reduzieren es mit
[].concat.apply
und erhalten wieder ein Array des ersten Formulars, aber dieses Mal ist es sortiert.Leicht entgolft mit Leerzeichen und Kommentaren:
Beachten Sie, dass die meisten Browser diesen Code für große Bilder möglicherweise nicht ausführen können, da eine große Anzahl von Argumenten übergeben wird
[].concat
. Wenn die Browserumgebung nicht genügend Speicher für alle Argumente zulässt, können Sie alternativ die RGBA-Werte aus den oberen vierten Arrays erneut auf das Array abbilden, um eine Gesamtbewertung von 361 Byte zu erhalten :Wir ersetzen einfach das
[].concat(...{stuff}).slice(12*w*h)
mit{stuff}.map((v,i,A)=>A[3*w*h+(i>>2)][i%4])
.)quelle
concat.apply
Aufruf liefert zu viele Argumenteconcat
und die JS-Engine lehnt dies ab.D:
Vielen Dank! Ich werde das beheben und die beiden Ergebnisse notieren. (Und ich bin froh, dass ich helfen konnte!)Mathematica
86 8372 BytesMit 14 Bytes dank @Martin Buttner gespart.
Beispiel
Das Bild selbst wird eingegeben. Alternativ könnte eine Variable verwendet werden, die das Bild enthält.
quelle
ImageData
undArrayReshape
könnte Infixnotation verwenden.Flatten
ist lang genug, um ein paar Bytes zu sparen, indem Sie es zuweisenf
. Und brauchst du eigentlich"Byte"
? Würde der Standard nicht einfach die Kanalwerte so skalieren,[0,1]
dass die Sortierung und Bildrekonstruktion immer noch einwandfrei funktionieren würden?Javascript ES6, 334 Bytes
Ungolfed:
quelle
appendChild
das seine Argumentation erwidert. Sehr hilfreich! Sie haben mich dazu inspiriert, meinen Eintrag von 377 auf 354 zu reduzieren, aber ich kann Ihren nicht ganz übertreffen :). (Wenn ich deineappendChild
Verkettung undwith
Technik verwende, kann ich es auf 347 bringen, aber immer noch auf 13!) Ausgezeichnete Arbeit!C (unter Verwendung von SDL1.2),
333322315 BytesC ist höchstwahrscheinlich nicht das 'schärfste Messer im Regal' für diese Art von Arbeit, ich wollte es trotzdem versuchen. Tipps zur Verbesserung meiner Antwort sind willkommen. Das Programm erhält den Namen der Eingabebilddatei als cli-Argument.
kompilieren und ausführen:
gcc -I/usr/include/SDL snippet.c -lSDL -lSDL_image && ./a.out
Ich spiele normalerweise nicht Golf in C, aber ich habe diese Herausforderung gerade beantwortet gestern und wollte einfach weiter mit diesem neuen Spielzeug spielen :)
danke an @ pseudonym117 für die hilfe beim sparen von 5 bytes
quelle
while
am Ende auf ändern.for(;;SDL_Flip(s));
Ich glaube, Sie könnenint
die Methode weglassenC
und weitere 4 Byte einsparen.JavaScript (ES6), 452
480484487511BytesWow, das wurde länger als erwartet:
Die Funktion nimmt eine URL als Eingabe
f('test.jpg');
und zeichnet das Ergebnis in eincanvas
-Element, das an das angehängt wirdbody
.Beachten Sie, dass sich die Quelle in derselben Domäne befinden muss, oder das Skript wird aufgrund eines Sicherheitsproblems angehalten.
Einschränkungen
Ich habe es in Firefox 42 unter OS X (10.10) auf einem Computer mit 2,5 GHz i7 und 16 GB RAM getestet. Die maximale Bildgröße, die ich ohne die Aufforderung von Firefox zur Fortsetzung der Skriptausführung verarbeiten konnte, betrug 1600 x 1932 px .
Ungolfed
Ausgabe
Zum besseren Vergleich habe ich auch die " American Gothic " als Beispielquelle genommen:
Bearbeitungen
for (a in b)
anstelle vonfor(;;)
. Vielen Dank an ar34zdocument
in einer Variablen.()
.()
auf der Objekterstellung und ein anderes Paar von redundanten entfernen()
. Dank apsillers .for
-loop, die die Farben jedes Pixels erhält.quelle
for(k in t)
ein paar Bytes mehr sparen :)()
innew Image()
; Verwenden Sie für Ihre Zeichenfolgenargumente ( , ) mit Tags versehene Schablonenzeichenfolgen. Verwenden Sie keine Klammern für Parameter mit Einzelpfeilfunktionen (tun Sie dies einfach ; Parens sind nur für Pfeilfunktionen mit mehreren oder null Parametern verfügbar). Möglicherweise haben Sie auch ein oder zwei Schleifen mit einer Anweisung , die eckige Klammern haben, die nicht erforderlich sind.createElement`canvas`
getContext`2d`
f=u=>{...}
for
i.onload=$=>...
anstelle voni.onload=()=>...
)for(l in u)f.push(u[l]);
kann werdenfor(z of u)f.push(z);
:)
. -for(u of t)for(z of u)f.push(z)
ist ziemlich verdammt kurz, kann aber noch weiter gekürzt werdent.map(u=>u.map(z=>f.push(z)))
. In vielen Fällen ist die Verwendung von.map
oder.some
mit einer Pfeilfunktion kürzer als die Verwendung einerfor
Schleife. Wenn Sie wirklich verrückt werden möchten , können Sie hier noch mehr sparen , indem Siet.map(u=>f.push.apply(f,u));
"Für jedes Arrayu
in" als Liste von Argumenten an " via" senden (da eine unbegrenzte Anzahl von Argumenten akzeptiert werden kann und alle in die richtige Reihenfolge gebracht werden).t
u
f.push
apply
push
Bash + GNU-Utils, 80
Dies setzt voraus, dass das Eingabe- / Ausgabeformat das TXT-Format der ImageMagick-Pixel-Aufzählung aufweist. Die Eingabe wird als Dateiname übergeben und die Ausgabe geht an STDOUT.
Wenn das oben Genannte nicht als bekanntes Bildformat angesehen wird, können wir die erforderlichen Konvertierungen hinzufügen:
Bash + GNU-Utils + ImageMagick, 108
Eingabe und Ausgabe werden als Dateinamen angegeben. ImageMagick bestimmt, welche Dateiformate von den übergebenen Dateierweiterungen verwendet werden sollen, sodass wir alle gängigen verwenden können:
Das resultierende o.png sieht so aus:
quelle
Python 2, 128 Bytes
Sofern es sich bei dem Bild um eine Datei
a
ohne Erweiterung handelt, handelt es sich bei der Ausgabe um eine Dateib
ohne Erweiterung.quelle
a.putdata(sorted(b[f/c,f%d]for f in range(d*c)))
(ich bin gerade aufgewacht, also habe ich die Variablen möglicherweise vertauscht).Java, 316 Bytes
Platziert die Hexadezimalwerte der Pixelfarben in einem Array. Das Array wird sortiert und die Farben werden den Pixeln im Bild neu zugeordnet. Der Name des resultierenden Bildes ist
a.png
.quelle
SmileBASIC,
3935 BytesAngenommen, das Bild wird auf die 512 * 512-Grafikseite geladen:
Erklärt:
So einfach ist das!
Leider müssen wir Ganzzahlen verwenden, wodurch die Programmgröße aufgrund der Typ-Suffixe um 4 Byte erhöht wird.quelle
SYS/DEFSP.GRP
ein eingefügt , was das offensichtliche Gegenteil der Frage ist. Die Verwendung von Schwimmern setzt oben links und unten rechts, was richtig ist. (Natürlich behandelt dies die hexadezimalen Farben als vorzeichenlosen / höheren Kanal größer, was wahrscheinlich richtig ist.)FF000000
00101010
00000000
FFF8F8F8
0xFF000000
kleiner als0x00101010
), aber ich bin mir eigentlich nicht sicher, warum ich hier Ganzzahlen verwendet habe ... Ich denke bei Zu der Zeit, als ich nicht verstand, wie GLOAD vorzeichenlose Werte verwendete, als Sie ein Float-Array verwendeten, und nur davon ausging, dass es nicht funktionierte.Java,
424417404 BytesNun, das ist keine Sprache, in der du Golf spielen willst ...
quelle
C #, 497 Bytes
Erstes Mal nach dem ersten Golf. Ganz klar nicht das Beste zum Golfen
Ich respektiere die Rohrleitungen nicht wirklich. Nimmt einen Bildpfad als Eingabe und gibt ihn mit dem Buchstaben "o" vor dem Namen aus.
Funktioniert besser mit Bitmaps, Chancenergebnisse mit anderen
quelle
Haskell, 195 Bytes
Dies nutzt die
GD
Bibliothek. Verwendungf <filename>
. Die Eingabedatei muss impng
Format vorliegen. Die Ausgabedatei heißto
.So funktioniert es: Unkompliziert, dh das Bild lesen, alle Koordinaten durchlaufen und die Pixel abrufen, die Pixel sortieren, die Koordinaten erneut durchlaufen, aber diesmal die Pixel in der Reihenfolge einstellen, in der sie in der sortierten Liste angezeigt werden, in die die Datei geschrieben wird Platte.
quelle