XOR два монохромні зображення


28

Виклик:

Візьміть введення двох чорно-білих (монохромних) зображень і xor кожен піксель першого, кожен піксель другого, додайте їх до нового зображення та виведіть нове зображення.

Деякі роз’яснення:

Розмір картинок не має значення. Формат розширення / зображення не має значення. Ви можете змусити його вводити будь-яке розширення та виводити будь-яке розширення, якщо розширення використовується для зберігання цифрових зображень. Ви також можете використовувати графіку для малювання результатів у, наприклад: графічному вікні, якщо бажаєте. В іншому випадку збережіть вихід у вигляді файлу. Введення можна сприймати як шлях до зображення або URL.

Однак ви не можете зробити це масиви вводу / виводу, наприклад. трійки (R, G, B).

НЕ підробляти альфа . Це не повинно бути чітким, воно повинно бути 255 (максимальне значення) для кожного пікселя.

Що ви маєте на увазі xor кожного пікселя?

Не потрібно робити це таким чином, але один із способів об'єднати два пікселі - це прийняти їх значення RGB і xor R1 з R2, G1 з G2, B1 з B2, і отримати результат, який є вашим новим кольором

Оскільки у нас є лише два кольори, очевидно, коли кольори однакові, результат був би (0,0,0) і коли вони різні (білий - 255,255,255, а чорний - 0,0,0), у цьому випадку результат бути 255,255,255.

Таким чином, коли два пікселі різні, результат - білий піксель, а інший - чорний піксель

Приклад вводу / виводу:


Введення 1: Введення 2:

Введення 1 Введення 2


Вихід:

Вихідні дані


Це тому виграє найкоротший код.


Чи можемо ми взяти вхідне зображення як URL?
Kritixi Lithos

@KritixiLithos yup, я редагував це у виклику для будь-яких подальших глядачів.
П. Ктінос

5
Бонусний виклик: i.imgur.com/a0M6o9e.png та i.imgur.com/bP1TsjQ.png .
orlp


@orlp Я перейшов до коду qr
Kritixi Lithos

Відповіді:


20

Мова виразів Fx (ImageMagick), 8 4 байти

РЕДАКТИ

  • Спрощено до u!=v-4 байт

Оскільки "Мова експресії Fx" , очевидно, Тюрінг завершена, я перепрофілював свою відповідь на неї (була Unix Shell + Magick Image).

Гольф

u!=v

Fx не підтримує розрядний XOR, ні бітовий НЕ , тому я використовував !=натомість (що працює чудово для чистих зображень BW).

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

Вхід і вихід неявні (контролюються перекладачем).

Використання

Утиліта конвертування ImageMagick служить інтерпретатором "Мова виразів Fx", коли викликається -fx, як показано нижче:

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

Аргументи:

  1. Вхідне зображення A
  2. Вхідне зображення B
  3. Вихідне зображення O (A ^ B).

Вибірка зразка

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

введіть тут опис зображення


15

Математика, 37 34 15 байт

Дякуємо Ієну Міллеру за скорочення кількості байтів більш ніж наполовину!

ImageDifference

Зрештою, завжди є вбудований. Ця функція приймає два зображення як вхід і виводить зображення; це робить щось більш складне для кольорових зображень, але для чорно-білих - це саме XOR.

Попередні подання:

Дякуємо JungHwan Min за економію 3-х байт!

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

Безіменна функція, яка приймає в якості введення впорядковану пару зображень (сумісних розмірів) і повертає відображене зображення. ImageDataотримує лише дані пікселів без усіх обгортків / метаданих; на жаль, він повертає дійсні числа, тому Chopпотрібен, щоб допомогти трактувати їх як цілі числа. BitXorробить саме те, що написано на тині (і нитках над вкладеними списками), і Imageперетворює отриманий RGB назад у зображення.

Оригінальне подання, яке ввело впорядковану пару URL-адрес або імен файлів:

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

4
Для двійкових зображень ви можете використовувати ImageDifference[#,#2]&
Ian Miller

10

Java, 336 335 328 байт

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"));}}

Безголівки:

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
Можна зберегти байт, видаливши пробіл між ними String[] y. Просто незначний маленький гольф.
HyperNeutrino

О, боже, ти маєш рацію. Останнім часом не займався великим гольфом, цілком не помітив цього. Ура.
Марв

3
Ви можете видалити publicз, public class Mщоб зберегти 7 байт
Kritixi Lithos

Розширення файлу .pngне повинно бути необхідним
Huntro

Ви можете зберегти байт, зробивши ... "i ++ <a.getHeight ();)"
Tatarize

9

Пітон, 64 60 57 байт

Я новачок у гольфі, тому помилуйся!

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

Дякую @Blender та @FlipTack, що врятували мені 7 байт!


1
Використання from cv2 import*повинно стригти 4 символи.
Блендер

1
Тут неназвані лямбдахи дозволені для відповідей на функції, тож ви можете відкинути d=:) також, виконувати, r=imreadа потім використовувати rдва рази може бути коротше
FlipTack

