La sfida camaleontica che cambia colore mimetico


19

Le sfide del camaleonte sono una cosa negativa , a quanto pare. Peccato, i camaleonti sono belle creature. È ora di cambiare!

Immagine di un camaleonte

Come tutti sappiamo, molti camaleonti possiedono una notevole capacità di fondersi con l'ambiente circostante cambiando il colore della loro pelle. Qual è anche l'obiettivo di questa sfida.

Sfida

Immagina un quadrato di nove pixel. Otto pixel sono i dintorni. Al centro c'è il camaleonte.

Come questo: Otto quadrati grigi attorno a un quadrato centrale.

Il camaleonte cerca naturalmente di fondersi con l'ambiente circostante. Lo fa cambiando il suo colore alla media di quella dei pixel circostanti. Quindi, in questo caso, il camaleonte cambierebbe colore grigio.

Obbiettivo

Dati i colori dei pixel circostanti, genera il colore del camaleonte.

Il colore del camaleonte è definito come il totale di tutto il rosso, il verde e il blu nei pixel ÷ 8.

Ingresso

Una matrice di valori di colore per gli otto pixel circostanti, iniziando in alto a sinistra e continuando in senso orario, in questo modo:

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

Puoi scegliere di ricevere input in una forma diversa, purché sia ​​composta da otto triple di numeri decimali 0-255.

Se ricevi input in una forma diversa, i numeri devono avere una lunghezza coerente o avere un separatore non numerico tra loro. Le triple devono avere un carattere di separazione a meno che non abbiano 0 caratteri a 9 cifre. (Ad esempio 044200255044200255044200255044200255044200255044200255044200255044200255è valido, così come sono 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, ma 4420025544200255442002554420025544200255442002554420025544200255non lo è.)

Produzione

Un array / stringa / ecc. Contenente i colori del pixel centrale (in decimale), come questo:

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

Nel caso in cui si produca qualcosa di diverso da un array: i numeri devono avere una lunghezza coerente o avere un separatore non numerico tra loro. (Ad esempio 044200255è valido, così è 44 200 255, ma 44200255non lo è.)

I numeri potrebbero non contenere punti decimali, quindi ad es. Non 44.0 200 255.0è valido.

Arrotondamento

L'output deve essere arrotondato al numero intero più vicino. (Le metà devono essere arrotondate per eccesso.) Ad esempio, se la somma di tutto il rosso è 1620 , è necessario produrre 203, no 202o 202.5.

Esempi

Le foto sono solo per illustrazione. Il pixel centrale è l'output, i pixel circostanti sono l'input.

Ingresso:

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

Produzione:

[200,200,200]


Ingresso:

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

Produzione:

[128,128,128]


Ingresso:

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

Produzione:

[83,125,103]


Ingresso:

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

Produzione:

[45,65,85]

Gli invii possono essere un programma completo o una funzione. Si applicano le regole I / O standard e scappatoia .



@LeakyNun Grazie per il link. Non sarà davvero importante per questa sfida, ma lo terrò a mente se dovessi fare qualcosa di simile in futuro.
user2428118

9
Stranamente, penso che questa sia una specie di domanda camaleontica per gestire l'arrotondamento.
xnor

"purché sia ​​composto da otto triple di numeri decimali 0-255" Può essere in binario? Unario?
Leaky Nun,

Inoltre, posso trasporlo in anticipo?
Leaky Nun,

Risposte:


8

MATL, 8 4 byte

YmYo

Provalo online!

4 byte salvati grazie al becher!

Spiegazione:

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

Mi piace l'abuso della sintassi dell'array python! È possibile sostituire s8/con Xm(ovvero meanverso il basso le colonne). Inoltre, potresti essere in grado di specificare l'input 3 x 8per iniziare e sbarazzarti del3e!
Suever

Sì, YmYodovrei farlo ... basta prendere l'input come [[R,G,B];[R,G,B];...]con i punti e virgola tra le righe RGB.
becher

@beaker Woah! Grazie!
DJMcMayhem

fa Youp rotondo, o rotonda a più vicino con i legami di essere rastrellati? La sfida vuole quest'ultima.
John Dvorak,

@JanDvorak Arrotonda al numero intero più vicino (su o giù) matl.tryitonline.net/…
Suever

11

Python, 38 byte

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

Arrotonda la media (verso il numero intero più vicino, con le metà arrotondando per eccesso) aggiungendo 4 alla somma, quindi dividendo il pavimento per 8 tramite il bit-shift >>3.



4

C, 151 123 103 91

Richiede 24 parametri passati al programma, nell'ordine RGBRGB ... ed emette la tripletta RGB senza una nuova riga.

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;{salvare 2 byte? Anche +1 per <3 nel codice sorgente!
Betseg,



1

J, 11 byte

0.5<.@++/%#

Prende l'input come un array 8x3 in cui ogni riga è un valore RGB

Spiegazione

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)

Una risposta JavaScript per iniziare.

Modifica: salvato 11 byte grazie a Dendrobium e altri 9 grazie a 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]]produce 83, 125, * 104 * invece di 83, 125, * 103 * con il tuo codice.
user2428118

Ah, ho letto male la domanda, ho pensato che doveva ceil. 64 byte:a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>(x/8).toFixed())
Dendrobium,

x+4>>3dovrebbe arrotondare correttamente.
Neil,

1

Lisp - 180 179 byte

EDIT: formattato per ulteriore golf.

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

Fa nel modo giusto , immagino. Non testato.

  • a è solo nella media
  • rè il corretto arrotondamento di questa sfida, poiché Lisp roundarrotonda al numero intero pari più vicino
  • cfa il vero lavoro, inserendo input nel 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 restituendo un '(R G B)elenco contenente la risposta.

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]

Definisce una procedura anonima, che richiede l'input passato come sequenza nidificata e l'output come array a 3 elementi. La procedura può essere utilizzata solo come argomento per un'altra procedura; per testare, utilizzare il seguente 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])

Una sequenza Nim è un array con @in primo piano, come @[1, 2, 3]. Un input per questa procedura potrebbe quindi essere:

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

Provalo online!

Accetta input come argomenti stack (ordine rgb)

Spiegazione

Per ciascuno dei 3 canali di colore:

  • sposta tutti i numeri di quel canale in cima allo stack
  • aggiungili insieme
  • aggiungi 4 (per gestire l'arrotondamento)
  • dividere per 8

Spiegazione del codice

: 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

Incantesimi runici , 41 byte

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

Provalo online!

Utilizza 3 puntatori di istruzioni per analizzare l'input nell'ordine corretto (poiché i valori di input sono sempre nell'ordine RGB, RGB,...) e fintanto che ciascuno dei tre IP non si fondono e non passa al icomando read nput successivo troppo presto (quindi tutti gli spazi), risolve e salva i byte dovendo ruotare continuamente lo stack per mantenere il valore corretto in cima al fine di calcolare le somme.

Tecnicamente questo codice contiene un errore nell'arrotondamento corretto dei x.5valori per alcuni input, ma ciò è dovuto al metodo di arrotondamento predefinito utilizzato da C # , che è quello di arrotondare al numero di evento più vicino, piuttosto che verso l'alto ed è dovuto a problemi di perdita di precisione in virgola mobile e non ero a conoscenza di questo problema prima di scrivere questa risposta e controllare i casi di test. Questo sarà problema risolto in una build futura , insieme ad alcune altre cose come questa eccezione non gestita .

Nel frattempo, questa modifica apporta le modifiche necessarie.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.