Wyzwanie kameleona zmieniające kolor kamuflażu

19

Najwyraźniej wyzwania kameleona są złą rzeczą . Szkoda, kameleony to piękne stworzenia. Czas nazmianę!

Zdjęcie kameleona

Jak wszyscy wiemy, wiele kameleonów ma niezwykłą zdolność wtapiania się w otoczenie poprzez zmianę koloru skóry. Co jest również celem tego wyzwania.

Wyzwanie

Wyobraź sobie kwadrat dziewięciu pikseli. Osiem pikseli to otoczenie. W centrum jest kameleon.

Lubię to: Osiem szarych kwadratów wokół centralnego kwadratu.

Kameleon naturalnie próbuje wtopić się w otoczenie. Czyni to, zmieniając kolor na średnią pikseli otaczających. W tym przypadku kameleon zmieniłby kolor na szary.

Cel

Biorąc pod uwagę kolory otaczających pikseli, wypisz kolor kameleona.

Kolor kameleona określa się jako sumę wszystkich czerwonych, zielonych i niebieskich pikseli w pikselach ÷ 8.

Wejście

Tablica wartości kolorów dla ośmiu otaczających pikseli, zaczynając od lewego górnego rogu i kontynuując zgodnie z ruchem wskazówek zegara:

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

Możesz wybrać opcję otrzymywania danych wejściowych w innej formie, o ile składa się ona z ośmiu potrójnych liczb dziesiętnych 0–255.

Jeśli otrzymujesz dane wejściowe w innej formie, liczby muszą mieć stałą długość lub mieć między nimi separator nienumeryczny. Potrójne znaki muszą mieć znak oddzielający, chyba że są wypełnione zerami do 9 cyfr. (Np. 044200255044200255044200255044200255044200255044200255044200255044200255Jest ważny, podobnie jak 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255i 44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255, ale 4420025544200255442002554420025544200255442002554420025544200255nie jest.)

Wynik

Tablica / łańcuch / itp. Zawierający kolory środkowego piksela (dziesiętnie), jak poniżej:

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

W przypadku wypisania czegoś innego niż tablica: Liczby muszą mieć stałą długość lub mieć między nimi separator nienumeryczny. (Np. 044200255Jest poprawne, tak jest 44 200 255, ale 44200255nie jest.)

Liczby nie mogą zawierać kropek dziesiętnych, więc np 44.0 200 255.0. Są niepoprawne.

Zaokrąglanie

Dane wyjściowe należy zaokrąglić do najbliższej liczby całkowitej. (Połówki muszą być zaokrąglone w górę.) Np. Jeśli suma wszystkich czerwonych wynosi 1620 , musisz wyprowadzać 203, nie 202lub 202.5.

Przykłady

Zdjęcia mają wyłącznie charakter ilustracyjny. Środkowy piksel to dane wyjściowe, a otaczające piksele to dane wejściowe.

Wejście:

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

Wynik:

[200,200,200]


Wejście:

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

Wynik:

[128,128,128]


Wejście:

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

Wynik:

[83,125,103]


Wejście:

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

Wynik:

[45,65,85]

Zgłoszenia mogą być pełnym programem lub funkcją. Obowiązują standardowe zasady we / wy i luki .

użytkownik2428118
źródło
@LeakyNun Dzięki za link. To wyzwanie nie będzie miało znaczenia, ale będę o tym pamiętać, jeśli w przyszłości zrobię coś podobnego.
user2428118,
9
Co ciekawe, myślę, że jest to trochę kameleonowe pytanie dotyczące obchodzenia się z zaokrąglaniem.
xnor
„o ile składa się z ośmiu trójek liczb dziesiętnych 0–255” Czy może być zapisany w postaci binarnej? Unary?
Leaky Nun
Czy mogę to również przetłumaczyć wcześniej?
Leaky Nun

Odpowiedzi:

8

MATL, 8 4 bajtów

YmYo

Wypróbuj online!

4 bajty zapisane dzięki zlewce!

Wyjaśnienie:

Ym          "Get the average of each column
  Yo        "And round up
DJMcMayhem
źródło
Lubię nadużywanie składni tablicy python! Można wymienić s8/z Xm(tj meandół kolumny). Możesz także określić, od czego 3 x 8zacząć, i pozbyć się3e!
Suever
Tak, YmYopowinienem to zrobić ... po prostu weź dane wejściowe jak w [[R,G,B];[R,G,B];...]przypadku średników między wierszami RGB.
zlewka
@beaker Woah! Dzięki!
DJMcMayhem
czy Yozaokrągla się w górę, czy zaokrągla do najbliższego z zaokrąglaniem w górę? Wyzwanie chce tego drugiego.
John Dvorak,
@JanDvorak Zaokrągla do najbliższej liczby całkowitej (w górę lub w dół) matl.tryitonline.net/…
Suever
11

