“Tambah satu” ke setiap warna dalam suatu gambar


23

Anda cukup mengambil gambar ini dan membuat setiap warna menambahkan satu ke setiap digit heksadesimal. Sebagai contoh, #49de5fakan menjadi #5aef60(dengan 9perulangan ke a, dan fperulangan ke 0.)

Warna # 49de5fWarna # 5aef60

Ini juga berarti bahwa semua putih ( #ffffff) akan menjadi hitam ( #000000) karena semua floop kembali ke 0, tetapi semua hitam akan menjadi warna yang lebih terang dari hitam ( #111111).

Warna # 000000Warna # 111111

Penilaian didasarkan pada jumlah byte yang paling sedikit digunakan, karena ini adalah pertanyaan .

Gunakan gambar di bawah ini sebagai gambar input untuk kode Anda, dan masukkan gambar output kode Anda ke dalam jawaban Anda.

Masukkan gambar

Jika Anda mau, Anda juga dapat menggunakan gambar pelangi lainnya ini:

Gambar input opsional lain


Asumsi apa yang dapat kita buat pada format input / output, jika kita ingin menggunakan bahasa pemrograman yang dirancang untuk desain hardware / FPGA?
Pasang kembali Monica - ζ--

@hexafraction Saya pikir secara default Anda dapat mengambil sebagai file atau sebagai kode hex iirc.
Rɪᴋᴇʀ


5
@Peanut, akan lebih baik untuk memiliki test case yang menyertakan efbyte (yang seharusnya menjadi f0berlawanan dengan 00yang terjadi ketika Anda baru saja menambahkan 17 dan mengambil mod 256).
Martin Ender

2
Anda harus memposting gambar untuk output sampel, bukan hanya memberikan input sampel. Selain itu, ini adalah posting pertama yang sangat bagus! Selamat datang di situs ini!
DJMcMayhem

Jawaban:


5

Pyke, 17 13 byte

.Fh16j%ijcjs 8{

Coba di sini!

.F            - for i in deep_for(input):
  h16%        -    (i+1)%16
          +   -   ^+V
      i16+    -    (i+16)
           8{ -  unset_bit(8, ^)

Mengambil input sebagai array integer 3d piksel dan output dalam format yang sama

RAINBOWZ (Tidak ada unicorn :()


Bisakah Anda memberikan gambar output?
haykam

7

Mathematica, 78 byte

Image@Apply[16#+#2&,Mod[IntegerDigits[#~ImageData~"Byte",16,2]+1,16]/255,{3}]&

Mengambil dan mengembalikan objek gambar (untuk membuat objek gambar, cukup tempel gambar ke dalam Mathematica).

Hasil untuk test case:

masukkan deskripsi gambar di sini

Mengambil input dan mengembalikan output sebagai array 3D dari nilai saluran integer, ini berkurang menjadi 51 byte :

Apply[16#+#2&,Mod[IntegerDigits[#,16,2]+1,16],{3}]&

Tetapi postingan meta itu belum memiliki jumlah dukungan yang besar, jadi saya akan menggunakan versi 78-byte untuk saat ini.


4

Verilog, 220 byte:

  • Program dapat mengambil input sebagai array nilai piksel RGB dengan dimensi
  • Program dapat menampilkan melalui array nilai piksel RGB dengan dimensi

Saat ini tidak jelas bagaimana dimensi harus disediakan dan apakah array akan di-stream atau disediakan sekaligus. Saya akan mengalirkannya 8 bit pada satu waktu menggunakan sinyal jam (dengan flag data-valid yang menjadi rendah setelah seluruh gambar diproses) dan input / output dimensi sebagai bilangan bulat 32-bit:

module a(input[31:0]w,input[31:0]h,input[7:0]d,input c,output[31:0]W,output[31:0]H,output reg[7:0]D,output reg v=0);assign W=w;assign H=h;reg[65:0]p=1;always@(posedge c) begin v<=(p<3*w*h); p<=p+v; D<=d+17; end endmodule

4

Python, 226 byte

Sekarang sah!

Gunakan perpustakaan Bantal.

from PIL import Image
m=Image.open(input()).convert("RGB")
for y in range(m.size[1]):
 for x in range(m.size[0]):
    t=m.getpixel((x,y))
    h=t[0]+(t[1]<<8)+(t[2]<<16)+1118481
    m.putpixel((x,y),(h&255,h>>8&255,h>>16&255))
m.show()

Keluaran:Keluaran

Terima kasih kepada @TuukkaX karena telah menghemat 9 byte!
Terima kasih kepada @ mbomb007 untuk menghemat 18 byte!


Apakah perlu menggunakan 0xFFbukan 255?
Yytsi

@ TuukkaX Woops, saya belum menyadarinya, terima kasih
TuxCrafting

Ada satu lagi 0xFFdi sana: D
Yytsi

Saya pikir Anda dapat menyimpan lebih banyak byte dengan mengatakan from PIL import*. Saya juga berpikir itu Image.openbisa diubah menjadi opensetelah itu.
Yytsi

@ TuukkaX Ya, itu bisa diubah menjadi from PIL import*, tetapi saya tidak bisa mengubahImage.open
TuxCrafting

1

Dyalog APL , 21 15 byte

Program dapat menampilkan sebagai matriks nilai piksel RGB

Saya menganggap output mungkin dalam format yang sama.

Solusi baru mengambil matriks nilai [[ r , g , b , r , g , b ], [ r , g , b , ...

16⊥16|1+16 16⊤⎕

Penjelasan

dapatkan
16 16⊤konversi input numerik ke basis 2-digit 16
1+tambahkan 1, yaitu 0 → 1, 1 → 2, 15 → 16
16|modulus 16, yaitu 16 → 0
16⊥konversi dari basis 16

Contoh

      ⊢m←2 6⍴90 239 96 255 255 255 0 0 0 239 239 239
90 239 96 255 255 255
 0   0  0 239 239 239
      16⊥16|1+⎕⊤⍨2/16
⎕:
      m
107 240 113   0   0   0
 17  17  17 240 240 240

Solusi 21 byte lama menggunakan matriks [["RRGGBB", "RRGGBB"], ["RRGGBB", ...

{n[16|1+⍵⍳⍨n←⎕D,⎕A]}¨

Kebutuhan ⎕IO←0, yang merupakan standar pada banyak sistem.

Penjelasan

{Untuk setiap string RGB 6-char, nyatakan sebagai dan lakukan:
n←⎕D,⎕Atetapkan "0 ... 9A ... Z" untuk n
⍵⍳⍨ menemukan indeks masing-masing karakter dalam n
1+ tambahkan satu ke indeks, yaitu 0 → 1, 1 → 2, 15 → 16
16|modulus 16, yaitu 16 → 0
n[]gunakan itu untuk mengindeks ke n

Contoh

      f←{n[16|1+⍵⍳⍨n←⎕D,⎕A]}¨ 
      ⊢p←2 2⍴'5AEF60' 'FFFFFF' '000000' 'EFEFEF'
┌──────┬──────┐
│5AEF60│FFFFFF│
├──────┼──────┤
│000000│EFEFEF│
└──────┴──────┘
      f p           
┌──────┬──────┐
│6BF071│000000│
├──────┼──────┤
│111111│F0F0F0│
└──────┴──────┘

1

C - 114 113 70 66 61 72 67 byte

Berikut kodenya (dengan dukungan untuk test case Martin Ender (tanpa 60b)):

main(c,b){for(;~(b=getchar());putchar(c++<54?b:b+16&240|b+1&15));}

Dan di sini adalah versi yang kurang dikaburkan:

main( c, b ) //Defaults to int
{
    //Get characters until EOF occurs
    //Copy first 54 bytes of header, later add 1 to each hexadecimal digit
    for ( ; ~( b = getchar( ) ); putchar( c++ < 54 ? b: b + 16 & 240 | b + 1 & 15 ) ); 
}

Kompilasi dan jalankan bersama gcc -o color colorgolf.c && cat a.bmp | ./color > b.bmp

Mendukung kode ini bekerja dengan bitmap . Untuk mengonversi pngfile menjadi bmp, saya menggunakan perintah berikut:convert -flatten -alpha off png.png a.bmp

Kode mengasumsikan, panjang bmpheader itu 54 byte - dalam hal ini berfungsi, tapi saya tidak yakin apakah saya tidak diam-diam memecahkan sesuatu.

Juga, ini pelangi:
Terlihat sedih sekarang ... :(


1

Java 142 byte

public BufferedImage translateColor(BufferedImage image){
  for(int i=-1;++i<image.getWidth();)
    for(int j=-1;++<image.getHeight();)
      image.setRGB(i,j,image.getRGB(i,j)+1118481);
  return image;
}

Golf:

BufferedImage t(BufferedImage i){for(int x=-1;++x<i.getWidth();)for(int y=-1;++y<i.getHeight();)i.setRGB(x,y,i.getRGB(x,y)+1118481);return i;}

Pertama-tama, selamat datang di PPCG! Kode golf-code Anda menggunakan iparameter sebagai dan di-untuk-loop, jadi saya akan mengubah parameter ke sesuatu yang lain seperti a. Juga, Anda dapat golf lagi dengan menghapus int di depan jdan menambahkannya ke int i. Jadi seperti ini: BufferedImage t(BufferedImage a){for(int i=-1,j;++i<a.getWidth();)for(j=-1;++j<a.getHeight();)a.setRGB(i,j,a.getRGB(i,j)+1118481);return a;}. Juga, lihat posting ini: Tips untuk bermain golf di Jawa . :)
Kevin Cruijssen

Anda tidak mengatur warna dengan benar. Dengan menambahkan 0x111111 ke nilai RGB, Anda memiliki kemungkinan overflow dari satu tempat heksadesimal ke yang berikutnya. Misalnya, # 49de5f seharusnya menjadi # 5aef60, bukan # 5aef70.
kamoroso94

0

R, 302 byte

Jauh dari sempurna, tetapi begini:

a<-as.raster(imager::load.image(file.choose()));l=letters;n=as.numeric;d=a;f=function(x){if(suppressWarnings(is.na(n(x)))){if(x=="F")"0" else{l[match(x,toupper(l))+1]}}else{if(x==9)"A" else as.character(n(x)+1)}};for(o in 1:90){for(g in 1:200){for(h in 2:7){substr(d[o,g],h,h)<-f(substr(a[o,g],h,h))}}}

Penjelasan:

a<-as.raster(imager::load.image(file.choose()));  //chooses file
l=letters;n=as.numeric;d=a;                      //shortens some names and creates
                                                   duplicate variable to modify

f=function(x){                                //creates a function that takes in a
   if(suppressWarnings(is.na(n(x)))){            character type and checks whether it is
      if(x=="F")"0"                              a number or letter.
      else{l[match(x,toupper(l))+1]}}            Returns the converted letter or number.                               
   else{                                   
      if(x==9)"A"                         
      else as.character(n(x)+1)}         
};                                      

for(o in 1:90){                       //loops through every single hex digit and applies
   for(g in 1:200){                     the converting function, modifying the duplicate
      for(h in 2:7){                    variable. Now you have 2 images =D

         substr(d[o,g],h,h)<-f(substr(a[o,g],h,h))

      }
   }
}

pelangi yang indah

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.