The Chameleon Challenge การเปลี่ยนสีอำพราง


19

ความท้าทายกิ้งก่าเป็นสิ่งที่ไม่ดีที่เห็นได้ชัด แย่มากกิ้งก่าเป็นสัตว์ที่สวยงาม ได้เวลาเปลี่ยนแล้ว!

รูปภาพของกิ้งก่าเปลี่ยนสี

อย่างที่เรารู้กันว่ากิ้งก่าจำนวนมากมีความสามารถที่โดดเด่นในการผสมผสานกับสภาพแวดล้อมโดยการเปลี่ยนสีผิวของพวกเขา ซึ่งยังเป็นเป้าหมายของการท้าทายนี้

ท้าทาย

ลองนึกภาพสี่เหลี่ยมจัตุรัสเก้าพิกเซล แปดพิกเซลคือสภาพแวดล้อม ที่จุดศูนย์กลางคือกิ้งก่า

แบบนี้: สี่เหลี่ยมสีเทาแปดดวงรอบจัตุรัสกลาง

กิ้งก่าจะพยายามกลมกลืนกับสภาพแวดล้อมโดยธรรมชาติ มันทำได้โดยการเปลี่ยนสีเป็นค่าเฉลี่ยของพิกเซลโดยรอบ สีเทาดังนั้นในกรณีนี้กิ้งก่าจะเปลี่ยนสีไป

วัตถุประสงค์

ให้สีของพิกเซลโดยรอบเอาท์พุทสีของกิ้งก่าเปลี่ยนสี

สีของกิ้งก่าถูกกำหนดให้เป็นผลรวมของสีแดงสีเขียวและสีน้ำเงินทั้งหมดในพิกเซล÷ 8

อินพุต

อาร์เรย์ของค่าสีสำหรับแปดพิกเซลโดยรอบเริ่มต้นที่ด้านบนซ้ายและต่อเนื่องตามเข็มนาฬิกาเช่นนี้:

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

คุณอาจเลือกที่จะรับอินพุตในรูปแบบที่แตกต่างกันตราบใดที่มันประกอบด้วยเลขทศนิยมแปดถึงแปดจำนวน 0-255

หากคุณได้รับการป้อนข้อมูลในรูปแบบที่แตกต่างกันตัวเลขต้องมีความยาวที่สอดคล้องกันหรือมีตัวคั่นที่ไม่ใช่ตัวเลขระหว่างพวกเขา อเนกประสงค์จะต้องมีตัวละครแยกเว้นแต่พวกเขาจะ 0 เบาะถึง 9 หลัก (เช่น044200255044200255044200255044200255044200255044200255044200255044200255ถูกต้องเช่นนั้น44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255 44 200 255และ44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255$44?200?255แต่4420025544200255442002554420025544200255442002554420025544200255ไม่)

เอาท์พุต

อาร์เรย์ / สตริง / ฯลฯ ที่มีสีของพิกเซลกลาง (เป็นทศนิยม) เช่นนี้

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

ในกรณีที่คุณส่งออกบางอย่างนอกเหนือจากอาเรย์: ตัวเลขต้องมีความยาวสม่ำเสมอหรือมีตัวคั่นที่ไม่ใช่ตัวเลขระหว่างพวกเขา (เช่น044200255ถูกต้องเช่นนั้นเป็น44 200 255แต่44200255ไม่ใช่)

ตัวเลขอาจไม่มีจุดทศนิยมดังนั้นเช่น44.0 200 255.0ไม่ถูกต้อง

การล้อม

ผลลัพธ์จะต้องถูกปัดเศษเป็นจำนวนเต็มที่ใกล้ที่สุด (ครึ่งหนึ่งจะต้องมีการปัดเศษขึ้น.) เช่นถ้าผลรวมของสีแดงทั้งหมดคือ1620คุณต้องส่งออก203ไม่ได้หรือ202202.5

ตัวอย่าง

รูปภาพใช้สำหรับเป็นภาพประกอบเท่านั้น พิกเซลกลางคือเอาต์พุต, พิกเซลรอบข้างคืออินพุต

