XOR due immagini monocromatiche


28

Sfida:

Prendi l'input di due immagini in bianco e nero (monocromatiche) e xo ogni pixel del primo, con ogni pixel del secondo, aggiungili a una nuova immagine e genera la nuova immagine.

Alcuni chiarimenti:

Le dimensioni delle immagini non contano. Il formato estensione / immagine non ha importanza. Puoi fare in modo che accetti qualsiasi estensione e produca qualsiasi estensione, purché l'estensione venga utilizzata per archiviare immagini digitali. È inoltre possibile utilizzare la grafica per disegnare l'output, ad esempio in una finestra immagine se lo si desidera. Altrimenti, salvare l'output come file. L'input può essere preso come percorso per l'immagine o url.

Una cosa che non si può fare, tuttavia, sono gli array I / O, ad es. di terzine (R, G, B).

NON manomettere l' alfa . Non dovrebbe essere xored, dovrebbe essere 255 (valore massimo) per ogni pixel.

Cosa intendi per xo per ogni pixel?

Non devi farlo in questo modo, ma un modo per xor due pixel è quello di prendere i loro valori RGB e xor R1 con R2, G1 con G2, B1 con B2 e prendere il risultato, che è il tuo nuovo colore

Dato che abbiamo solo due colori, ovviamente quando i colori sono gli stessi il risultato sarebbe (0,0,0) e quando sono diversi (il bianco è 255.255.255 e il nero è 0,0,0) in questo caso, il risultato sarebbe essere 255.255.255.

Pertanto, quando due pixel sono diversi, il risultato è un pixel bianco, altrimenti un pixel nero

Esempio I / O:


Ingresso 1: Ingresso 2:

Ingresso 1 Ingresso 2


Produzione:

Produzione


Questo è quindi vince il codice più breve.


Possiamo prendere l'immagine di input come URL?
Kritixi Lithos,

@KritixiLithos yup, l'ho modificato nella sfida per tutti gli altri spettatori.
P. Ktinos,



@orlp Mi sono alzato al codice
QR

Risposte:


20

The Fx Expression Language (ImageMagick), 8 4 byte

EDITS

  • Semplificato a u!=v, -4 byte

Dato che "Fx Expression Language" è apparentemente completo, ho riprogettato la mia risposta (era Unix Shell + Image Magick).

golfed

u!=v

Fx non supporta XOR bit a bit né NOT bit a bit , quindi l'ho usato !=invece (che funziona perfettamente per le immagini BW pure).

u=> stands for "first image in list"
v=> "second image in list"

