Die Camouflage Color Changing Chameleon Challenge


19

Chamäleon Herausforderungen sind anscheinend eine schlechte Sache . Schade, Chamäleons sind wunderschöne Kreaturen. Zeit für Veränderung!

Bild eines Chamäleons

Wie wir alle wissen, haben viele Chamäleons eine bemerkenswerte Fähigkeit, sich in ihre Umgebung einzufügen, indem sie die Farbe ihrer Haut verändern. Welches ist auch das Ziel dieser Herausforderung.

Herausforderung

Stellen Sie sich ein Quadrat mit neun Pixeln vor. Acht Pixel sind die Umgebung. In der Mitte befindet sich das Chamäleon.

So was: Acht graue Quadrate um ein zentrales Quadrat.

Das Chamäleon versucht auf natürliche Weise, sich in seine Umgebung einzufügen. Dies geschieht, indem die Farbe auf den Durchschnitt der umgebenden Pixel geändert wird. In diesem Fall würde das Chamäleon also seine Farbe in ändern grau.

Zielsetzung

Geben Sie unter Berücksichtigung der Farben der umliegenden Pixel die Farbe des Chamäleons aus.

Die Farbe des Chamäleons ist definiert als die Summe aller Rot-, Grün- und Blautöne in den Pixeln ÷ 8.

Eingang

Eine Reihe von Farbwerten für die acht umliegenden Pixel, beginnend oben links und im Uhrzeigersinn, wie folgt:

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

Sie können Eingaben in einer anderen Form empfangen, sofern diese aus acht Dreifachen der Dezimalzahlen von 0 bis 255 bestehen.

Wenn Sie Eingaben in einer anderen Form erhalten, müssen die Zahlen entweder eine konsistente Länge haben oder ein nicht numerisches Trennzeichen dazwischen haben. Tripel müssen ein Trennzeichen haben, es sei denn, sie sind mit 0 bis 9 Ziffern aufgefüllt. (ZB 044200255044200255044200255044200255044200255044200255044200255044200255ist gültig, so sind 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255und 44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255, ist aber 4420025544200255442002554420025544200255442002554420025544200255nicht.)

Ausgabe

Ein Array / String / etc., das die Farben des mittleren Pixels (in Dezimalzahl) enthält, wie folgt:

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

Für den Fall, dass Sie etwas anderes als ein Array ausgeben: Zahlen müssen entweder eine konsistente Länge haben oder ein nicht numerisches Trennzeichen dazwischen haben. (ZB 044200255ist gültig, ist 44 200 255aber 44200255nicht gültig .)

Die Zahlen dürfen keine Nachkommastellen enthalten, sind also zB 44.0 200 255.0ungültig.

Runden

Die Ausgabe muss auf die nächste Ganzzahl gerundet werden. (Die Hälften müssen aufgerundet werden.) Wenn beispielsweise die Summe aller Roten 1620 ist , müssen Sie 203nicht 202oder ausgeben 202.5.

Beispiele

Die Bilder dienen nur zur Veranschaulichung. Das mittlere Pixel ist die Ausgabe, die umgebenden Pixel sind die Eingabe.

Eingang:

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

Ausgabe:

[200,200,200]


Eingang:

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

Ausgabe:

[128,128,128]


Eingang:

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

Ausgabe:

[83,125,103]


Eingang:

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

Ausgabe:

[45,65,85]

Einsendungen können ein vollständiges Programm oder eine Funktion sein. Standard I / O und Schlupfloch Regeln gelten.



@LeakyNun Danke für den Link. Für diese Herausforderung ist es nicht wirklich wichtig, aber ich werde es im Hinterkopf behalten, wenn ich in Zukunft etwas Ähnliches mache.
user2428118

9
Witzigerweise denke ich, dass dies eine Chamäleon-Frage für den Umgang mit Rundungen ist.
xnor

"solange es aus acht Dezimaltripeln von 0-255 besteht" Kann es binär sein? Unär?
Undichte Nonne

Kann ich es auch vorher transponieren?
Undichte Nonne

Antworten:


8

MATL, 8 4 Bytes

YmYo

Probieren Sie es online!

4 Bytes gespart dank Becher!

Erläuterung:

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

Ich mag den Missbrauch der Python-Array-Syntax! Sie können ersetzen s8/mit Xm(dh meannach unten den Spalten). Möglicherweise können Sie auch die Eingabe angeben 3 x 8, um den3e!
Suever

