Herausforderung:
Nehmen Sie die Eingabe von zwei Schwarzweißbildern (einfarbig) und xoder jedes Pixel des ersten mit jedem Pixel des zweiten, fügen Sie sie zu einem neuen Bild hinzu und geben Sie das neue Bild aus.
Einige Klarstellungen:
Die Größe der Bilder spielt keine Rolle. Erweiterung / Bildformat spielt keine Rolle. Sie können festlegen, dass eine beliebige Erweiterung eingegeben und eine beliebige Erweiterung ausgegeben wird, sofern die Erweiterung zum Speichern digitaler Bilder verwendet wird. Sie können auch Grafiken verwenden, um die Ausgabe zu zeichnen, z. B. in einer Bildbox, wenn Sie dies wünschen. Speichern Sie andernfalls die Ausgabe als Datei. Die Eingabe kann als Pfad zum Bild oder als URL verwendet werden.
Eine Sache, die Sie jedoch nicht tun können, sind E / A-Arrays, z. von Tripletts (R, G, B).
Verändern Sie Alpha NICHT . Es sollte nicht xored sein, es sollte 255 (maximaler Wert) für jedes Pixel sein.
Was meinst du mit xoder jedem Pixel?
Sie müssen es nicht so machen, aber eine Möglichkeit, zwei Pixel zu xen, besteht darin, ihre RGB-Werte und xor R1 mit R2, G1 mit G2, B1 mit B2 zu nehmen und das Ergebnis zu nehmen, das Ihre neue Farbe ist
Da wir nur zwei Farben haben, wäre in diesem Fall das Ergebnis offensichtlich (0,0,0), wenn die Farben gleich sind, und wenn sie unterschiedlich sind (Weiß ist 255,255,255 und Schwarz ist 0,0,0), das Ergebnis 255,255,255 sein.
Wenn also zwei Pixel unterschiedlich sind, ist das Ergebnis ein weißes Pixel, sonst ein schwarzes Pixel
Beispiel I / O:
Eingang 1: Eingang 2:
Ausgabe:
Das ist Code-Golf, also gewinnt der kürzeste Code.
quelle
Antworten:
Die FX-Ausdruckssprache (ImageMagick),
84 BytesEDITS
u!=v
-4 BytesDa "Fx Expression Language" anscheinend vollständig ist, habe ich meine Antwort darauf neu profiliert (war Unix Shell + Image Magick).
Golf gespielt
Fx unterstützt weder bitweises XOR noch bitweises NOT , daher habe ich
!=
stattdessen verwendet (was für reine BW-Bilder gut funktioniert).Eingabe und Ausgabe sind implizit (vom Interpreter gesteuert).
Verwendung
Das ImageMagick- Konvertierungsprogramm dient beim Aufrufen wie folgt als Interpreter für die "FX-Ausdruckssprache"
-fx
:Die Argumente sind:
Beispielausgabe
quelle
Mathematica,
373415 BytesVielen Dank an Ian Miller, der die Anzahl der Bytes um mehr als die Hälfte reduziert hat!
Am Ende gibt es immer ein eingebautes. Diese Funktion nimmt zwei Bilder als Eingabe und gibt ein Bild aus. Bei Farbbildern ist dies etwas komplizierter, bei Schwarzweiß ist es jedoch genau XOR.
Bisherige Einsendungen:
Vielen Dank an JungHwan Min für die Einsparung von 3 Bytes!
Unbenannte Funktion, die ein bestelltes Bildpaar (mit kompatiblen Abmessungen) als Eingabe verwendet und ein angezeigtes Bild zurückgibt.
ImageData
Ruft nur die Pixeldaten ohne alle Wrapper / Metadaten ab. Leider gibt es reelle Zahlen zurück, daherChop
wird es benötigt, um sie als ganze Zahlen zu behandeln.BitXor
Tut genau das, was es verspricht (und fädelt verschachtelte Listen ein) undImage
wandelt das resultierende RGB wieder in ein Bild um.Ursprüngliche Einreichung, bei der ein bestelltes Paar von URLs oder Dateinamen als Eingabe verwendet wurde:
quelle
ImageDifference[#,#2]&
Java,
336335328 BytesUngolfed:
quelle
String[] y
. Nur ein bisschen Golf.public
von entfernenpublic class M
, um 7 Bytes zu sparen.png
sollte nicht notwendig seinPython,
646057 BytesIch bin neu im Golfen, also hab Erbarmen!
Vielen Dank an @Blender und @FlipTack für das Speichern von 7 Bytes!
quelle
from cv2 import*
sollte 4 Zeichen abschneiden.d=
:) auch tunr=imread
und dann mitr
zweimal könnte kürzer seinOktave,
433834 BytesDank flawr habe ich 5 Bytes gespart.
Dank Luis hat Mendo mir 4 Bytes gespart, die ich
a~=b
anstelle von verwenden möchtexor(a,b)
.Eine Funktion, die den Namen der Eingabedatei der beiden Eingabebilder übernimmt
a,b
und das Ergebnis anzeigt.Vorherige Antwort, die in eine Datei schreibt:
Eine Funktion, die als Eingabedateinamen die beiden Eingabebilder
a,b
und den Dateinamen des Ausgabebildes verwendetc
.Verwendung:
Ergebnis wird gespeichert in
out.png
quelle
imshow()
anstelle von verwendenimwrite()
?imread(a)~=imread(b)
(oder+(imread(a)~=imread(b))
wenn logische Eingabe nicht erlaubt istimshow
)xor(...)
?JavaScript (ES6),
333320308299297 Bytes-
1220 Bytes gespeichert von Ismael Miguel- 2 Bytes gespeichert von user2428118
Erwartet bereits geladene Bilder, nimmt die Größe der ersten Eingabe als Ausgabegröße und gibt ein Zeichenflächenelement zurück.
Ungolfed
Ps: Zum ersten Mal beim Code-Golf, also kann wahrscheinlich mehr Golf gespielt werden und meine Zählung könnte falsch sein.
PPs: Canvas-2D-Kontext verfügt über einen
xor
[Compositing-Modus ( https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation ), funktioniert jedoch mit Alpha-Werten ...Könnte mit einer festen Größe von 300 * 150px (alles, was übrig bleibt, ist schwarz) wie in der Antwort "Verarbeitung" noch weiter golfen werden (251 Byte)
Code-Snippet anzeigen
quelle
c
durchc=i=>{with(document.createElement('canvas')){width=i.width,height=i.height;return getContext`2d`}}
und Sie sparen 16 Bytes.xor
ein schwarzes Rechteck über dasxor
der beiden Bilder ziehen, um zu 255 Alpha zurückzukehren?with
aber scheint ziemlich gut zum Golfen ;-) Auch vergessen, das Template-Literal speichert 2 Bytes ...(i,j)=>{c=i=>{with(document.createElement(C='canvas')){width=i.width,height=i.height;return getContext`2d`}},g=i=>{x=c(i);x.drawImage(i,0,0);return x.getImageData(0,0,i.width,i.height)},a=g(i),b=g(j).data,d=a.data,r=c(i);d.forEach((e,i)=>{d[i]=i%4>2?255:e^b[i]});r.putImageData(a,0,0);return r[C]}
Verarbeitung,
124118117 BytesVerwendung:
Ungolfed
quelle
MATL , 10 Bytes
Erläuterung
Dies ist im Grunde die gleiche Antwort wie bei der vorhandenen Octave-Lösung : Sie verwendet die Dateinamen oder URLs beider Bilder als Eingaben und zeigt das Ergebnis auf dem Bildschirm an.
Verwendung
quelle
Perl, 260 Bytes
251 Byte Code + 9 Byte für
-MImager
.Ich bin nicht sicher, ob Perl die beste Sprache für diese Herausforderung ist, aber ich wollte wissen, wie der Kommentar von @ orlp aussieht. Und es bringt mich dazu, ein bisschen von diesen Grafikmodulen zu verwenden, das ist eine gute Sache. Und ich habe es genossen, es zu programmieren!
Eine lesbarere Version:
Sie müssen Imager installieren, wenn Sie es ausprobieren möchten, aber es ist ganz einfach: Führen
(echo y;echo) | perl -MCPAN -e 'install Imager'
Sie es einfach in Ihrem Terminal aus.quelle
LÖVE2D , 199 Bytes
Einfach genug, nimmt zwei Bilddateien auf der Kommandozeile auf und gibt eine Datei mit dem Namen "Z" in das Love-Verzeichnis aus. Funktioniert auch für farbige Bilder!
quelle
J, 54 Bytes
Nimmt zwei Argumente an, wobei jedes der Pfad zu einem Eingabebild im
bmp
Format ist. Jedes Bild wird als eine Matrix von 24-Bit-RGB-Ganzzahlen gelesen und in ein Triplett von 8-Bit-RGB-Werten zerlegt, das Vorzeichen von jedem wird genommen und die zwei Matrizen werden durch XOR miteinander verknüpft. Das Ergebnis wird dann mit 255 skaliert, von einem Triplett von Basis-256-Zahlen in eine Ganzzahl zurückgewandelt und in eine Ausgabedatei mit dembmp
Namen geschriebeno
.quelle
C 189 Bytes
Funktioniert mit PBM-Bildern. Anruf
f(a, b, out)
mit den Namen der beiden Eingabedateien und der Ausgabedatei auf.Annahmen:
Beide Eingabebild-Header sind identisch (einschließlich Leerzeichen) und bestehen aus weniger als
9 * sizeof(int)
Zeichen.Wir haben ein nettes Betriebssystem, das geleakte Dateien löscht und schließt.
EOF == -1
Ungolfed und erklärt: (Backslashes weggelassen)
C (Spec-Bending), 149 Bytes
Verwendet immer noch PBM-Dateien, aber jetzt:
Das Bild muss ein Pixel hoch und 8 Pixel breit oder weniger sein, da PBM 8 Pixel in einem Byte packt.
Der Header muss aus 7 Bytes bestehen (z. B.
P4 8 1
mit einem nachgestellten Leerzeichen).Beide Dateien werden beim Füllen
t
mit ihrem Header vorwärts gesucht , dann werden die letzten Bytes gelesen, xor'd und zurückgeschrieben. Nutztfread
und verfügtfwrite
über ähnliche Parameterlisten, um alle drei Operationen in der Kopfzeile hinter demselben Makro zu berücksichtigen.quelle
R, 45 Bytes
a
undb
repräsentieren die Dateinamen der beiden Bilddateien.Beispiel:
Ausgabe:
quelle
Verarbeitung, 82 Bytes
Die umfangreichen Zeichenfunktionen von Missbrauchsverarbeitung verhindern, dass tatsächlich XOR-Operationen ausgeführt werden. Mischt die beiden Bilder mit dem
DIFFERENCE
Modus und zeichnet sie auf den Bildschirm.Verwendung
Ungolfed
quelle
32
anstelle von verwendet habenDIFFERENCE
. Dies wäre ein guter Tipp zum Golfen: codegolf.stackexchange.com/questions/26809/… :)C #, 233 Bytes
Vielen Dank an Unknown6656 für den Tipp, dass Befehlszeilenargumente nicht erforderlich sind. Das Programm liest nun aus den Dateien "a" und "b" und schreibt im gleichen Format wie "a" in die Datei "c". Aus um einen Fehler behoben.
Hiermit wird jedes Pixel auf Schwarz gesetzt, wenn die Farbe identisch ist, andernfalls auf Weiß.
Um Bytes zu sparen, werden Ausnahmen außerhalb des zulässigen Bereichs abgefangen, anstatt die Eigenschaften Width und Height der Bitmaps zu überprüfen. Jedes Mal, wenn x die Grenzen überschreitet, wird es auf 0 zurückgesetzt und y wird inkrementiert. Wenn y außerhalb der Grenzen liegt, ist x 0 und die Schleife wird unterbrochen, um das Bild zu speichern und zu beenden.
Beispiel mit csc kompilieren und mit mono ausführen:
quelle
(string[] v)
in derClojure, 300 Bytes
Eklatante Abzocke der Java-Antwort . Ich wusste nicht, wie ich die Herausforderung angehen sollte, war aber gespannt, wie gut die Java-Lösung in Clojure übersetzt wurde. Es war ziemlich einfach. Der ungolfed Code ist eigentlich ein bisschen hübsch.
Dies war die erste Code-Golf-Herausforderung, die ich mit Importen durchgeführt habe. Es gibt wahrscheinlich eine Möglichkeit, sie zu optimieren, um einige Bytes zu sparen.
Ungolfed:
quelle
PHP,
246243 BytesIch kann das wahrscheinlich mehr runter spielen.
Führen Sie es von der Kommandozeile wie folgt aus:
quelle
$i=imagecreatefrompng;$a=$i($argv[1])
ein Byte länger als$a=($i=imagecreatefrompng)($argv[1])
. Und Sie könnten Palettenbilder mit einer zweifarbigen Palette ausprobieren.($f=func)(params)
benötigt PHP 7.for(;$k<$w*$h;)
mitfor(;$y<$h;$y+=1/$w)
,$x=$k%$w, $y=$k++/$w
mit$x, $y
und das letzte$x
mit$x++
. (Vorausgesetzt, es gibt keine Rundungsfehler für angemessene Bildgrößen)Node.js,
156135 BytesEingabe- und Ausgabebilddateien sollten im PBM- Format (P1) vorliegen, wobei sich die erste Zeile befindet
P1 [width] [height]
und die zweite Zeile die s / w-ASCII-Werte ohne Leerzeichen sind.Hier sind die Eingabebilder, gefolgt von der xor-Ausgabe (32x32 Pixel):
quelle