7

Октава, 43 38 34 байт

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

Завдяки ваді врятував мене 5 байт.

Завдяки Луїсу Мендо врятував мене 4 байти, запропоновані a~=bзамість цього xor(a,b).

Функція, яка приймає як ім'я вхідного файла двох вхідних зображень a,bі показує результат.

Попередня відповідь, що записується у файл:

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

Функція, яка приймає як ім'я вхідного файлу двох вхідних зображень a,bта ім'я файлу вихідного зображення c.

Використання:

#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)

Результат зберігається в out.png


1
Ви не можете використовувати imshow()замість цього imwrite()?
невдача

@flawr Звичайно, це збереже кілька байт :)
rahnema1

1
Ви не можете використовувати imread(a)~=imread(b)(або +(imread(a)~=imread(b))якщо логічне введення заборонено imshow) замість xor(...)?
Луїс Мендо

1
@LuisMendo Дякую, я завжди вчуся з ваших коментарів!
rahnema1

7

JavaScript (ES6), 333 320 308 299 297 байт

- 12 20 байт, збережених Ісмаелем Мігелем
- 2 байти, збережені користувачем2428118

Очікує вже завантажені зображення, приймає розмір першого входу як розмір виводу та повертає елемент полотна.

(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">

Безумовно

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

Пса: Перший раз у коді-гольф, так що, ймовірно, можна пограти більше в гольф, і мій рахунок може бути помилковим.

ПП: canvas 2D контекст має xor[режим композиції ( https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation ), але він працює на альфа-значеннях ...

Може бути ще більше гольфу (251 байт) з фіксованим розміром 300 * 150 пікселів (все, що залишилося - чорним), як у відповіді на обробку

(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
Замініть функцію cна c=i=>{with(document.createElement('canvas')){width=i.width,height=i.height;return getContext`2d`}}і ви заощадите 16 байт.
Ісмаїл Мігель

Невже ви не маєте xorчорного прямокутника над xorдвома зображеннями, щоб повернутися до 255 альфа?
Ніл

@IsmaelMiguel, дякую, не використовується для використання, withале здається, непогано для гольфу ;-) Крім того, забув шаблон буквально зберігає 2 байти ...
Kaiido

@Neil, я не впевнений, тут у нас є 8-бітовий масив, можливо, з 32 бітами, який міг би це зробити, але це займе більше символів ...
Kaiido

1
Зберігає 4 байти:(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]}
користувач2428118

7

Обробка, 124 118 117 байт

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);}

Використання:

Примітка. Цей код може підтримувати зображення до 400px(з модифікаціями може підтримувати до 999 для того ж рахунку). Будь-який простір, що залишився, буде кольоровим кольором, тому для найкращих результатів розмір зображення повинен бути такого ж розміру, як розміри в коді (також size()потрібно змінити оновлені розміри)

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

введіть тут опис зображення

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

введіть тут опис зображення

Безумовно

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 байт

YiiYiY~1YG

Пояснення

Це в основному та сама відповідь, що і діюче рішення Octave : воно приймає назви файлів або URL-адреси обох зображень як вхідні дані та відображає результат на екрані.

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

Використання

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

1
Це 10 байт.
Ерік Аутгольфер

3

Perl, 260 байт

251 байт коду + 9 байт для -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')

Я не впевнений, що Perl є найкращою мовою для цього виклику, але я хотів знати, яким є образ коментаря @ orlp. І це змушує мене трохи використовувати ці графічні модулі, це добре. І мені подобалося кодувати це!

Більш прочитана версія:

використовувати Imager ; 
$ img1 = новий Imager ( файл => $ ARGV [ 1 ] ); 
$ img2 = новий Imager ( файл => $ ARGV [ 0 ] );   

