Tantangan Chameleon Mengubah Warna Kamuflase


19

Tampaknya tantangan bunglon adalah hal yang buruk . Sayang sekali, bunglon adalah makhluk yang cantik. Waktunya untuk perubahan!

Gambar bunglon

Seperti kita ketahui, banyak bunglon memiliki kemampuan luar biasa untuk berbaur dengan lingkungannya dengan mengubah warna kulit mereka. Yang juga merupakan tujuan dari tantangan ini.

Tantangan

Bayangkan kuadrat sembilan piksel. Delapan piksel adalah sekelilingnya. Di tengah adalah bunglon.

Seperti ini: Delapan kotak abu-abu di sekitar pusat persegi.

Bunglon secara alami mencoba berbaur dengan lingkungannya. Ia melakukannya dengan mengubah warnanya menjadi rata-rata dari piksel di sekitarnya. Jadi, dalam hal ini, bunglon akan berubah warnanya menjadi Abu-abu.

Objektif

Mengingat warna-warna piksel di sekitarnya, mengeluarkan warna bunglon.

Warna bunglon didefinisikan sebagai total semua merah, hijau dan biru dalam piksel ÷ 8.

Memasukkan

Array nilai warna untuk delapan piksel di sekitarnya, mulai dari kiri atas dan berlanjut searah jarum jam, seperti ini:

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

Anda dapat memilih untuk menerima input dalam bentuk yang berbeda, asalkan terdiri dari delapan kali lipat angka desimal 0-255.

Jika Anda menerima input dalam bentuk yang berbeda, angka harus memiliki panjang yang konsisten atau memiliki pemisah non-numerik di antaranya. Triples harus memiliki karakter pemisah kecuali mereka 0-padded hingga 9 digit. (Misalnya 044200255044200255044200255044200255044200255044200255044200255044200255valid, begitu juga 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255dan 44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255, tetapi 4420025544200255442002554420025544200255442002554420025544200255tidak.)

Keluaran

Array / string / dll. Yang mengandung warna piksel tengah (dalam desimal), seperti ini:

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

Jika Anda mengeluarkan sesuatu selain array: Angka harus memiliki panjang yang konsisten atau memiliki pemisah non-numerik di antaranya. (Misalnya 044200255valid, demikian 44 200 255, tetapi 44200255tidak.)

Angka-angka mungkin tidak mengandung titik desimal, jadi misalkan 44.0 200 255.0tidak valid.

Pembulatan

Output harus dibulatkan ke integer terdekat. (Bagian harus dibulatkan.) Misalnya, jika jumlah semua merah adalah 1620 , Anda harus mengeluarkan 203, bukan 202atau 202.5.

Contohnya

Gambar hanya untuk ilustrasi. Pixel tengah adalah output, piksel sekitarnya adalah input.

Memasukkan:

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

Keluaran:

[200,200,200]


Memasukkan:

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

Keluaran:

[128,128,128]


Memasukkan:

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

Keluaran:

[83,125,103]


Memasukkan:

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

Keluaran:

[45,65,85]

Pengajuan dapat berupa program lengkap atau suatu fungsi. Standar I / O dan aturan celah berlaku.



@ LeakyNun Terima kasih atas tautannya. Ini tidak terlalu penting untuk tantangan ini, tetapi saya akan mengingatnya jika saya melakukan hal serupa di masa depan.
user2428118

9
Lucunya, saya pikir ini sedikit pertanyaan bunglon untuk menangani pembulatan.
xnor

"Asalkan itu terdiri dari delapan kali lipat angka desimal 0-255" Bisakah itu dalam biner? Unary?
Leaky Nun

Juga, dapatkah saya memindahkannya terlebih dahulu?
Leaky Nun

Jawaban:


8

MATL, 8 4 byte

YmYo

Cobalah online!

4 byte disimpan berkat gelas kimia!

Penjelasan:

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

Saya suka penyalahgunaan sintaks array python! Anda dapat mengganti s8/dengan Xm(yaitu meandi kolom). Anda juga dapat menentukan input 3 x 8untuk memulai dan menyingkirkan3e!
Suever

Ya, YmYoharus melakukannya ... hanya mengambil input [[R,G,B];[R,G,B];...]dengan titik koma di antara baris RGB.
Gelas kimia

