Kamuflaj Rengi Değişen Bukalemun Mücadelesi


19

Bukalemun zorlukları kötü bir şey . Çok kötü, bukalemunlar güzel yaratıklar. Değişim zamanı!

Bir bukalemun resmi

Hepimizin bildiği gibi, birçok bukalemun, cildinin rengini değiştirerek çevreleriyle uyum sağlama konusunda dikkate değer bir yeteneğe sahiptir. Bu da bu mücadelenin amacıdır.

Meydan okuma

Dokuz pikselden oluşan bir kare düşünün. Sekiz piksel çevredir. Merkezde bukalemun var.

Bunun gibi: Orta meydanın etrafında sekiz gri kareler.

Bukalemun doğal olarak çevresiyle uyum sağlamaya çalışır. Bunu, rengini çevresindeki piksellerin ortalamasına değiştirerek yapar. Yani, bu durumda, bukalemun rengini değiştirirdi gri.

Amaç

Çevreleyen piksellerin renkleri göz önüne alındığında, bukalemun rengini çıktılayın.

Bukalemun rengi ÷ 8 pikselindeki tüm kırmızı, yeşil ve mavi renklerin toplamı olarak tanımlanır.

Giriş

Sol üst köşeden başlayıp saat yönünde devam eden, çevreleyen sekiz piksel için bir renk değerleri dizisi şöyle:

[[<red>,<green>,<blue>],[<red>,<green>,<blue>],[<red>,<green>,<blue>],[<red>,<green>,<blue>],[<red>,<green>,<blue>],[<red>,<green>,<blue>],[<red>,<green>,<blue>],[<red>,<green>,<blue>]]

0-255 ondalık sayının üç katından oluştuğu sürece girişi farklı bir biçimde almayı seçebilirsiniz.

Farklı bir biçimde girdi alırsanız, sayılar ya tutarlı bir uzunlukta olmalı ya da aralarında sayısal olmayan bir ayırıcı olmalıdır. Üçlü, 0 basamağa 9 rakama kadar doldurulmadıkça ayırıcı bir karaktere sahip olmalıdır. (Örn 044200255044200255044200255044200255044200255044200255044200255044200255geçerlidir, bu nedenle vardır 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255ve 44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255fakat 4420025544200255442002554420025544200255442002554420025544200255değildir.)

Çıktı

Orta pikselin (ondalık olarak) renklerini içeren bir dizi / dize / vb. Şöyle:

[<red>,<green>,<blue>]

Bir diziden başka bir şey çıkarmanız durumunda: Sayılar tutarlı bir uzunlukta olmalı veya aralarında sayısal olmayan bir ayırıcı olmalıdır. (Örn 044200255, geçerlidir 44 200 255, ancak geçerlidir 44200255.)

Sayılar ondalık basamak içeremez, bu nedenle 44.0 200 255.0geçersiz.

yuvarlatma

Çıktı en yakın tam sayıya yuvarlanmalıdır. (Yarısı yuvarlanmalıdır.) Örneğin, tüm kırmızıların toplamı 1620 ise , çıktı almalısınız 203, 202ya da değil 202.5.

Örnekler

Resimler yalnızca açıklama amaçlıdır. Orta piksel çıktı, çevredeki pikseller girdi.

Giriş:

[[200,200,200],[200,200,200],[200,200,200],[200,200,200],[200,200,200],[200,200,200],[200,200,200],[200,200,200]]

Çıktı:

[200,200,200]


Giriş:

[[0,0,0],[255,255,255],[0,0,0],[255,255,255],[255,255,255],[0,0,0],[255,255,255],[0,0,0]]

Çıktı:

[128,128,128]


Giriş:

[[0,200,200],[200,0,200],[200,200,0],[60,200,0],[200,0,200],[0,200,220],[2,200,0],[0,0,0]]

Çıktı:

[83,125,103]


Giriş:

[[0,56,58],[65,0,200],[33,200,0],[60,33,0],[98,0,200],[0,28,220],[2,200,0],[99,0,5]]