Input e output sono impliciti (controllati dall'interprete).

uso

Utilità di conversione ImageMagick , funge da interprete "Fx Expression Language", quando viene invocato con -fx, come illustrato di seguito:

convert $1 $2 -fx u!=v $3

Gli argomenti sono:

  1. Immagine di input A
  2. Immagine di input B
  3. Immagine in uscita O (A ^ B).

Uscita campione

convert a.png b.png -fx u!=v o.png

inserisci qui la descrizione dell'immagine


15

Mathematica, 37 34 15 byte

Grazie a Ian Miller per aver ridotto il numero di byte di oltre la metà!

ImageDifference

Alla fine, c'è sempre un builtin. Questa funzione prende due immagini come input e produce un'immagine; fa qualcosa di più complicato per le immagini a colori, ma per il bianco e nero è esattamente XOR.

Presentazioni precedenti:

Grazie a JungHwan Min per aver salvato 3 byte!

Image[BitXor@@Chop[ImageData/@#]]&

Funzione senza nome che accetta come input una coppia di immagini ordinate (di dimensioni compatibili) e restituisce un'immagine visualizzata. ImageDataottiene solo i dati pixel senza tutti i wrapper / metadati; purtroppo restituisce numeri reali, quindi Chopè necessario per aiutarli a trattarli come numeri interi. BitXorfa esattamente ciò che dice sulla latta (e Imagepassa sopra gli elenchi nidificati), e trasforma l'RGB risultante in un'immagine.

Invio originale, che ha inserito un input in una coppia ordinata di URL o nomi di file:

Image[BitXor@@(#~Import~"Data"&/@#)]&

4
Per le immagini binarie puoi usare ImageDifference[#,#2]&
Ian Miller il

10

Java, 336 335 328 byte

import static javax.imageio.ImageIO.*;import java.io.*;public class M{static void main(String[]y)throws Exception{java.awt.image.BufferedImage a=read(new File("a.png"));for(int i=0,j;i<a.getHeight();i++)for(j=0;j<a.getWidth();)a.setRGB(j,i,a.getRGB(j,i)^read(new File("b.png")).getRGB(j++,i));write(a,"png",new File("c.png"));}}

Ungolfed:

import static javax.imageio.ImageIO.*;

import java.io.*;

class M {
    public static void main(String[]y) throws Exception {
        java.awt.image.BufferedImage a = read(new File("a.png"));
        for (int i = 0, j; i < a.getHeight(); i++)
            for (j = 0; j < a.getWidth(); ) a.setRGB(j, i, a.getRGB(j, i) ^ read(new File("b.png")).getRGB(j++, i));
        write(a, "png", new File("c.png"));
    }
}

1
È possibile salvare un byte rimuovendo lo spazio tra String[] y. Solo un piccolo golf minore.
HyperNeutrino,

Oh dang hai ragione. Ultimamente non ho giocato a golf, trascurato del tutto. Saluti.
Marv,

3
Puoi rimuovere il publicda public class Mper salvare 7 byte
Kritixi Lithos

L'estensione del file .pngnon dovrebbe essere necessaria
Huntro il

Puoi salvare un byte facendo ... "i ++ <a.getHeight ();)"
Tatarize

9

Python, 64 60 57 byte

Sono nuovo nel golf, quindi abbi pietà!

from cv2 import*
r=imread;lambda a,b:imshow('c',r(a)^r(b))

Grazie a @Blender e @FlipTack per avermi salvato 7 byte!


1
L'uso from cv2 import*dovrebbe radere via 4 caratteri.
Blender il

1
Qui, i lambda senza nome sono ammessi per le risposte alle funzioni, quindi puoi anche rilasciare d=:), facendo r=imreade poi usando rdue volte potrebbe essere più breve
FlipTack

7

Ottava, 43 38 34 byte

@(a,b)imshow(imread(a)~=imread(b))

Grazie a flawr mi ha salvato 5 byte.

Grazie a Luis Mendo mi ha salvato 4 byte suggeriti di usare al a~=bposto di xor(a,b).

Una funzione che accetta come nome del file di input delle due immagini di input a,be mostra il risultato.

Risposta precedente che scrive in un file:

@(a,b,c)imwrite(imread(a)~=imread(b),c)

Una funzione che accetta come nome del file di input delle due immagini di input a,be il nome del file dell'immagine di output c.

Uso:

#two test images that used in the question
#https://i.stack.imgur.com/UbbfM.png
#https://i.stack.imgur.com/YyZG2.png
A = "UbbfM.png"; 
B = "YyZG2.png"; 
C = "out.png";
(@(a,b,c)imwrite(imread(a)~=imread(b),c))(A,B,C)

Il risultato è salvato in out.png


1
Non potresti usare al imshow()posto di imwrite()?
Flawr

@flawr Certo che salverà alcuni byte :)
rahnema1

1
Non puoi usare imread(a)~=imread(b)(o +(imread(a)~=imread(b))se l'ingresso logico non è consentito da imshow) invece di xor(...)?
Luis Mendo il

1
@LuisMendo Grazie, imparo sempre dai tuoi commenti!
rahnema1,

7

JavaScript (ES6), 333 320 308 299 297 byte

- 12 20 byte salvati da Ismael Miguel
- 2 byte salvati dall'utente2428118

Si aspetta immagini già caricate, prende la dimensione del primo input come dimensione di output e restituisce un elemento canvas.

(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]}

let func = (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?-1:e^b[i]});r.putImageData(a,0,0);return r[C]}

window.onload =_=>{
  document.body.appendChild(func(img1, img2));
  }
<img id="img1" crossOrigin="anonymous" src="https://dl.dropboxusercontent.com/s/nnfkzpvabk77pnl/UbbfM.png">
<img id="img2" crossOrigin="anonymous" src="https://dl.dropboxusercontent.com/s/58euf43vcb9pvpa/YyZG2.png">

Ungolfed

(i, j) => {
  c = i => { // an helper to create a canvas object
      with(document.createElement(C='canvas')) {
        width= i.width,
        height= i.height;
        return getContext`2d`
      }
    },
    g = i => { // an helper to get an imageData object
      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) => { // loop through all rgba values
    d[i] = i % 4 > 2 ? 255 : e ^ b[i] // we need to avoid alpha channel...
  });
  r.putImageData(a, 0, 0);
  return r[C]
}

Ps: Prima volta a code-golf, quindi probabilmente si può giocare a golf di più e il mio conteggio potrebbe essere errato.

PP: il contesto 2D canvas ha una xor[modalità di composizione ( https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation ), ma funziona su valori alfa ...

Potrebbe essere ulteriormente golfato (251 byte) con una dimensione fissa di 300 * 150 px (tutto il resto è nero) come nella risposta di elaborazione

(i,j)=>{c=i=>{return document.createElement(C='canvas').getContext('2d')},g=i=>{x=c(i);x.drawImage(i,0,0);return x.getImageData(0,0,W=300,W)},a=g(i),b=g(j).data,d=a.data,r=c(i);d.forEach((e,i)=>{d[i]=i%4>2?W:e^b[i]});r.putImageData(a,0,0);return r[C]}


1
Sostituisci la funzione ccon c=i=>{with(document.createElement('canvas')){width=i.width,height=i.height;return getContext`2d`}}e risparmi 16 byte.
Ismael Miguel,

Non puoi xorun rettangolo nero sopra la xordelle due immagini per tornare a 255 alfa?
Neil,

@IsmaelMiguel, grazie, non usato per usare withma sembra abbastanza buono per giocare a golf ;-) Inoltre,
ho

@Neil, non sono sicuro, qui abbiamo un array a 8 bit, forse con 32 bit, che potrebbe farlo, ma ci vorranno più caratteri ...
Kaiido

1
Salva 4 byte:(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]}
user2428118,

