Thử thách thay đổi màu ngụy trang Chameleon


19

Rõ ràng thách thức Chameleon là một điều xấu . Quá tệ, tắc kè hoa là những sinh vật xinh đẹp. Tới lúc để thay đổi!

Hình ảnh một con tắc kè hoa

Như chúng ta đã biết, nhiều con tắc kè hoa sở hữu một khả năng đáng chú ý để hòa trộn với môi trường xung quanh bằng cách thay đổi màu da. Đó cũng là mục tiêu của thách thức này.

Thử thách

Hãy tưởng tượng một hình vuông gồm chín pixel. Tám pixel là môi trường xung quanh. Ở trung tâm là con tắc kè hoa.

Như thế này: Tám hình vuông màu xám xung quanh một hình vuông trung tâm.

Con tắc kè hoa tự nhiên cố gắng hòa nhập với môi trường xung quanh. Nó làm như vậy bằng cách thay đổi màu của nó thành trung bình của các pixel xung quanh. Vì vậy, trong trường hợp này, tắc kè hoa sẽ thay đổi màu sắc của nó thành màu xám.

Mục tiêu

Cho màu của các pixel xung quanh, xuất màu của con tắc kè hoa.

Màu sắc của tắc kè hoa được định nghĩa là tổng của tất cả các màu đỏ, lục và lam trong các pixel ÷ 8.

Đầu vào

Một mảng các giá trị màu cho tám pixel xung quanh, bắt đầu ở phía trên bên trái và tiếp tục theo chiều kim đồng hồ, như sau:

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

Bạn có thể chọn nhận đầu vào ở dạng khác, miễn là nó bao gồm tám bộ ba số thập phân 0-255.

Nếu bạn nhận được đầu vào ở dạng khác, các số phải có độ dài nhất quán hoặc có một dấu phân cách không phải là số giữa chúng. Bộ ba phải có một ký tự phân tách trừ khi chúng được đệm 0 đến 9 chữ số. (Ví dụ: 044200255044200255044200255044200255044200255044200255044200255044200255hợp lệ, 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255và cũng vậy 44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255, nhưng 4420025544200255442002554420025544200255442002554420025544200255không phải.)

Đầu ra

Một mảng / chuỗi / v.v có chứa màu của pixel trung tâm (ở dạng thập phân), như sau:

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

Trong trường hợp bạn xuất ra một cái gì đó không phải là một mảng: Các số phải có độ dài nhất quán hoặc có một dấu phân cách không phải là số giữa chúng. (Ví dụ: 044200255hợp lệ, cũng vậy 44 200 255, nhưng 44200255không phải.)

Các số có thể không chứa dấu thập phân, ví dụ: 44.0 200 255.0không hợp lệ.

Làm tròn

Đầu ra phải được làm tròn đến số nguyên gần nhất. (Một nửa phải được làm tròn lên.) Ví dụ: nếu tổng của tất cả các màu đỏ là 1620 , bạn phải xuất 203, không 202hoặc 202.5.

Ví dụ

Hình ảnh chỉ mang tính chất minh họa. Pixel giữa là đầu ra, các pixel xung quanh là đầu vào.

Đầu vào:

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

Đầu ra:

[200,200,200]


Đầu vào:

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

Đầu ra:

[128,128,128]


Đầu vào:

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

Đầu ra:

[83,125,103]


Đầu vào:

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

Đầu ra:

[45,65,85]

Đệ trình có thể là một chương trình đầy đủ hoặc một chức năng. Áp dụng quy tắc I / Okẽ hở tiêu chuẩn .



@LeakyNun Cảm ơn đã liên kết. Nó sẽ không thực sự quan trọng đối với thử thách này, nhưng tôi sẽ ghi nhớ nếu tôi làm điều gì đó tương tự trong tương lai.
dùng2428118

9
Thật thú vị, tôi nghĩ rằng đây là một câu hỏi về con tắc kè hoa để xử lý làm tròn số.
xnor

"Miễn là nó bao gồm tám bộ ba số thập phân 0-255" Nó có thể ở dạng nhị phân không? Đơn phương?
Rò rỉ Nun

Ngoài ra, tôi có thể chuyển đổi nó trước?
Rò rỉ Nun

Câu trả lời:


8

MATL, 8 4 byte

YmYo

Hãy thử trực tuyến!

4 byte được lưu nhờ vào cốc thủy tinh!

Giải trình:

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

Tôi thích việc lạm dụng cú pháp mảng python! Bạn có thể thay thế s8/bằng Xm(tức là meanxuống các cột). Ngoài ra, bạn có thể chỉ định đầu vào là 3 x 8bắt đầu và thoát khỏi3e!
Suever

