Bir görüntüdeki her renge “bir tane ekle”


23

Bu görüntüyü basitçe çeker ve her rengin onaltılı haneye birer tane eklemesini sağlarsınız. Örneğin, #49de5folur #5aef60(bir 9döngü için bir ave bir fdöngü için 0).

Renk # 49de5fRenk # 5aef60

Bu aynı zamanda tüm beyazların ( #ffffff) siyah olacağı anlamına gelecektir ( #000000) çünkü hepsi fgeri dönüyor 0, ama tüm siyahlar daha açık bir siyah tonu ( #111111) olacak.

Renk # 000000Renk # 111111

Puanlama, kullanımıyla ilgili bir soru olduğu için kullanılan en az bayt sayısına dayanır .

Aşağıdaki görüntüyü kodunuz için giriş görüntüsü olarak kullanın ve kodunuzun çıkış görüntüsünü yanıtınıza yerleştirin.

Giriş görüntü

İsterseniz, bu diğer gökkuşağı görüntüsünü de kullanabilirsiniz:

Başka bir isteğe bağlı giriş resmi


Donanım / FPGA tasarımı için tasarlanmış bir programlama dili kullanmak istiyorsak giriş / çıkış formatında ne gibi varsayımlar yapabiliriz?
Monica'yı eski durumuna getirin - 15

@hexafraction Varsayılan olarak bir dosya ya da onaltılık kod iirc olarak alabileceğinizi düşünüyorum.
Rɪᴋᴇʀ


5
@Peanut, efbaytları içeren bir test senaryosuna sahip olmak iyi olurdu ( sadece 17'yi eklediğinde ve mod 256 aldığında ne olması gerektiği f0gibi 00).
Martin Ender

2
Sadece örnek girişi sağlamak yerine örnek çıktı için bir görüntü göndermelisiniz. Bunun dışında, bu çok güzel bir ilk yazı! Siteye Hoşgeldiniz!
DJMcMayhem

Yanıtlar:


5

Pyke, 17 13 bayt

.Fh16j%ijcjs 8{

Burada dene!

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

Girdiyi, bir tamsayı piksel dizisi olarak alır ve aynı formatta çıktı alır.

RAINBOWZ (Tek boynuzlu at yok :()


Çıktı görüntüsünü sağlayabilir misiniz?
haykam

7

Mathematica, 78 bayt

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

Bir görüntü nesnesini alır ve döndürür (bir görüntü nesnesi oluşturmak için görüntüyü Mathematica'ya yapıştırmanız yeterlidir).

Test durumu için sonuç:

görüntü tanımını buraya girin

Girdi almak ve çıktıyı 3B tamsayı kanalı değerleri dizisi olarak almak, bu 51 bayta düşer :

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

Ancak bu meta gönderilerin henüz çok büyük bir desteği yok, bu yüzden şu an için 78-byte sürümü ile gidiyorum.


4

Verilog, 220 bayt:

  • Programlar, boyutları olan bir RGB piksel değerleri dizisi olarak girdi alabilir
  • Programlar, boyutları olan bir RGB piksel değerleri dizisi aracılığıyla çıktı verebilir

Şu anda boyutların nasıl sağlanacağı ve dizinin aynı anda nasıl yayınlanacağı veya sağlanacağı konusunda net değil. Bir saat sinyali (tüm görüntünün işlenmesinden sonra azalan geçerli bir veri bayrağıyla) kullanarak bir seferde 8 bit yayınlayacağım ve boyutları 32-bit tamsayılar olarak girip / çıktısını alacağım:

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 bayt

Şimdi geçerli!

Pillow kütüphanesini kullanın.

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

Çıktı:Çıktı

9 bayt tasarrufu için @TuukkaX'a teşekkürler!
18 byte tasarruf için @ mbomb007 teşekkürler!


0xFFBunun yerine kullanmak gerekli 255mi?
Yytsi

@TuukkaX Woops fark
etmedim

İçeride bir tane daha 0xFFvar: D
Yytsi

Bence daha fazla bayt kurtarabilirsin from PIL import*. Ayrıca bundan Image.openhemen opensonra değiştirilebileceğini düşünüyorum .
Yytsi,

@TuukkaX Evet, değiştirilebilir from PIL import*, ancak değiştiremiyorumImage.open
TuxCrafting

1

Dyalog APL , 21 15 bayt

Programlar, RGB piksel değerlerinin matrisi olarak çıktı verebilir

Çıktının aynı formatta olabileceğini varsayıyorum.

Yeni çözüm [[ r , g , b , r , g , b ], [ r , g , b ,… değerlerinin matrisini alır .

16⊥16|1+16 16⊤⎕

açıklama

sayısal giriş elde
16 16⊤2 basamaklı tabana 16
1+ekleme 1, yani, 0 → 1, 1 → 2, 15 → 16
16|modül 16, yani 16 → 0
16⊥, taban 16’dan dönüştürme

Örnek

      ⊢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

Eski 21 baytlık çözüm [["RRGGBB", "RRGGBB"], ["RRGGBB",…

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

⎕IO←0Birçok sistemde varsayılan olan ihtiyaçlar .

açıklama

{... Her RGB 6-Char dizesi, olarak temsil : ve yapılacak
n←⎕D,⎕Aatama "0 ... 9A ... Z" için n
⍵⍳⍨ bireysel karakterlerin indisler n
1+ , dizine bir tane ekleyin yani 0 → 1, 1 → 2, 15 → 16
16|modülü 16, yani 16 → 0
n[]bunu n'ye indekslemek için kullanın

Örnek

      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 bayt

İşte kod ( Martin Ender'in test durumu için destekle (60b olmadan)):

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

Ve işte daha az karışık versiyon:

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

Derle ve çalıştır gcc -o color colorgolf.c && cat a.bmp | ./color > b.bmp

Bu kod bitmaplerle çalışmayı destekler . pngDosyaları dönüştürmek için bmpaşağıdaki komutu kullandım:convert -flatten -alpha off png.png a.bmp

Kod, bu bmpbaşlığın 54 bayt uzunluğunda olduğunu varsayar - bu durumda işe yarar, ancak dikkatlice bir şeyleri kırmadığımdan emin değilim.

Ayrıca, bu gökkuşağı:
Şimdi üzgün görünüyor ... :(


1

Java 142 bayt

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

golfed:

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

Öncelikle PPCG'ye hoş geldiniz! Kod kodlu kodunuz ihem parametresini hem de for döngüsünü kullanır, bu yüzden parametreyi başka bir şeyle değiştiririm a. Ayrıca, int önünü söküp biraz daha golf oynayabilir jve içine ekleyebilirsiniz int i. Yani bu gibi: 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;}. Ayrıca, bu yazıya bir göz atın: Java'da golf oynamak için ipuçları . :)
Kevin Cruijssen

Renkleri doğru ayarlamıyorsun. RGB değerlerine 0x111111 ekleyerek, onaltılık bir yerden diğerine taşma olasılığınız vardır. Örneğin, # 49de5f'in # 5aef70 değil, # 5aef60 olması gerekiyordu.
kamoroso94

0

R, 302 bayt

Mükemmel olmaktan uzak, ama işte gidiyor:

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

Açıklama:

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

      }
   }
}

güzel bir gökkuşağı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.