7

Elaborazione, 124 118 117 byte

void m(PImage a,PImage q){for(int i=0,j;i<400;i++)for(j=0;j<400;point(i,j++))stroke((a.get(i,j)^q.get(i,j))<9?0:-1);}

Uso:

Nota: questo codice può supportare immagini fino a 400px(con modifiche può supportare fino a 999 per lo stesso conteggio). Qualsiasi spazio "rimanente" sarà colorato di nero, quindi per ottenere i migliori risultati, la dimensione dell'immagine dovrebbe avere la stessa dimensione delle dimensioni nel codice (anche le dimensioni size()devono essere modificate con le dimensioni aggiornate)

m(loadImage("http://i.imgur.com/a0M6o9e.png"),loadImage("http://i.imgur.com/bP1TsjQ.png"));

inserisci qui la descrizione dell'immagine

m(loadImage("https://i.stack.imgur.com/UbbfM.png"),loadImage("https://i.stack.imgur.com/YyZG2.png"));

inserisci qui la descrizione dell'immagine

Ungolfed

void Q106945(PImage a,PImage q){     // takes two images as input
  for(int i=0,j;i<400;i++)           // looping through the x-coordinates
    for(j=0;j<400;point(i,j++))      // looping through the y-coordinates
      stroke((a.get(i,j)^q.get(i,j))<9?0:-1);
/*
Here we have to colour the point according to the xor. So we do a simple 
a.get(i,j)^q.get(i,j). But since the alpha gets xored, instead of outputting white, this
outputs a colour with alpha 0 (completely invisible). So to fix this I have a ternary that
checks the value and changes the colour accordingly. At the end of all this, the third 
statement of the for-loop with j gets triggered since all this code is in this for-loop. 
Now we draw a point over the coordinate with the colour we have chosen before.
*/
}

7

MATL , 10 byte

YiiYiY~1YG

Spiegazione

Questa è sostanzialmente la stessa risposta, come la soluzione Octave esistente : prende i nomi dei file o gli URL di entrambe le immagini come input e visualizza i risultati sullo schermo.

Yi    % Read first image from the URL or filename (implicit input)
i     % Get the second URL or filename as input
Yi    % Read that second image
Y~    % XOR the two images
1     % Push 1 (needed to make YG act as imagesc)
YG    % Display result using the MATLAB imagesc function

uso

>> matl
 > YiiYiY~1YG
 > 