Vâng, YmYonên làm điều đó ... chỉ cần lấy đầu vào như [[R,G,B];[R,G,B];...]với dấu chấm phẩy giữa các hàng RGB.
cốc

@beaker Woah! Cảm ơn!
DJMcMayhem

làm Yotròn lên, hoặc làm tròn đến gần nhất với các mối quan hệ được làm tròn? Thử thách muốn cái sau.
John Dvorak

@JanDvorak Nó làm tròn đến số nguyên gần nhất (lên hoặc xuống) matl.tryitonline.net/iêu
Suever

11

Python, 38 byte

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

Làm tròn số trung bình (về phía số nguyên gần nhất, với một nửa làm tròn lên) bằng cách thêm 4 vào tổng, sau đó chia sàn cho 8 thông qua dịch chuyển bit >>3.



4

C, 151 123 103 91

Yêu cầu 24 tham số được truyền cho chương trình, theo thứ tự RGBRGB ... và xuất ra bộ ba RGB mà không có dòng mới.

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;{để tiết kiệm 2 byte? Cũng +1 cho <3 trong mã nguồn!
betseg



1

J, 11 byte

0.5<.@++/%#

Lấy đầu vào là một mảng 8x3 trong đó mỗi hàng là một giá trị RGB

Giải trình

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 byte

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

Một câu trả lời JavaScript để giúp bạn bắt đầu.

Chỉnh sửa: Đã lưu 11 byte nhờ Dendrobium và 9 byte khác nhờ Neil .


55 byte: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]]mang lại 83, 125, * 104 * thay vì 83, 125, * 103 * với mã của bạn.
dùng2428118

Ah, đọc sai câu hỏi, nghĩ rằng nó đáng lẽ phải thế ceil. 64 byte:a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>(x/8).toFixed())
Dendrobium

x+4>>3nên làm tròn chính xác.
Neil

1

Lisp - 180 179 byte

EDIT: Được định dạng để chơi gôn.

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

Liệu nó có đúng cách không , tôi đoán vậy. Chưa được kiểm tra.

  • a chỉ là trung bình
  • rLà cách làm tròn thích hợp của thử thách này, vì Lisp làm roundtròn đến số nguyên chẵn gần nhất
  • cthực hiện công việc thực tế, nhận đầu vào ở định dạng '((R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B))và trả về một '(R G B)danh sách chống lại câu trả lời.

1

Nim , 134 126 115 108 78 byte

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

Xác định một thủ tục ẩn danh, yêu cầu đầu vào được truyền vào dưới dạng một chuỗi kép và xuất ra dưới dạng một mảng 3 phần tử. Thủ tục chỉ có thể được sử dụng làm đối số cho thủ tục khác; để kiểm tra, sử dụng trình bao bọc sau:

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

Một chuỗi Nim là một mảng với @ở phía trước, như @[1, 2, 3]. Do đó, một đầu vào cho thủ tục này có thể là:

@[@[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

Forth (gforth) , 65 byte

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

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng đối số ngăn xếp (thứ tự rgb)

Giải trình

Đối với mỗi trong số 3 kênh màu:

  • di chuyển tất cả các số của kênh đó lên đầu ngăn xếp
  • thêm chúng lại với nhau
  • thêm 4 (để xử lý làm tròn)
  • chia cho 8

Giải thích mã

: 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

Runic bùa mê , 41 byte

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

Hãy thử trực tuyến!

Sử dụng 3 con trỏ lệnh để phân tích đầu vào theo đúng thứ tự (vì các giá trị đầu vào luôn theo thứ tự RGB, RGB,...) và miễn là mỗi ba IP không hợp nhất và không chuyển sang ilệnh nput đọc tiếp theo quá sớm (do đó tất cả các khoảng trắng), nó hoạt động và tiết kiệm byte khi phải liên tục xoay ngăn xếp để giữ giá trị chính xác ở trên cùng để tính tổng.

Về mặt kỹ thuật , mã này có lỗi trong x.5các giá trị làm tròn chính xác cho một số đầu vào, nhưng điều này là do phương pháp làm tròn mặc định được sử dụng bởi C # , để làm tròn đến số sự kiện gần nhất, thay vì lên trên và do vấn đề mất độ chính xác của dấu phẩy động và tôi không biết về vấn đề này trước khi viết câu trả lời này và kiểm tra các trường hợp kiểm tra. Điều này sẽ được sửa trong một bản dựng trong tương lai , cùng với một vài thứ khác như ngoại lệ chưa được xử lý này .

Trong khi đó, sửa đổi này làm cho sự điều chỉnh cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.