O desafio de mudança de cor de camuflagem Chameleon


19

Os desafios dos camaleões são aparentemente ruins . Que pena, camaleões são criaturas bonitas. Hora de mudar!

Imagem de um camaleão

Como todos sabemos, muitos camaleões possuem uma capacidade notável de se misturar com o ambiente ao mudar a cor de sua pele. Qual é também o objetivo deste desafio.

Desafio

Imagine um quadrado de nove pixels. Oito pixels são os arredores. No centro está o camaleão.

Como isso: Oito quadrados cinza em torno de um quadrado central.

O camaleão tenta naturalmente se misturar com o ambiente. Isso é feito alterando sua cor para a média da dos pixels adjacentes. Então, nesse caso, o camaleão mudaria de cor para cinzento.

Objetivo

Dadas as cores dos pixels circundantes, produza a cor do camaleão.

A cor do camaleão é definida como o total de todo vermelho, verde e azul nos pixels ÷ 8.

Entrada

Uma matriz de valores de cores para os oito pixels circundantes, começando no canto superior esquerdo e continuando no sentido horário, da seguinte maneira:

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

Você pode optar por receber a entrada de uma forma diferente, desde que consista em oito triplos de números decimais de 0 a 255.

Se você receber uma entrada de uma forma diferente, os números deverão ter um comprimento consistente ou um separador não numérico entre eles. Os triplos devem ter um caractere de separação, a menos que sejam preenchidos com 0 a 9 dígitos. (Por exemplo, 044200255044200255044200255044200255044200255044200255044200255044200255é válido, também é 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255e 44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255, mas 4420025544200255442002554420025544200255442002554420025544200255não é.)

Resultado

Uma matriz / string / etc. contendo as cores do pixel central (em decimal), assim:

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

Caso você produza algo diferente de uma matriz: os números devem ter um comprimento consistente ou ter um separador não numérico entre eles. (Por exemplo, 044200255é válido, também é 44 200 255, mas 44200255não é.)

Os números não podem conter pontos decimais, por exemplo, 44.0 200 255.0é inválido.

Arredondamento

A saída deve ser arredondada para o número inteiro mais próximo. (As metades devem ser arredondadas para cima.) Por exemplo, se a soma de todo o vermelho for 1620 , você deverá produzir 203, não 202ou 202.5.

Exemplos

As imagens são apenas ilustrativas. O pixel do meio é a saída, os pixels ao redor são a entrada.

Entrada:

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

Resultado:

[200,200,200]


Entrada:

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

Resultado:

[128,128,128]


Entrada:

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

Resultado:

[83,125,103]


Entrada:

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

Resultado:

[45,65,85]

As submissões podem ser um programa completo ou uma função. Aplicam-se as regras de E / S padrão e brecha .



@LeakyNun Obrigado pelo link. Realmente não será importante para esse desafio, mas vou ter em mente que devo fazer algo semelhante no futuro.
precisa saber é o seguinte

9
Curiosamente, acho que essa é uma pergunta meio camaleônica para lidar com arredondamentos.
xnor

"contanto que consista em oito triplos de números decimais 0-255" Pode ser em binário? Unário?
Freira vazando

Além disso, posso transpor antecipadamente?
Freira vazando

Respostas:


8

MATL, 8 4 bytes

YmYo

Experimente online!

4 bytes salvos graças ao copo!

Explicação:

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

Eu gosto do abuso da sintaxe da matriz python! Você pode substituir s8/por Xm(ou seja, meanabaixo das colunas). Além disso, você pode ser capaz de especificar a entrada como 3 x 8para começar e se livrar do3e!
Suever

Sim, YmYodeve fazê-lo ... basta pegar a entrada como [[R,G,B];[R,G,B];...]ponto e vírgula entre as linhas RGB.
beaker

@beaker Woah! Obrigado!
DJMcMayhem

faz Yo-se redondo, ou volta para mais próximo com os laços que está sendo arredondado para cima? O desafio quer o último.
John Dvorak

@JanDvorak Arredonda para o número inteiro mais próximo (para cima ou para baixo) matl.tryitonline.net/…
Suever

11

Python, 38 bytes

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

Arredonda a média (na direção do número inteiro mais próximo, com as metades arredondadas para cima) adicionando 4 à soma e depois dividindo o piso por 8 através do deslocamento de bits >>3.



4

C, 151 123 103 91

Requer 24 parâmetros passados ​​para o programa, na ordem RGBRGB ... e gera o trigêmeo RGB sem uma nova linha.

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;{salvar 2 bytes? Também +1 para <3 no código fonte!
betseg 27/07/16



1

J, 11 bytes

0.5<.@++/%#

Recebe a entrada como uma matriz 8x3 em que cada linha é um valor RGB

Explicação

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 bytes

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

Uma resposta JavaScript para você começar.

Editar: salvou 11 bytes graças ao Dendrobium e outros 9 graças ao Neil .


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

O @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]]gera 83, 125, * 104 * em vez de 83, 125, * 103 * com o seu código.
precisa saber é o seguinte

Ah, interpretou mal a pergunta, pensou que deveria ceil. 64 bytes:a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>(x/8).toFixed())
Dendrobium

x+4>>3deve arredondar corretamente.
Neil

1

Lisp - 180 179 bytes

EDIT: Formatado para mais golfe.

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

Faz da maneira correta , eu acho. Não testado.

  • a é apenas média
  • r é o arredondamento adequado desse desafio, já que o Lisp round arredonda para o número par mais próximo
  • cfaz o trabalho real, recebendo entradas no formato '((R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B))e retornando uma '(R G B)lista contendo a resposta.

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]

Define um procedimento anônimo, que requer que a entrada seja transmitida como uma sequência aninhada dupla e seja exibida como uma matriz de 3 elementos. O procedimento pode ser usado apenas como argumento para outro procedimento; para testar, use o seguinte 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])

Uma sequência Nim é uma matriz com @na frente, como @[1, 2, 3]. Uma entrada para este procedimento pode ser:

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

Quarto (gforth) , 65 bytes

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

Experimente online!

Recebe entrada como argumentos de pilha (ordem rgb)

Explicação

Para cada um dos três canais de cores:

  • mova todos os números desse canal para o topo da pilha
  • adicione-os juntos
  • adicione 4 (para lidar com o arredondamento)
  • dividir por 8

Código Explicação

: 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

Encantos Rúnicos , 41 bytes

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

Experimente online!

Utiliza 3 ponteiros de instruções para analisar a entrada na ordem correta (como os valores de entrada estão sempre na ordem RGB, RGB,...) e desde que cada um dos três IPs não se mesclem e não avance para o próximo icomando read nput muito cedo (daí todos os espaços), ele funciona e economiza bytes, além de ter que girar continuamente a pilha para manter o valor correto no topo, a fim de calcular as somas.

Tecnicamente, este código contém um erro no arredondamento correto dos x.5valores de algumas entradas, mas isso se deve ao método de arredondamento padrão usado pelo C # , que é arredondar para o número do evento mais próximo, em vez de para cima e devido a problemas na perda de precisão do ponto flutuante , e eu não tinha conhecimento desse problema antes de escrever esta resposta e verificar os casos de teste. Isso será corrigido em uma compilação futura , juntamente com algumas outras coisas, como essa exceção não tratada .

Enquanto isso, essa modificação faz o ajuste necessário.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.