@ speaker Woah! Terima kasih!
DJMcMayhem

apakah Yomengumpulkan, atau membulatkan ke terdekat dengan ikatan yang ditangkap? Tantangan menginginkan yang terakhir.
John Dvorak

@JanDvorak Membulatkan ke bilangan bulat terdekat (atas atau bawah) matl.tryitonline.net/…
Suever

11

Python, 38 byte

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

Membulatkan rata-rata (menuju bilangan bulat terdekat, dengan separuh membulatkan ke atas) dengan menambahkan 4 ke jumlah, lalu membaginya dengan 8 melalui bit-shift >>3.



4

C, 151 123 103 91

Membutuhkan 24 parameter yang diteruskan ke program, dalam urutan RGBRGB ... dan mengeluarkan triplet RGB tanpa baris baru.

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;{untuk menyimpan 2 byte? Juga memberi +1 untuk <3 dalam kode sumber!
betseg



1

J, 11 byte

0.5<.@++/%#

Mengambil input sebagai array 8x3 di mana setiap baris adalah nilai RGB

Penjelasan

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)

Jawaban JavaScript untuk membantu Anda memulai.

Sunting: Disimpan 11 byte berkat Dendrobium , dan 9 lainnya berkat 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]]menghasilkan 83, 125, * 104 * bukannya 83, 125, * 103 * dengan kode Anda.
user2428118

Ah, salah membaca pertanyaan, mengira itu seharusnya ceil. 64 byte:a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>(x/8).toFixed())
Dendrobium

x+4>>3harus membulatkan dengan benar.
Neil

1

Lisp - 180 179 byte

EDIT: Diformat untuk bermain golf lebih lanjut.

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

Apakah itu cara yang benar , saya kira. Belum dicoba.

  • a hanya rata-rata
  • radalah pembulatan tantangan yang tepat ini, karena Lisp roundberkeliling ke bilangan bulat genap terdekat
  • cmelakukan pekerjaan nyata, menerima input dalam format '((R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B)), dan mengembalikan '(R G B)daftar yang berisi jawaban.

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]

Menentukan prosedur anonim, yang mengharuskan input dilewatkan sebagai urutan bersarang ganda dan output sebagai array 3-elemen. Prosedur hanya dapat digunakan sebagai argumen untuk prosedur lain; untuk menguji, gunakan pembungkus berikut:

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

Urutan Nim adalah array dengan @di depan, seperti @[1, 2, 3]. Input untuk prosedur ini dapat berupa:

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

Keempat (gforth) , 65 byte

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

Cobalah online!

Mengambil input sebagai argumen stack (urutan rgb)

Penjelasan

Untuk masing-masing 3 saluran warna:

  • pindahkan semua angka saluran itu ke atas tumpukan
  • tambahkan bersama-sama
  • tambahkan 4 (untuk menangani pembulatan)
  • bagi dengan 8

Penjelasan Kode

: 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

Pesona Rahasia , 41 byte

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

Cobalah online!

Menggunakan 3 petunjuk petunjuk untuk mem-parsing input dalam urutan yang benar (karena nilai input selalu dalam urutan RGB, RGB,...) dan selama masing-masing dari ketiga IP tidak bergabung, dan jangan maju ke iperintah nput baca berikutnya terlalu dini (karenanya semua spasi), ia bekerja dan menyimpan byte karena harus terus memutar tumpukan untuk menjaga nilai yang benar di atas untuk menghitung jumlah.

Secara teknis kode ini mengandung kesalahan dalam x.5nilai pembulatan yang benar untuk beberapa input, tetapi ini disebabkan oleh metode pembulatan standar yang digunakan oleh C # , yaitu untuk membulatkan ke nomor acara terdekat, bukan ke atas dan karena masalah dalam kehilangan akurasi floating point. , dan saya tidak mengetahui masalah ini sebelum menulis jawaban ini dan memeriksa kasus uji. Ini akan diperbaiki pada bangunan mendatang , bersama dengan beberapa hal lain seperti pengecualian yang tidak ditangani ini .

Sementara itu, modifikasi ini membuat penyesuaian yang diperlukan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.