для $ x ( 0 .. $ img1 -> getwidth () - 1 ) { для $ y ( 0 .. $ img1 -> getheight () - 1 ) { ( $ r1 , $ g1 , $ b1 ) = $ img1 - > getpixel ( x => $ x , y => $ y , введіть => "8bit" ) -> rgba (); ( $ r2 , $ g2    
        
       
    , $ b2 ) = $ img2 -> getpixel ( x => $ x , y => $ y , type => "8bit" ) -> rgba (); 
    $ r = $ 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 ( файл => 'a.png' )  
    
  

Вам потрібно буде встановити Imager, якщо ви хочете спробувати його, але це досить просто: просто запустіть (echo y;echo) | perl -MCPAN -e 'install Imager'у своєму терміналі.


3

LÖVE2D , 199 байт

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")

Досить просто: приймає два файли зображень у командному рядку, виводить файл, який називається "Z", у каталог Love. Також працює для повнокольорових зображень!


1
@MDXF love2d.org
ATaco

2

J, 54 байти

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

Бере два аргументи, де кожен - це шлях до вхідного зображення у bmpформаті. Кожне зображення читається як матриця з 24-бітових цілих RGB і розбирається в триплеті 8-бітних значень RGB, знак кожного приймається, і дві матриці є XOR разом. Потім результат масштабується на 255, перетворюється назад з триплета базових 256 чисел у ціле число і записується у вихідний bmpфайл з ім'ям o.


2

C, 189 байт

#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))

Працює на зображеннях PBM. Телефонуйте f(a, b, out)з іменами як вхідних, так і вихідних файлів.

Припущення:

  • Обидва заголовки вхідних зображень однакові (пробіл включений) та менше 9 * sizeof(int)символів.

  • Ми в хорошій ОС, яка промиває та закриває просочені файли.

  • EOF == -1

Недолікований і пояснив: ( відхилення відкосів )

// 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 (спец-згинання), 149 байт

#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)

Ще використовує файли PBM, але зараз:

  • Зображення має бути високим на один піксель і шириною 8 пікселів або менше, оскільки PBM пакує 8 пікселів у байт.

  • Заголовок повинен становити 7 байт (наприклад, P4 8 1з пробілом).

Обидва файли шукаються вперед під час заповнення tїх заголовка, потім читаються останні байти, xor'd і записуються назад. Приймає перевагу freadі fwriteмають аналогічні списки параметрів для фактора все три операції по заголовку за той же макрос.


2

R, 45 байт

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

aі bпредставляють назви двох файлів зображень.

Приклад:

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

Вихід:

введіть тут опис зображення


2

Обробка, 82 байти

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);}

Зловживань Обробляє широкі функції малювання, щоб уникнути фактичного виконання XORing. Змішує два зображення разом із DIFFERENCEрежимом та малює їх на екран.

Використання

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

Безумовно

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);
}

Гарний гольф! Це дійсно розумно, що ви використовували 32замість цього DIFFERENCE. Це була б чудова порада для гри в гольф: codegolf.stackexchange.com/questions/26809/… :)
Kritixi Lithos

2

C #, 233 байти

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");}}

Завдяки Unknown6656 за пораду, що аргументи командного рядка не потрібні. Тепер програма читає з файлів "a" і "b" і записує у файл "c" у тому ж форматі, що і "a". Вимкнено також одну помилку, виправлену.

Він встановлює кожен піксель чорним, якщо колір однаковий, інакше білий.

Щоб зберегти байти, він витягує винятки за межі, а не перевіряє властивості бітових карт Width та Height. Кожен раз, коли x виходить за межі, вона скидається на 0, а y збільшується. Коли y виходить за межі, x дорівнює 0, і цикл розривається, щоб зберегти зображення та вийти з роботи.

Приклад компіляції за допомогою csc та запуску з використанням моно:

csc xor.cs

mono xor.exe

Ви можете (string[] v)запустити маркер всередину основної декларації, оскільки C # явно не потребує її для запуску програми
unknown6656

1

Clojure, 300 байт

(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"))))

Очевидне стирання відповіді на Java . Я не знав, як зробити виклик, але мені було цікаво, наскільки добре рішення Java переведено на Clojure. Це було досить прямо. Код, який не має волі, насправді є досить гарним.

Це був перший виклик коду-гольфу, який я зробив, що включав імпорт. Напевно, існує спосіб їх оптимізації для збереження деяких байтів.

Безголівки:

(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 байти

Я, мабуть, я можу гольфу більше.

$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);

Запустіть його з командного рядка так:

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

Визначення змінних назв функції при їх першому виникненні може допомогти: $i=imagecreatefrompng;$a=$i($argv[1])на один байт довше, ніж $a=($i=imagecreatefrompng)($argv[1]). І ви можете спробувати зображення палітри з двоколірною палітрою.
Тит

Я спробував визначити це при першій появі, але я все-таки отримував фатальну помилку. Я спробую знову пізніше, коли встигну. Можливо, я не зробив це правильно.
Кодос Джонсон

($f=func)(params)вимагає PHP 7.
Тіт

@Titus ах добре дякую. Це звів мене на 3 байти.
Кодос Джонсон

Ось ще 7 байтів: Замініть for(;$k<$w*$h;)на for(;$y<$h;$y+=1/$w), $x=$k%$w, $y=$k++/$w з $x, $yі останній $xна $x++. (припускаючи, що немає помилок округлення для будь-яких розумних розмірів зображення)
Тіт

0

Node.js, 156 135 байт

(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``))

Вхідні та вихідні файли зображень повинні бути у форматі PBM (P1), де перший рядок P1 [width] [height], а другий рядок - значення b / w ascii без пробілів.

Ось вхідні зображення з подальшим виходом xor (32x32 пікселів):

Введення №1 Введення №2 Вихідні дані

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.