Çıktı:

[45,65,85]

Gönderimler tam bir program veya bir işlev olabilir. Standart I / O ve boşluk deliği kuralları geçerlidir.



@LeakyNun Bağlantı için teşekkürler. Bu meydan okuma için gerçekten önemli olmayacak, ancak gelecekte benzer bir şey yapmam gerektiğini aklımda tutacağım.
user2428118

9
Tuhaf bir şekilde, sanırım bu yuvarlamayı ele almak için biraz bukalemun sorusu.
xnor

"0-255 ondalık sayının üç katından oluştuğu sürece" İkili olabilir mi? Tekli?
Leaky Nun

Ayrıca, daha önce de aktarabilir miyim?
Leaky Nun

Yanıtlar:


8

MATL, 8 4 bayt

YmYo

Çevrimiçi deneyin!

Beher sayesinde 4 bayt kaydedildi!

Açıklama:

Ym          "Get the average of each column
  Yo        "And round up

Python dizi sözdiziminin kötüye kullanımını seviyorum! Sen yerini alabilir s8/ile Xm(yani meansütunlar aşağı). Ayrıca, 3 x 8ile başlamak için giriş belirtebilirsiniz ve kurtulmak3e!
Suever

Evet, YmYoyapmalıyım ... [[R,G,B];[R,G,B];...]RGB satırları arasındaki noktalı virgüllerde olduğu gibi girişi almanız yeterlidir.
beher

@beaker Woah! Teşekkürler!
DJMcMayhem

does Yobağları yuvarlanır edilir en yakın olan yuvarlak yukarı veya yuvarlak? Zorluk ikincisini istiyor.
John Dvorak

@JanDvorak En yakın tamsayıya (yukarı veya aşağı) yuvarlar matl.tryitonline.net/…
Suever

11

Python, 38 bayt

lambda l:[sum(r)+4>>3for r in zip(*l)]

Toplama 4 ekleyerek, ardından bit kaydırma yoluyla 8'e kadar bölme yaparak ortalamayı (en yakın tamsayıya doğru, yarımları yuvarlayarak) yuvarlar >>3.



4

Cı, 151 123 103 91

RGBRGB ... sırasıyla, programa 24 parametre aktarılmasını gerektirir ve üçlü RGB'yi yeni satır olmadan çıkarır.

i,t;main(c,v)char**v;{for(i=0;t=4,i++<3;printf("%d ",t/8))for(c=i;c<24;c+=3)t+=atoi(v[c]);}

main(c,v)char**v;{2 bayt kaydetmek için? Ayrıca kaynak kodunda <3 için +1!
betseg



1

J, 11 bayt

0.5<.@++/%#

Girişi her satırın bir RGB değeri olduğu 8x3 dizisi olarak alır

açıklama

0.5<.@++/%#  Input: a
          #  Count the number of rows
       +/    Sum along the columns
         %   Divide each sum by the count to get the averages
0.5   +      Add 0.5 to each average
   <.@       Floor each value and return

1

JavaScript, 75 64 55 bayt

a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>x+4>>3)

Başlamanız için bir JavaScript yanıtı.

Düzenleme: Dendrobium sayesinde 11 bayt ve Neil sayesinde 9 bayt tasarruf etti .


55 bayt:a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>x+7>>3)
Dendrobium

@Dendrobium [[0,200,200],[200,0,200],[200,200,0],[60,200,0],[200,0,200],[0,200,220],[2,200,0],[0,0,7]]verir , 83, 125 * 104 * yerine 83, 125, * 103 * senin koduyla.
user2428118

Ah, soruyu yanlış okudum, olması gerektiğini düşündü ceil. 64 bayt:a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>(x/8).toFixed())
Dendrobium

x+4>>3düzgün yuvarlanmalıdır.
Neil

1

Lisp - 180 179 bayt

EDIT: Daha fazla golf için biçimlendirilmiş.

