Wyzwanie:
Wprowadź dwa czarno-białe (monochromatyczne) obrazy i xor każdego piksela pierwszego, z każdym pikselem drugiego, dodaj je do nowego obrazu i wyślij nowy obraz.
Kilka wyjaśnień:
Rozmiar zdjęć nie ma znaczenia. Format rozszerzenia / obrazu nie ma znaczenia. Możesz wprowadzić dowolne rozszerzenie i wyprowadzić dowolne rozszerzenie, o ile rozszerzenie jest używane do przechowywania obrazów cyfrowych. Możesz także użyć grafiki, aby narysować dane wyjściowe np. W ramce obrazu, jeśli chcesz. W przeciwnym razie zapisz wynik jako plik. Dane wejściowe można traktować jako ścieżkę do obrazu lub adresu URL.
Jedną rzeczą, której nie możesz zrobić, są tablice I / O, np. trypletów (R, G, B).
NIE manipuluj przy alfa . Nie powinien być xoredowany, powinien wynosić 255 (maksymalna wartość) na każdy piksel.
Co masz na myśli xor każdego piksela?
Nie musisz tego robić w ten sposób, ale jednym ze sposobów na xor dwa piksele jest pobranie ich wartości RGB i xor R1 z R2, G1 z G2, B1 z B2 i przyjęcie wyniku, który jest twoim nowym kolorem
Ponieważ mamy tylko dwa kolory, oczywiście gdy kolory są takie same, wynik byłby (0,0,0), a gdy są one różne (biały to 255,255,255, a czarny to 0,0,0) w tym przypadku wynik byłby być 255,255,255.
Zatem, gdy dwa piksele są różne, wynikiem jest biały piksel, w przeciwnym razie czarny piksel
Przykład I / O:
Wejście 1: Wejście 2:
Wydajność:
To jest golf golfowy, więc wygrywa najkrótszy kod.
źródło
Odpowiedzi:
The Fx Expression Language (ImageMagick),
84 bajtyEDYCJE
u!=v
-4 bajtówPonieważ „Fx Expression Language” najwyraźniej jest już ukończony, zmieniłem profil mojej odpowiedzi (była to Unix Shell + Image Magick).
Grał w golfa
Fx nie obsługuje bitowego XOR ani bitowego NIE , więc użyłem go
!=
(co działa dobrze dla czystych obrazów BW).Wejście i wyjście są niejawne (kontrolowane przez tłumacza).
Stosowanie
Narzędzie do konwersji ImageMagick , służy jako interpreter „Fx Expression Language”, gdy jest wywoływany
-fx
, jak pokazano poniżej:Argumenty są następujące:
Próbka wyjściowa
źródło
Mathematica,
373415 bajtówDziękujemy Ianowi Millerowi za zmniejszenie liczby bajtów o ponad połowę!
W końcu zawsze jest wbudowane. Ta funkcja pobiera dwa obrazy jako dane wejściowe i wysyła obraz; robi coś bardziej skomplikowanego dla kolorowych obrazów, ale dla czarno-białych jest to dokładnie XOR.
Poprzednie zgłoszenia:
Dzięki JungHwan Min za oszczędność 3 bajtów!
Nienazwana funkcja, która pobiera na wejściu uporządkowaną parę obrazów (o zgodnych wymiarach) i zwraca wyświetlany obraz.
ImageData
pobiera tylko dane pikseli bez wszystkich opakowań / metadanych; niestety zwraca liczby rzeczywiste, więcChop
jest potrzebne, aby traktować je jako liczby całkowite.BitXor
robi dokładnie to, co jest napisane na puszce (i wątki nad listami zagnieżdżonymi) iImage
zamienia otrzymany RGB z powrotem w obraz.Oryginalne zgłoszenie, które zawierało uporządkowaną parę adresów URL lub nazw plików:
źródło
ImageDifference[#,#2]&
Java,
336335328 bajtówNie golfowany:
źródło
String[] y
. Po prostu mały golf.public
z,public class M
aby zaoszczędzić 7 bajtów.png
nie powinno być koniecznePython,
646057 bajtówJestem nowym golfistą, więc zmiłuj się!
Dzięki @Blender i @FlipTack za uratowanie mnie 7 bajtów!
źródło
from cv2 import*
powinno ogolić 4 znaki.d=
:), robienie,r=imread
a następnie używanier
dwa razy może być krótszeOktawa,
433834 bajtówDzięki flawr zaoszczędziłem 5 bajtów.
Dzięki Luis Mendo zaoszczędziłem 4 bajty,
a~=b
zamiast których sugerowałem użyciexor(a,b)
.Funkcja, która przyjmuje jako nazwę pliku wejściowego dwóch obrazów wejściowych
a,b
i pokazuje wynik.Poprzednia odpowiedź, która zapisuje do pliku:
Funkcja, która przyjmuje jako nazwę pliku wejściowego dwóch obrazów wejściowych
a,b
i nazwę pliku obrazu wyjściowegoc
.Stosowanie:
Wynik zostanie zapisany w
out.png
źródło
imshow()
zamiastimwrite()
?imread(a)~=imread(b)
(lub+(imread(a)~=imread(b))
jeśli logiczne wprowadzanie danych nie jest dozwoloneimshow
) zamiastxor(...)
?JavaScript (ES6),
333320308299297 bajtów-
1220 bajtów zapisanych przez Ismaela Miguela- 2 bajty zapisane przez użytkownika 2428118
Oczekuje już załadowanych obrazów, przyjmuje rozmiar pierwszego wejścia jako rozmiar wyjściowy i zwraca element canvas.
Nie golfił
Ps: Pierwszy raz w golfa kodowego, więc prawdopodobnie można go bardziej pograć w golfa, a moja liczba może być błędna.
PPs: kontekst 2D kanwy ma
xor
[tryb komponowania ( https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation ), ale działa na wartości alfa ...Może być jeszcze bardziej golfowy (251 bajtów) ze stałym rozmiarem 300 * 150 pikseli (wszystkie pozostałe są czarne), jak w odpowiedzi Przetwarzanie
Pokaż fragment kodu
źródło
c
zc=i=>{with(document.createElement('canvas')){width=i.width,height=i.height;return getContext`2d`}}
i zaoszczędzić 16 bajtów.xor
umieścić czarnego prostokąta nadxor
dwoma obrazami, aby wrócić do 255 alfa?with
ale wydaje się całkiem dobry do gry w golfa ;-) Zapomniałem też, że szablon dosłownie zapisuje 2 bajty ...(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]}
Przetwarzanie,
124118117 bajtówStosowanie:
Nie golfił
źródło
MATL , 10 bajtów
Wyjaśnienie
Jest to w zasadzie ta sama odpowiedź, co istniejące rozwiązanie Octave : pobiera nazwy plików lub adresy URL obu obrazów jako dane wejściowe i wyświetla wynik na ekranie.
Stosowanie
źródło
Perl, 260 bajtów
251 bajtów kodu + 9 bajtów dla
-MImager
.Nie jestem pewien, czy Perl jest najlepszym językiem dla tego wyzwania, ale chciałem wiedzieć, jaki był obraz komentarza @ orlp. I to sprawia, że używam trochę tych modułów graficznych, to dobrze. I podobało mi się kodowanie!
Bardziej czytelna wersja:
Musisz zainstalować Imager, jeśli chcesz go wypróbować, ale jest to dość proste: po prostu uruchom
(echo y;echo) | perl -MCPAN -e 'install Imager'
terminal.źródło
LÖVE2D , 199 bajtów
To proste: pobiera dwa pliki obrazu z wiersza poleceń, wysyła plik o nazwie „Z” do katalogu Love. Działa również w przypadku obrazów pełnokolorowych!
źródło
J, 54 bajty
Bierze dwa argumenty, z których każdy jest ścieżką do obrazu wejściowego w
bmp
formacie. Każdy obraz jest odczytywany jako macierz 24-bitowych liczb całkowitych RGB i parsowany w triplet 8-bitowych wartości RGB, znak każdego z nich jest pobierany, a dwie macierze są razem XOR. Wynik jest następnie skalowany o 255, ponownie konwertowany z trypletu bazowej liczby 256 na liczbę całkowitą i zapisywany wbmp
pliku wyjściowym o nazwieo
.źródło
C, 189 bajtów
Działa na obrazach PBM. Wywołaj
f(a, b, out)
z nazwami obu plików wejściowych i pliku wyjściowego.Założenia:
Oba nagłówki obrazu wejściowego są identyczne (łącznie z białymi odstępami) i mają mniej niż
9 * sizeof(int)
znaki.Mamy dobry system operacyjny, który opróżnia i zamyka wyciekające pliki.
EOF == -1
Nie golfił i wyjaśnił: (pominięto ukośniki odwrotne)
C (gięcie specjalne), 149 bajtów
Nadal używa plików PBM, ale teraz:
Obraz musi mieć wysokość jednego piksela i szerokość 8 pikseli lub mniej, ponieważ PBM pakuje 8 pikseli w bajt.
Nagłówek musi mieć 7 bajtów (np
P4 8 1
spacją końcową).Oba pliki są wyszukiwane do przodu podczas wypełniania
t
ich nagłówkiem, a następnie ostatnie bajty są odczytywane, zapisywane lub zapisywane ponownie. Wykorzystujefread
ifwrite
mające podobne listy parametrów do czynnika wszystkie trzy operacje w nagłówku za samego makra.źródło
R, 45 bajtów
a
ib
reprezentują nazwy dwóch plików obrazów.Przykład:
Wydajność:
źródło
Przetwarzanie, 82 bajty
Nadużywa rozbudowanych funkcji rysowania, aby uniknąć faktycznego wykonywania XOR-ów. Łączy dwa obrazy z
DIFFERENCE
trybem i rysuje je na ekranie.Stosowanie
Nie golfił
źródło
32
zamiastDIFFERENCE
. To byłaby fajna wskazówka do gry w golfa: codegolf.stackexchange.com/questions/26809/… :)C #, 233 bajty
Dzięki Unknown6656 za wskazówkę, że argumenty wiersza poleceń nie są konieczne. Program odczytuje teraz z plików „a” i „b” i zapisuje do pliku „c” w tym samym formacie co „a”. Naprawiono również jeden błąd.
Ustawia każdy piksel na czarny, jeśli kolor jest taki sam, w przeciwnym razie biały.
Aby zapisać bajty, wychwytuje wyjątki poza granicami, zamiast sprawdzać właściwości Szerokość i Wysokość map bitowych. Za każdym razem, gdy x wykracza poza granice, jest resetowane do 0, a y jest zwiększane. Kiedy y wykracza poza granice, x wynosi 0, a pętla pęka, aby zapisać obraz i wyjść.
Przykład kompilacji przy użyciu csc i uruchomienia przy użyciu mono:
źródło
(string[] v)
w głównej deklaracji, ponieważ C # nie potrzebuje go jawnie do uruchomienia aplikacjiClojure, 300 bajtów
Rażące zdzierstwo odpowiedzi Java . Nie wiedziałem, jak wykonać to wyzwanie, ale byłem ciekawy, jak dobrze rozwiązanie Java przełożyło się na Clojure. To było całkiem proste. Niegolfowany kod jest właściwie całkiem ładny.
To było pierwsze wyzwanie, jakie podjąłem w golfa, które obejmowało import. Prawdopodobnie istnieje sposób na ich optymalizację w celu zaoszczędzenia niektórych bajtów.
Nie golfowany:
źródło
PHP,
246243 bajtyPrawdopodobnie mogę bardziej zagrać w golfa.
Uruchom go z wiersza poleceń w następujący sposób:
źródło
$i=imagecreatefrompng;$a=$i($argv[1])
jest o jeden bajt dłuższy niż$a=($i=imagecreatefrompng)($argv[1])
. I możesz wypróbować obrazy paletowe z paletą dwóch kolorów.($f=func)(params)
wymaga PHP 7.for(;$k<$w*$h;)
zfor(;$y<$h;$y+=1/$w)
,$x=$k%$w, $y=$k++/$w
z$x, $y
, a ostatni$x
z$x++
. (zakładając, że nie ma błędów zaokrąglania dla rozsądnych rozmiarów obrazu)Node.js,
156135 bajtówPliki obrazów wejściowych i wyjściowych powinny mieć format PBM (P1), w którym znajduje się pierwsza linia
P1 [width] [height]
, a druga linia to czarno-białe wartości ascii bez spacji.Oto obrazy wejściowe, a następnie wyjście xor (32 x 32 piksele):
źródło