> 'https://i.stack.imgur.com/UbbfM.png'
> 'https://i.stack.imgur.com/YyZG2.png'

1
Questo è di 10 byte.
Erik the Outgolfer,

3

Perl, 260 byte

251 byte di codice + 9 byte per -MImager.

($i,$j)=map{new Imager(file,pop)}0,1;$p=getpixel;for$x(0..$i->getwidth()-1){$i->setpixel(x=>$x,y=>$_,color=>[map{($j->$p(%t)->rgba)[$c++%3]^$_?0:255}($i->$p(%t=(x=>$x,y=>$_,type=>'8bit'))->rgba)[0..2]])for 0..$i->getheight()-1}$i->write(file=>'a.png')

Non sono sicuro che Perl sia la lingua migliore per questa sfida, ma volevo sapere qual era l'immagine del commento di @ orlp. E mi fa usare un po 'di quei moduli grafici, è una buona cosa. E mi è piaciuto codificarlo!

Una versione più leggibile:

usa Imager ; 
$ img1  = nuovo Imager ( file => $ ARGV [ 1 ] ); 
$ img2 = nuovo Imager ( file => $ ARGV [ 0 ] );  

per $ x ( 0 .. $ img1 -> getwidth () - 1 ) { per $ y ( 0 .. $ img1 -> getheight () - 1 ) { ( $ r1 , $ g1 , $ b1 ) $ b2 ) = $ img2 -> getpixel ( x => $ x , y => $ y , type => "8bit" ) -> rgba (); 
    $ r =    
        
      = $ img1 - > getpixel ( x => $ x , y => $ y , type => "8bit" ) -> rgba (); ( $ r2 , $ g2  
     ,    $ r1 ^ $ r2 ? 0 : 255 ; 
    $ g = $ g1 ^ $ g2 ? 0 : 255 ; 
    $ b = $ b1 ^ $ b2 ? 0 : 255 ;             
    $ img1-> setpixel ( x => $ x , y => $ y , color => [ $ r , $ g , $ b ] ); } } 
$ img1 -> write ( file => 'a.png' )  
    
  

Dovrai installare Imager se vuoi provarlo, ma è abbastanza semplice: eseguilo (echo y;echo) | perl -MCPAN -e 'install Imager'nel tuo terminale.


3

LÖVE2D , 199 byte

u,c=... i=love.image.newImageData a=math.abs X=i(u)Y=i(c)Z=i(X:getDimensions())Z:mapPixel(function(x,y)r,g,b=X:getPixel(x,y)R,G,B=Y:getPixel(x,y)return a(r-R),a(g-G),a(b-B)end)Z:encode("png","Z")

Abbastanza semplice, prende due file di immagine sulla riga di comando, genera un file chiamato "Z" nella directory Love. Funziona anche con immagini a colori!


1
@MDXF love2d.org
ATaco,

2

J, 54 byte

load'bmp'
'o'writebmp~256#.255*~:&*&((3#256)#:readbmp)

Accetta due argomenti in cui ognuno è il percorso di un'immagine di input in bmpformato. Ogni immagine viene letta come una matrice di numeri interi RGB a 24 bit e analizzata in una tripletta di valori RGB a 8 bit, il segno di ciascuno viene preso e le due matrici vengono raggruppate XOR. Il risultato viene quindi ridimensionato di 255, riconvertito da una tripletta di 256 numeri di base in un numero intero e scritto in un bmpfile di output denominato o.


2

C, 189 byte

#include<stdio.h>
s,t[9];
#define o(f,p)int*f=fopen(p,"ab+");
#define f(p,q,r)o(a,p)o(b,q)o(c,r)fscanf(a,"%*s %*d %*d %n",&s);for(fwrite(t,1,fread(t,1,s,b),c);s=~getc(a);putc(~s^getc(b),c))

Funziona con immagini PBM. Chiamataf(a, b, out) con i nomi di entrambi i file di input e del file di output.

ipotesi:

  • Entrambe le intestazioni dell'immagine di input sono identiche (spazi inclusi) e sono inferiori a 9 * sizeof(int) caratteri.

  • Siamo su un bel sistema operativo che scarica e chiude i file trapelati.

  • EOF == -1

Ungolfed e spiegato: (barre rovesciate omesse)

// Scratch variable and "big enough" buffer
s, t[9];