การป้อนข้อมูล:

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

เอาท์พุท:

[200,200,200]


การป้อนข้อมูล:

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

เอาท์พุท:

[128,128,128]


การป้อนข้อมูล:

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

เอาท์พุท:

[83,125,103]


การป้อนข้อมูล:

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

เอาท์พุท:

[45,65,85]

การส่งสามารถเป็นโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น ใช้I / Oมาตรฐานและกฎของช่องโหว่


13
ค่าเฉลี่ยของสีที่ไม่ได้เป็นค่าเฉลี่ยของค่า RGB ของพวกเขา
Leun Nun

@LeakyNun ขอบคุณสำหรับลิงค์ มันจะไม่สำคัญสำหรับความท้าทายนี้ แต่ฉันจะระลึกไว้เสมอว่าฉันควรทำสิ่งที่คล้ายกันในอนาคต
user2428118

9
สนุกพอฉันคิดว่านี่เป็นคำถามเกี่ยวกับกิ้งก่าสำหรับจัดการปัดเศษ
xnor

"ตราบใดที่มันประกอบด้วยเลขฐานสิบแปดแปดเลข 0-255" มันสามารถเป็นเลขฐานสองได้หรือไม่? เอก?
Leun Nun

นอกจากนี้ฉันสามารถขนย้ายได้ล่วงหน้าหรือไม่
Leun Nun

คำตอบ:


8

MATL, 8 4 ไบต์

YmYo

ลองออนไลน์!

บันทึกได้ 4 ไบต์ด้วยบีกเกอร์!

คำอธิบาย:

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

ฉันชอบการละเมิดไวยากรณ์ของหลามอาเรย์! คุณสามารถแทนที่s8/ด้วยXm(เช่นmeanลงคอลัมน์) นอกจากนี้คุณอาจระบุอินพุตเป็น3 x 8เริ่มต้นและกำจัด3e!
Suever

ใช่YmYoควรทำ ... แค่รับอินพุตเหมือนกับ[[R,G,B];[R,G,B];...]เครื่องหมายอัฒภาคระหว่างแถว RGB
บีกเกอร์

@beaker Woah! ขอบคุณ!
DJMcMayhem

ไม่Yoขึ้นรอบหรือรอบที่อยู่ใกล้มีความสัมพันธ์ที่ถูกปัดเศษขึ้น? ความท้าทายต้องการหลัง
John Dvorak

@JanDvorak มันปัดเศษเป็นจำนวนเต็มที่ใกล้ที่สุด (ขึ้นหรือลง) matl.tryitonline.net/…
Suever

11

Python ขนาด 38 ไบต์

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

รอบเฉลี่ย (ต่อเต็มที่ใกล้เคียงที่สุดกับครึ่งปัดเศษขึ้น) โดยการเพิ่ม 4 ผลรวมแล้วพื้นหารด้วย 8 >>3ผ่านบิตกะ



4

C, 151 123 103 91

ต้องการ 24 พารามิเตอร์ที่ส่งผ่านไปยังโปรแกรมตามลำดับ RGBRGB ... และส่งออก triplet RGB โดยไม่ต้องขึ้นบรรทัดใหม่

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 ไบต์? +1 ด้วยสำหรับ <3 ในซอร์สโค้ด!
betseg



1

J, 11 ไบต์

0.5<.@++/%#

รับอินพุตเป็นอาร์เรย์ 8x3 โดยที่แต่ละแถวเป็นค่า RGB

คำอธิบาย

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 ไบต์

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

คำตอบ JavaScript เพื่อให้คุณเริ่มต้น

แก้ไข:บันทึกไว้ 11 ไบต์ขอบคุณที่กล้วยไม้สกุลหวายและอีก 9 ขอบคุณที่นีล


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]]ให้ผล83, 125, * 104 *แทน83, 125, * 103 *ด้วยรหัสของคุณ
user2428118