Python, 38 bajtów

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

Zaokrągla średnią (w kierunku najbliższej liczby całkowitej z połówkami zaokrąglającymi w górę) przez dodanie 4 do sumy, a następnie podzielenie podłogi przez 8 za pomocą przesunięcia bitów >>3.

xnor
źródło
5

Galaretka , 5 bajtów

S+4:8

Zestaw testowy . (Nieznacznie zmodyfikowany, aby zweryfikować wszystkie przypadki testowe jednocześnie).

S+4:8
S      sum (vectorized)
 +4    add 4
   :8  floor division by 8
Leaky Nun
źródło
4

C, 151 123 103 91

Wymaga 24 parametrów przekazanych do programu, w kolejności RGBRGB ... i wysyła tryplet RGB bez nowej linii.

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
źródło
main(c,v)char**v;{zapisać 2 bajty? Również +1 dla <3 w kodzie źródłowym!
betseg 27.07.16
1

Pyth , 8 bajtów

m.R.Od0C

Zestaw testowy .

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
źródło
1

J, 11 bajtów

0.5<.@++/%#

Pobiera dane wejściowe jako tablicę 8x3, gdzie każdy wiersz ma wartość RGB

Wyjaśnienie

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
mile
źródło
1

JavaScript, 75 64 55 bajtów

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

Odpowiedź JavaScript na dobry początek.

Edycja: Zapisano 11 bajtów dzięki Dendrobium i kolejne 9 dzięki Neilowi .

użytkownik2428118
źródło
55 bajtów: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]]daje 83, 125, * 104 * zamiast 83, 125, * 103 * z twoim kodem.
user2428118
Ach, źle przeczytałem pytanie, myślałem, że powinno ceil . 64 bajty:a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>(x/8).toFixed())
Dendrobium
x+4>>3powinien zaokrąglić poprawnie.
Neil
1

Lisp - 180 179 bajtów

EDYCJA: Sformatowana do dalszego gry w golfa.

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

Myślę, że robi to we właściwy sposób . Niesprawdzone

  • a jest po prostu średnia
  • rjest właściwym zaokrągleniem tego wyzwania, ponieważ Lisp roundzaokrągla do najbliższej parzystej liczby całkowitej
  • cwykonuje prawdziwą pracę, przyjmując dane wejściowe w formacie '((R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B))i zwracając '(R G B)listę zawierającą odpowiedź.
Dan the Man
źródło
1

Nim , 134 126 115 108 78 bajtów

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

Definiuje anonimową procedurę, która wymaga, aby dane wejściowe były przekazywane jako sekwencja podwójnie zagnieżdżona, a dane wyjściowe - jako tablica 3-elementowa. Procedurę można wykorzystać tylko jako argument do innej procedury; do przetestowania użyj następującego opakowania:

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

Sekwencja Nim to tablica z @przodu, jak@[1, 2, 3] . Wkładem w tę procedurę może być zatem:

@[@[0,0,0],@[255,255,255],@[0,0,0],@[255,255,255],@[255,255,255],@[0,0,0],@[255,255,255],@[0,0,0]]
Miedź
źródło
1

Dalej (gforth) , 65 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako argumenty stosu (kolejność rgb)

Wyjaśnienie

Dla każdego z 3 kanałów kolorów:

  • przenieś wszystkie numery tego kanału na szczyt stosu
  • dodaj je razem
  • dodaj 4 (do obsługi zaokrąglania)
  • podziel przez 8

Objaśnienie kodu

: 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
źródło
1

Runiczne Zaklęcia , 41 bajtów

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

Wypróbuj online!

Wykorzystuje 3 wskaźniki instrukcji do parsowania danych wejściowych w prawidłowej kolejności (ponieważ wartości wejściowe są zawsze w kolejności RGB, RGB,...) i tak długo, jak każdy z trzech adresów IP nie łączy się i nie przechodzi zbyt wcześnie do następnego odczytu ipolecenia nput (stąd wszystkie spacje), to działa i oszczędza bajty na konieczności ciągłego obracania stosu aby zachować poprawną wartość na górze w celu obliczenia sum.

Technicznie ten kod zawiera błąd w prawidłowym zaokrąglaniu x.5wartości dla niektórych danych wejściowych, ale wynika to z domyślnej metody zaokrąglania używanej przez C # , która polega na zaokrąglaniu do najbliższego numeru zdarzenia, a nie w górę i jest spowodowana problemami z utratą dokładności zmiennoprzecinkowej , i nie wiedziałem o tym problemie przed napisaniem tej odpowiedzi i sprawdzeniem przypadków testowych. Zostanie to naprawione w przyszłej kompilacji , wraz z kilkoma innymi rzeczami, takimi jak ten nieobsługiwany wyjątek .

W międzyczasie ta modyfikacja wprowadza niezbędne dostosowanie.

Draco18s
źródło