// Opens a file in read/append binary mode
#define o(f,p)int*f=fopen(p,"ab+");

#define f(p, q, r)

    // Open the three file pointers a, b, c from the paths p, q, r
    o(a, p)
    o(b, q)
    o(c, r)

    // Read from a to locate the end of the PBM header
    fscanf(a, "%*s %*d %*d %n", &s);

    for(
        // Read the header from b into the buffer,
        // then write it back from the buffer to c
        fwrite(t, 1, fread(t, 1, s, b), c);

        // Loop condition: get the next byte from a
        // and check for EOF with a bitwise-not
        // (Assumes that EOF == -1)
        s = ~getc(a);

        // Loop increment: get the next byte from b,
        // flip s back, xor and write to c
        putc(~s ^ getc(b), c)

    ) // Snatch the semicolon from the call syntax :)

C (piegatura spec), 149 byte

#include<stdio.h>
t[7];
#define o(f,p,u)int*f=fopen(p,"ab+");u(t,1,7,f);
#define f(p,q,r)o(a,p,fread)o(b,q,fread)o(c,r,fwrite)putc(getc(a)^getc(b),c)

Utilizza ancora i file PBM, ma ora:

  • L'immagine deve essere alta un pixel e larga 8 pixel o meno, poiché PBM racchiude 8 pixel in un byte.

  • L'intestazione deve essere di 7 byte (ad es. P4 8 1Con uno spazio finale).

Entrambi i file vengono cercati in avanti durante il riempimento tcon la loro intestazione, quindi gli ultimi byte vengono letti, scritti o riscritti. Sfrutta freade fwriteha elenchi di parametri simili per fattorizzare tutte e tre le operazioni sull'intestazione dietro la stessa macro.


2

R, 45 byte

p=png::readPNG;plot(as.raster(+(p(a)!=p(b))))

ae b rappresentano i nomi dei file dei due file di immagine.

Esempio:

a <- "YyZG2.png"
b <- "UbbfM.png"
p=png::readPNG;plot(as.raster(+(p(a)!=p(b))))

Produzione:

inserisci qui la descrizione dell'immagine


2

Elaborazione, 82 byte

void x(PImage a,PImage b){int x=b.width;b.blend(a,0,0,x,x,0,0,x,x,32);set(0,0,b);}

Abuse estese funzioni di disegno di elaborazione per evitare di eseguire qualsiasi XORing. Unisce le due immagini insieme alla DIFFERENCEmodalità e le disegna sullo schermo.

uso

x(loadImage("http://i.imgur.com/a0M6o9e.png"),loadImage("http://i.imgur.com/bP1TsjQ.png"));

Ungolfed

void xor(PImage a, PImage b) {
  int x = a.width;
  b.blend(a, 0, 0, x, x, 0, 0, x, x, DIFFERENCE);
  set(0, 0, b);
}

Bel golf! È davvero intelligente che hai usato 32invece di DIFFERENCE. Questo sarebbe un bel consiglio per il golf: codegolf.stackexchange.com/questions/26809/… :)
Kritixi Lithos

2

C #, 233 byte

using System.Drawing;class C{static void Main(){Bitmap
a=new Bitmap("a"),b=new Bitmap("b");for(int
x=0,y=0;;)try{a.SetPixel(x,y,a.GetPixel(x,y)==b.GetPixel(x,y)?Color.Black:Color.White);x++;}catch{if(x<1)break;x=0;++y;}a.Save("c");}}

Grazie a Unknown6656 per il suggerimento che gli argomenti della riga di comando non sono necessari. Il programma ora legge dai file "a" e "b" e scrive nel file "c" nello stesso formato di "a". Off anche da un errore risolto.

Imposta ogni pixel sul nero se il colore è lo stesso, altrimenti bianco.

Per salvare i byte, rileva le eccezioni dei limiti, anziché verificare le proprietà Larghezza e Altezza delle bitmap. Ogni volta che x esce dai limiti, viene reimpostato su 0 e y viene incrementato. Quando y esce dai limiti, x è 0 e il ciclo si interrompe per salvare l'immagine ed uscire.

Esempio compilare usando csc ed eseguire usando mono:

csc xor.cs

mono xor.exe

