迷彩变色变色龙挑战


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 255and和都是有效的,44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?2554420025544200255442002554420025544200255442002554420025544200255不是。)

输出量

包含中心像素颜色(十进制)的数组/字符串/等,如下所示:

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

如果输出的不是数组,则数字必须是一致的长度,或者数字之间必须有非数字分隔符。(例如044200255,有效,44 200 25544200255无效)。

数字可能不包含小数点,因此例如44.0 200 255.0无效。

四舍五入

输出必须四舍五入到最接近的整数。(一半必须四舍五入。)例如,如果所有红色的总和为1620,则必须输出203,而不是202202.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]

提交的内容可以是完整程序或功能。标准I / O漏洞规则适用。



@LeakyNun感谢您的链接。对于这个挑战来说,这并不重要,但我会牢记在下,如果我将来做类似的事情。
user2428118 '16

9
有趣的是,我认为这是处理舍入的变色龙问题。
xnor

“只要它由0-255的八个三进制组成”,它可以是二进制吗?一元?
Leaky Nun

另外,我可以事先换位吗?
Leaky Nun

Answers:


8

MATL,8个 4字节

YmYo

在线尝试!

多亏了烧杯,节省了4个字节!

说明:

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

我喜欢python数组语法的滥用!您可以替换s8/Xm(即mean在列下方)。另外,您也许可以指定输入,3 x 8从开始就可以摆脱3e!
Suever

是的,YmYo应该这样做...只需将输入作为[[R,G,B];[R,G,B];...]RGB行之间的分号即可。
烧杯

@烧杯哇!谢谢!
DJMcMayhem

是否Yo舍入或舍入到最接近的关系?挑战要后者。
John Dvorak

@JanDvorak它四舍五入到最接近的整数(向上或向下)matl.tryitonline.net/…–
Suever

11

Python,38个字节

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

通过将总和加4,然后通过位移将底数除以8,将平均值四舍五入(朝最接近的整数,四舍五入)>>3



4

电话:151 123 103 91

需要以RGBRGB ...的顺序将24个参数传递给程序,并输出没有换行符的三元组RGB。

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个字节?还要为源代码中的<3 +1!
betseg

1

Pyth,8个字节

m.R.Od0C

测试套件

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


1

J,11个字节

0.5<.@++/%#

将输入作为8x3数组,其中每一行都是RGB值

说明

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字节

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

一个JavaScript答案可以帮助您入门。

编辑:感谢Dendrobium,节省了11个字节,感谢Neil,节省了9个字节。


55个字节:a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>x+7>>3)
end兰

@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]]生成的代码为83、125 ,* 104 *,而不是83、125 ,* 103 *
user2428118 '16

啊,误解了问题,以为应该解决ceil。64位元组:a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>(x/8).toFixed())
Dendrobium

x+4>>3 应该正确舍入。
尼尔

1

口齿不清- 180个 179字节

编辑:格式化为进一步打高尔夫球。

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

我猜这是正确的方法吗?未经测试。

  • a 只是一般
  • r是此挑战的适当取整,因为Lisp取整round为最接近的偶数整数
  • c做真正的工作,以格式输入 '((R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B)),然后返回'(R G B)包含答案列表。

1

134 126 115 108 78字节

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

定义一个匿名过程,该过程要求输入为双嵌套序列,输入为3元素数组。该过程只能用作另一个过程的参数。要测试,请使用以下包装器:

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

Nim序列是一个@在前面的数组,例如@[1, 2, 3]。因此,此过程的输入可能是:

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

第四(gforth),65字节

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

在线尝试!

将输入作为堆栈参数(RGB顺序)

说明

对于3个颜色通道中的每一个:

  • 将该通道的所有编号移到堆栈的顶部
  • 将它们加在一起
  • 加4(处理舍入)
  • 除以8

代码说明

: 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

符文附魔,41字节

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

在线尝试!

利用3个指令指针,以正确的顺序解析输入(因为输入值始终按顺序排列RGB, RGB,...),并且只要三个IP中的每个IP不合并,并且不要i过早进入下一个read nput命令(因此保留所有空格),它可以解决并节省字节,而不必连续旋转堆栈以将正确的值保持在最上面以计算总和。

从技术上讲,此代码在x.5某些输入的正确舍入值中包含一个错误,但这是由于C#使用默认舍入方法,它舍入到最接近的事件号,而不是向上舍入,并且是由于浮点精度损失引起的,在编写此答案和检查测试用例之前,我没有意识到这个问题。这将在以后的版本中修复,以及其他一些问题,例如未处理的异常

同时,此修改进行必要的调整。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.