(defun a(l)(/(apply #'+ l)(length l)))(defun r(a)(if(integerp(* a 2))(ceiling a)(round a)))(defun c(s)(mapcar(lambda(i)(r(sqrt(a(mapcar(lambda(x)(expt(nth i x)2))s)))))'(0 1 2)))

Sanırım doğru şekilde yapıyor mu? Test edilmemiş.

  • a sadece ortalama
  • rLisp rounden yakın tam sayıya yuvarlandığından, bu meydan okuma doğru yuvarlamadır
  • cgerçek işi yapar, formatta girdi alır ve cevabı içeren '((R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B))bir '(R G B)liste döndürür.

1

Nim , 134 126 115 108 78 bayt

import math,future
x=>lc[(lc[x[j][i]|(j<-0..7),int].sum+4)shr 3|(i<-0..2),int]

Çift iç içe dizi olarak iletilen ve 3 öğeli dizi olarak çıktılar gerektiren anonim bir yordam tanımlar. Prosedür sadece başka bir prosedüre argüman olarak kullanılabilir; test etmek için aşağıdaki sarmalayıcıyı kullanın:

import math,future
import strutils
proc test(x: seq[seq[int]] -> seq[int]) =
 echo x(#[ Insert your input here ]#)
test(x=>lc[(lc[x[j][i]|(j<-0..7),int].sum+4)shr 3|(i<-0..2),int])

Bir Nim dizisi, @öndeki gibi bir dizidir @[1, 2, 3]. Bu nedenle, bu prosedüre bir girdi olabilir:

@[@[0,0,0],@[255,255,255],@[0,0,0],@[255,255,255],@[255,255,255],@[0,0,0],@[255,255,255],@[0,0,0]]


1

İleri (gforth) , 65 bayt

: f 3. do 8. do 3 j - i * 2 + roll loop 4 8. do + loop 8 / loop ;

Çevrimiçi deneyin!

Girişi yığın argümanları olarak alır (rgb sırası)

açıklama

3 renk kanalının her biri için:

  • o kanalın tüm numaralarını yığının en üstüne taşı
  • onları birlikte ekle
  • 4 ekle (yuvarlamayı işlemek için)
  • 8'e böl

Kod Açıklaması

: f            \ start new word definition
  3. do        \ start a counted loop from 0 to 2
    8. do      \ start a counted loop from 0 to 7
      3 j -    \ get the offset of the channel
      i * 2 +  \ get the absolute position of the channel value
      roll     \ move the value to the top of the stack
    loop       \ end the inner loop
    4          \ add 4 to the top of the stack
    8. do      \ loop from 0 to 7
      +        \ add the top two stack numbers
    loop       \ end loop. (Result on top of stack with be sum of values for channel + 4)
    8 /        \ divide by 8
  loop         \ end outer loop
;              \ end word definition

1

Runik Efsunlar , 41 bayt

>iRi+ i+ i+ i+ i+ i+ i+8,'rA' q$;
>iU
>iU

Çevrimiçi deneyin!

Girişi doğru sırada (giriş değerleri her zaman sırada olduğu için RGB, RGB,...) ve üç IP'nin her biri birleşmediği ve bir sonraki okuma igiriş komutuna çok erken ilerlemediği sürece 3 komut işaretçisi kullanır (dolayısıyla tüm boşluklar), toplamları hesaplamak için doğru değeri en üstte tutmak için yığını sürekli olarak döndürmek zorunda kalmadan baytları kaydeder .

Teknik olarak bu kod, x.5bazı girişler için değerleri doğru yuvarlamada bir hata içerir , ancak bunun nedeni C # tarafından kullanılan , yukarıdan ziyade en yakın olay numarasına yuvarlanan ve kayan nokta doğruluk kaybındaki sorunlardan kaynaklandığı varsayılan yuvarlama yöntemidir. ve bu yanıtı yazmadan ve test senaryolarını kontrol etmeden önce bu sorunun farkında değildim. Bu, işlenmemiş istisna gibi birkaç şeyle birlikte gelecekteki bir yapıda düzeltilecektir .

Bu arada, bu değişiklik gerekli ayarlamaları yapar.

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.