È possibile rilasciare il token (string[] v)all'interno della dichiarazione principale, poiché C # non ne ha esplicitamente bisogno per eseguire un'applicazione
unknown6656,

1

Clojure, 300 byte

(ns s(:import[java.io File][java.awt.image BufferedImage][javax.imageio ImageIO]))(defn -main[](let[a(ImageIO/read(File."a.png"))](doseq[i(range(.getHeight a))j(range(.getWidth a))](.setRGB a j i(bit-xor(.getRGB a j i)(.getRGB(ImageIO/read(File."b.png")) j i))))(ImageIO/write a"png"(File."c.png"))))

Rifiuto palese della risposta Java . Non sapevo come affrontare la sfida, ma ero curioso di sapere come la soluzione Java si traducesse in Clojure. È stato piuttosto semplice. Il codice ungolfed è in realtà piuttosto carino.

Questa è stata la prima sfida di code-golf che ho fatto che includeva le importazioni. C'è probabilmente un modo per ottimizzarli per salvare alcuni byte.

Ungolfed:

(ns bits.golf.bit-or-picts
  (:import [java.io File]
           [java.awt.image BufferedImage]
           [javax.imageio ImageIO]))

(defn -main []
  (let [^BufferedImage a (ImageIO/read (File. "a.png"))
        ^BufferedImage b (ImageIO/read (File. "b.png"))]
    (doseq [i (range (.getHeight a))
            j (range (.getWidth a))]
      (.setRGB a j i
                (bit-xor (.getRGB a j i)
                         (.getRGB b j i))))
    (ImageIO/write a "png" (File. "c.png"))))

1

PHP, 246 243 byte

Probabilmente posso giocare a golf di più.

$o=imagecreatetruecolor($w=max(imagesx($a=($i=imagecreatefrompng)($argv[1])),imagesx($b=$i($argv[2]))),$h=max(imagesy($a),imagesy($b)));for(;$k<$w*$h;)imagesetpixel($o,$x=$k%$w,$y=$k++/$w,($t=imagecolorat)($a,$x,$y)^$t($b,$x,$y));imagepng($o);

Eseguilo dalla riga di comando in questo modo:

php -d error_reporting=0 -r "$o=imagecreatetruecolor($w=max(imagesx($a=($i=imagecreatefrompng)($argv[1])),imagesx($b=$i($argv[2]))),$h=max(imagesy($a),imagesy($b)));for(;$k<$w*$h;)imagesetpixel($o,$x=$k%$w,$y=$k++/$w,($t=imagecolorat)($a,$x,$y)^$t($b,$x,$y));imagepng($o);" "http://i.stack.imgur.com/UbbfM.png" "http://i.stack.imgur.com/YyZG2.png" > output.png

La definizione delle variabili del nome della funzione alla prima occorrenza può aiutare: $i=imagecreatefrompng;$a=$i($argv[1])è un byte più lungo di $a=($i=imagecreatefrompng)($argv[1]). E puoi provare le immagini della tavolozza con una tavolozza a due colori.
Tito

Ho provato a definirlo alla prima occorrenza ma ho continuato a ricevere un errore fatale. Ci riproverò più tardi quando avrò tempo. Forse non l'ho fatto correttamente.
Kodos Johnson,

($f=func)(params)richiede PHP 7.
Titus

@Titus ah ok grazie. Questo mi ha portato giù 3 byte.
Kodos Johnson,

Ecco altri 7 byte: sostituisci for(;$k<$w*$h;)con for(;$y<$h;$y+=1/$w), $x=$k%$w, $y=$k++/$w con $x, $ye l'ultimo $xcon $x++. (supponendo che non vi siano errori di arrotondamento per dimensioni dell'immagine ragionevoli)
Tito

0

Node.js, 156 135 byte

(a,b)=>(f=require('fs')).writeFile(a+b,((s=f.readFileSync)(a)+'').replace(/\d+$/,(c,d)=>[...c].map((e,f)=>+!(e^(s(b)+b)[f+d])).join``))

I file di immagine di input e output devono essere nel formato PBM (P1), dove si trova la prima riga P1 [width] [height], e la seconda riga è i valori ascii in b / n senza spazi.

Ecco le immagini di input seguite dall'output xor (32x32 pixel):

Ingresso n. 1 Ingresso n. 2 Produzione

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.