อ่าอ่านคำถามผิดคิดว่าควรจะceilเป็น 64 bytes:a=>a.reduce((p,c)=>p.map((e,i)=>e+c[i])).map(x=>(x/8).toFixed())
Dendrobium

x+4>>3ควรปัดเศษให้ถูกต้อง
Neil

1

Lisp - 180 179 ไบต์

แก้ไข: จัดรูปแบบสำหรับการเล่นกอล์ฟต่อไป

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

ฉันคิดว่ามันเป็นวิธีที่ถูกต้องหรือไม่ ยังไม่ทดลอง

  • a เป็นเพียงค่าเฉลี่ย
  • rการปัดเศษที่เหมาะสมของความท้าทายนี้คือเนื่องจาก Lisp roundปัดเศษเป็นจำนวนเต็มคู่ที่ใกล้เคียงที่สุด
  • cใช้งานได้จริงป้อนข้อมูลในรูปแบบ '((R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B) (R G B))และส่งคืน'(R G B)รายการที่มีคำตอบ

1

นิม , 134 126 115 108 78 ไบต์

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

กำหนดโพรซีเดอร์ที่ไม่ระบุชื่อซึ่งต้องการอินพุตที่ส่งผ่านเป็นลำดับซ้อนสองครั้งและเอาต์พุตเป็นอาร์เรย์ 3 องค์ประกอบ กระบวนการนี้สามารถใช้เป็นอาร์กิวเมนต์สำหรับกระบวนการอื่นเท่านั้น ในการทดสอบใช้ 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])

ลำดับนิ่มเป็นอาร์เรย์ที่มีในหน้าเช่น@ @[1, 2, 3]การป้อนเข้าสู่โพรซีเดอร์นี้จึงอาจเป็น:

@[@[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 ไบต์

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

ลองออนไลน์!

รับอินพุตเป็นอาร์กิวเมนต์สแต็ก (ลำดับ rgb)

คำอธิบาย

สำหรับแต่ละช่อง 3 สี:

  • ย้ายหมายเลขทั้งหมดของช่องนั้นไปยังด้านบนสุดของสแต็ก
  • เพิ่มเข้าด้วยกัน
  • เพิ่ม 4 (เพื่อจัดการการปัดเศษ)
  • หารด้วย 8

รหัสคำอธิบาย

: 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

เวทมนตร์รูน 41 ไบต์

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

ลองออนไลน์!

ใช้พอยน์เตอร์คำสั่ง 3 ตัวเพื่อแยกวิเคราะห์อินพุตในลำดับที่ถูกต้อง (เนื่องจากค่าอินพุตอยู่ในลำดับเสมอRGB, RGB,...) และตราบใดที่ IP ทั้งสามตัวไม่รวมกันและไม่เลื่อนไปที่iคำสั่งอ่านnput ถัดไปเร็วเกินไป (ด้วยเหตุนี้ช่องว่างทั้งหมด) มันทำงานออกมาและบันทึกเป็นไบต์โดยไม่ต้องหมุนกองซ้อนอย่างต่อเนื่องเพื่อให้ค่าที่ถูกต้องอยู่ด้านบนเพื่อคำนวณผลรวม

ในทางเทคนิครหัสนี้มีข้อผิดพลาดในการปัดเศษx.5ค่าอย่างถูกต้องสำหรับอินพุตบางตัว แต่นี่เป็นเพราะวิธีการปัดเศษเริ่มต้นที่ใช้โดย C #ซึ่งจะปัดเศษเป็นหมายเลขเหตุการณ์ที่ใกล้ที่สุดแทนที่จะขึ้นไปและเกิดจากปัญหาการสูญเสียความแม่นยำ และฉันไม่รู้เรื่องนี้ก่อนที่จะเขียนคำตอบและตรวจสอบกรณีทดสอบ สิ่งนี้จะได้รับการแก้ไขในการสร้างในอนาคตพร้อมกับสิ่งอื่น ๆ เช่นข้อยกเว้นที่ไม่สามารถจัดการได้

ในระหว่างนี้การปรับเปลี่ยนนี้จะทำการปรับเปลี่ยนที่จำเป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.