Ja, YmYosollte es tun ... nehmen Sie einfach die Eingabe wie [[R,G,B];[R,G,B];...]mit Semikolons zwischen den RGB-Zeilen.
Becher

@beaker Woah! Vielen Dank!
DJMcMayhem

tut YoRunde, oder rund um die am nächsten mit Riegeln aufgerundet wird? Die Herausforderung will das letztere.
John Dvorak

@ JanDvorak Es rundet auf die nächste Ganzzahl (nach oben oder unten) matl.tryitonline.net/…
Suever

11

Python, 38 Bytes

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

Rundet den Durchschnitt (in Richtung der nächsten Ganzzahl, wobei die Hälften aufgerundet werden) durch Addition von 4 zur Summe und anschließender Division durch 8 über die Bitverschiebung >>3.



4

C 151 123 103 91

Erfordert 24 an das Programm übergebene Parameter in der Reihenfolge RGBRGB ... und gibt das RGB-Triplett ohne Zeilenumbruch aus.

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 Bytes sparen? Auch +1 für <3 im Quellcode!
Betseg

1

Pyth , 8 Bytes

m.R.Od0C

Testsuite .

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 Bytes

0.5<.@++/%#

Nimmt die Eingabe als 8x3-Array, wobei jede Zeile ein RGB-Wert ist

Erläuterung

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)

Eine JavaScript-Antwort zum Einstieg.

Bearbeiten: 11 Bytes dank Dendrobium und weitere 9 dank Neil gespeichert .


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]]ergibt 83, 125, * 104 * anstelle von 83, 125, * 103 * mit Ihrem Code.
user2428118

Ah, ich habe die Frage falsch verstanden, dachte, es sollte so sein ceil. 64 Bytes:a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>(x/8).toFixed())
Dendrobium

x+4>>3sollte richtig runden.
Neil

1

Lisp - 180 179 Bytes

EDIT: Für weiteres Golfen formatiert.

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

Tut es den richtigen Weg , denke ich. Ungetestet.

  • a ist nur durchschnittlich
  • rist die richtige Rundung dieser Herausforderung, da Lisp roundauf die nächste gerade Ganzzahl rundet
  • cerledigt die eigentliche Arbeit, nimmt Eingaben im Format auf '((R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B))und gibt eine '(R G B)Liste mit der Antwort zurück.

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]

Definiert eine anonyme Prozedur, für die die Eingabe als doppelt verschachtelte Sequenz übergeben und als Array mit 3 Elementen ausgegeben werden muss. Die Prozedur kann nur als Argument für eine andere Prozedur verwendet werden. Verwenden Sie zum Testen den folgenden 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])

Eine Nim-Sequenz ist ein Array mit einem vorangestellten @Wert @[1, 2, 3]. Ein Beitrag zu diesem Verfahren könnte daher sein:

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

Viertens (gviertens) , 65 Bytes

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

Probieren Sie es online!

Nimmt Eingaben als Stapelargumente (RGB-Reihenfolge)

Erläuterung

Für jeden der 3 Farbkanäle:

  • Bewegen Sie alle Nummern dieses Kanals an die Spitze des Stapels
  • füge sie zusammen
  • addiere 4 (um die Rundung zu handhaben)
  • durch 8 teilen

Code-Erklärung

: 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

Runenverzauberungen , 41 Bytes

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

Probieren Sie es online!

Verwendet 3 Befehlszeiger, um die Eingabe in der richtigen Reihenfolge zu analysieren (da die Eingabewerte immer in der richtigen Reihenfolge sind RGB, RGB,...) und so lange, wie keine der drei IPs zusammengeführt werden und nicht izu früh zum nächsten Befehl read nput übergegangen wird (daher alle Leerzeichen), es funktioniert und spart Bytes, da der Stapel ständig gedreht werden muss , um den korrekten Wert für die Berechnung der Summen oben zu behalten.

Technisch enthält dieser Code einen Fehler bei der korrekten Rundung von x.5Werten für einige Eingaben. Dies liegt jedoch an der von C # verwendeten Standardrundungsmethode , die auf die nächste Ereignisnummer und nicht aufwärts gerundet wird, und an Problemen beim Verlust der Gleitkommagenauigkeit , und ich war mir dieses Problems nicht bewusst, bevor ich diese Antwort schrieb und die Testfälle überprüfte. Dies wird in einem zukünftigen Build behoben , zusammen mit ein paar anderen Dingen wie dieser unbehandelten Ausnahme .

In der Zwischenzeit nimmt diese Änderung die erforderliche Anpassung vor.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.