Изменение цвета камуфляжного хамелеона

19

Проблемы с хамелеоном , по-видимому, плохо . Жаль, что хамелеоны - прекрасные существа. Время перемен!

Изображение хамелеона

Как все мы знаем, многие хамелеоны обладают замечательной способностью сливаться с окружающей средой, меняя цвет кожи. Что также является целью этой задачи.

Вызов

Представьте себе квадрат из девяти пикселей. Восемь пикселей - это окружение. В центре хамелеон.

Как это: Восемь серых квадратов вокруг центральной площади.

Хамелеон естественно пытается гармонировать с окружающей средой. Это происходит путем изменения его цвета на средний цвет окружающих пикселей. Так что в этом случае хамелеон изменит свой цвет на серый.

Задача

Учитывая цвета окружающих пикселей, выведите цвет хамелеона.

Цвет хамелеона определяется как сумма всех красных, зеленых и синих в пикселях ÷ 8.

вход

Массив значений цвета для восьми окружающих пикселей, начиная с верхнего левого угла и продолжая по часовой стрелке, например:

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

Если вы получаете ввод в другой форме, числа должны быть одинаковой длины или иметь нечисловой разделитель между ними. Тройки должны иметь разделительный символ, если они не дополнены от 0 до 9 цифр. (Например 044200255044200255044200255044200255044200255044200255044200255044200255, допустимо, так есть 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255и 44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255, но 4420025544200255442002554420025544200255442002554420025544200255не является.)

Выход

Массив / строка / и т.д., содержащие цвета центрального пикселя (в десятичном формате), например:

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

Если вы выводите что-то отличное от массива: числа должны быть одинаковой длины или иметь нечисловой разделитель между ними. (Например 044200255, верно, так есть 44 200 255, но 44200255нет.)

Числа могут не содержать десятичных точек, поэтому, например 44.0 200 255.0, недействительно.

округление

Выходные данные должны быть округлены до ближайшего целого числа. (Половинки должны быть округлены до.) Например, если сумма всех красного 1620 , вы должны выход 203, не 202или202.5 .

Примеры

Фотографии только для иллюстрации. Средний пиксель - это выход, окружающие пиксели - это вход.

Входные данные:

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

Выход:

[200,200,200]


Входные данные:

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

Выход:

[128,128,128]


Входные данные:

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

Выход:

[83,125,103]


Входные данные:

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

Выход:

[45,65,85]

Представления могут быть полной программой или функцией. Применяются стандартные правила ввода / вывода и лазейки .

user2428118
источник
@LeakyNun Спасибо за ссылку. Это не будет иметь большого значения для этой задачи, но я буду помнить об этом, если сделаю что-то подобное в будущем.
user2428118
9
Как ни странно, я думаю, что это вопрос хамелеона для обработки округления.
xnor
«пока он состоит из восьми тройных десятичных чисел 0-255» Может ли он быть в двоичном виде? Одинарный?
Дрянная Монахиня
Кроме того, я могу перенести это заранее?
Дрянная Монахиня

Ответы:

8

MATL, 8 4 байта

YmYo

Попробуйте онлайн!

4 байта сохранены благодаря мензурке!

Объяснение:

Ym          "Get the average of each column
  Yo        "And round up
DJMcMayhem
источник
Мне нравится злоупотребление синтаксисом массива python! Вы можете заменить s8/на Xm(т.е. meanвниз по столбцам). Также вы можете указать входные данные как 3 x 8для начала и избавиться от3e!
Suever
Yeah, YmYo should do it... just take the input as [[R,G,B];[R,G,B];...] with semicolons between the RGB rows.
beaker
@beaker Woah! Thanks!
DJMcMayhem
does Yo round up, or round to closest with ties being rounded up? The challenge wants the latter.
John Dvorak
@JanDvorak It rounds to the nearest integer (up or down) matl.tryitonline.net/…
Suever
11

Python, 38 bytes

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

Rounds the average (towards the nearest integer, with halves rounding up) by adding 4 to the sum, then floor-dividing by 8 via the bit-shift >>3.

xnor
источник
4

C, 151 123 103 91

Requires 24 parameters passed to the program, in the order R G B R G B ... and outputs the triplet R G B without a newline.

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]);}
owacoder
источник
main(c,v)char**v;{ to save 2 bytes? Also +1 for <3 in source code!
betseg
1

Pyth, 8 bytes

m.R.Od0C

Test suite.

m.R.Od0C     input: Q
m.R.Od0CQ    implicit arguments
        Q    input
       C     transpose
m    d       for each:
   .O            take average
 .R   0          round off
Leaky Nun
источник
1

J, 11 bytes

0.5<.@++/%#

Takes the input as an 8x3 array where each row is an RGB value

Explanation

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
miles
источник
1

JavaScript, 75 64 55 bytes

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

A JavaScript answer to get you started.

Edit: Saved 11 bytes thanks to Dendrobium, and another 9 thanks to Neil.

user2428118
источник
55 bytes: 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]] yields 83, 125, *104* instead of 83, 125, *103* with your code.
user2428118
Ah, misread the question, thought it was supposed to ceil. 64 bytes: a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>(x/8).toFixed())
Dendrobium
x+4>>3 should round correctly.
Neil
1

Lisp - 180 179 bytes

EDIT: Formatted for further golfing.

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

Does it the correct way, I guess. Untested.

  • a is just average
  • r is this challenge's proper rounding, since Lisp round rounds to the nearest even integer
  • c does the real work, taking in input in the format '((R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B)), and returning a '(R G B) list containg the answer.
Dan the Man
источник
1

Nim, 134 126 115 108 78 bytes

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

Defines an anonymous procedure, which requires the input passed in as a double-nested sequence and outputs as a 3-element array. The procedure can only be used as an argument to another procedure; to test, use the following wrapper:

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

A Nim sequence is an array with @ in front, like @[1, 2, 3]. An input to this procedure could therefore be:

@[@[0,0,0],@[255,255,255],@[0,0,0],@[255,255,255],@[255,255,255],@[0,0,0],@[255,255,255],@[0,0,0]]
Copper
источник
1

Forth (gforth), 65 bytes

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

Try it online!

Takes input as stack arguments (r g b order)

Explanation

For each of the 3 color channels:

  • move all the numbers of that channel to the top of the stack
  • add them together
  • add 4 (to handle rounding)
  • divide by 8

Code Explanation

: 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
reffu
источник
1

Runic Enchantments, 41 bytes

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

Try it online!

Utilizes 3 instruction pointers to parse the input in the correct order (as the input values are always in the order RGB, RGB,...) and as long as each of the three IPs don't merge, and don't advance to the next read input command too early (hence all the spaces), it works out and saves bytes over having to continuously rotate the stack to keep the correct value on top in order to calculate the sums.

Technically this code contains an error in correctly rounding x.5 values for some inputs, but this is due to the default rounding method used by C#, which is to round to the nearest event number, rather than upwards and is due to issues in floating point accuracy loss, and I was unaware of this issue prior to writing this answer and checking the test cases. This will be fixed in a future build, along with a few other things such as this unhandled exception.

In the meantime, this modification makes the necessary adjustment.

Draco18s
источник