ตกแต่งไฟที่ไม่มีรสนิยม


22

ความท้าทายนี้เป็นเกียรติของไฟคริสต์มาสที่ไม่มีรสนิยมที่บ้านของฉันในกฎหมาย


ความท้าทายคือการสร้างเอาต์พุตกราฟิกที่แสดงการตกแต่งใน "เวลาจริง"

วิดีโอ (gif หรือรูปแบบอื่น ๆ ) จะมี"ไฟ" ในแนวตั้งและแนวนอนแบบn-by-m 5 <= m, n <= 40 ขนาดเฟรมและความละเอียดอาจแตกต่างกันไปขึ้นอยู่กับn และmแต่ต้องมีอย่างน้อย50x50พิกเซลสำหรับn, m = 5 (กราฟิกแบบเวกเตอร์ตกลง) รูปภาพที่มีn=6และm=5จะมีลักษณะดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่


การตกแต่ง:

สี:

ไฟทุกดวงจะมีหนึ่งต่อไปนี้ 6 RGB สี{255,0,0}, {0,255,0}, {0,0,255}, {255,255,0}, และ{0,255,255}{255,0,255}

ภาพเคลื่อนไหว:

  • nและmจะถูกนำไปเป็นข้อมูลป้อนเข้าในรูปแบบที่เหมาะสมและตามลำดับที่คุณต้องการ
  • ภาพจะเปลี่ยนทุกdt = 25 msๆ การเบี่ยงเบนไม่เป็นไรถ้าเป็นเพราะ "ปัจจัยภายนอก" เช่นข้อ จำกัด ในล่ามคอมพิวเตอร์ช้า ฯลฯ
    • หากไม่สามารถกำหนดขั้นตอนเวลาด้วยตนเองได้จะยอมรับขั้นตอนเวลาเริ่มต้น
  • ไฟทั้งหมดจะเป็นสีแดง ( {255,0,0}) t=0ที่
  • มีโอกาส 5% ที่แสงแรก (ซ้ายบน) จะเปลี่ยนสี สีทั้งหมด (ยกเว้นสีที่มีอยู่ในปัจจุบัน) ควรมีโอกาสเท่ากัน
  • แสงแต่ละอัน (ยกเว้นอันแรก) จะได้สีของแสงไปทางซ้าย หากแสงอยู่ทางด้านซ้ายสุดมันจะได้สีของแสงที่อยู่ทางขวาสุดของแถวด้านบน ไฟจะมีหมายเลขตามที่แสดงด้านล่าง จำนวนแสงจะได้รับสีของจำนวนแสงkk-1

     1  2  3  4  5  6
     7  8  9 10 11 12
    13 14 15 16 17 18
    
  • ผลลัพธ์ในทางทฤษฎีควรดำเนินต่อไปเรื่อย ๆ (ยกเว้นว่าภาษา / ล่ามของคุณมีข้อ จำกัด บางประการที่ป้องกันไม่ให้เกิดสิ่งนี้)

  • โปรดให้ตัวอย่างอย่างน้อย 5 วินาทีโดยเฉพาะอย่างยิ่งในคำตอบ (นี่คือการให้กำลังใจไม่ใช่ข้อกำหนด) (ลิงก์ไปยัง TIO หรือเทียบเท่าก็เหมือนกันตกลงเช่นกัน: D)
  • เฟรม, แกน, เส้นกริด ฯลฯ ได้รับการยอมรับ

6 คูณ 5

ป้อนคำอธิบายรูปภาพที่นี่

15 โดย-30

ป้อนคำอธิบายรูปภาพที่นี่


หากล่ามช้าควรปรับเวลาหยุดชั่วคราวดังนั้นเวลารวมระหว่างการอัพเดตภาพจะคล้ายกับในตัวอย่าง? ถ้าไม่ต้องการหยุดชั่วคราว (รหัสช้าพอแล้ว)? นั่นอาจช่วยประหยัดไบต์อาจขัดกับจิตวิญญาณของความท้าทาย
Luis Mendo

1
เนื่องจากคุณเลือกสีเพื่อความสะดวกในการติดตั้ง - ในภาษาอย่าง QBasic ที่มีชุดสีในตัว จำกัด คุณสามารถใช้สีที่ใกล้เคียงที่สุดกับสีที่คุณระบุหรือไม่? (สีแดง, เขียว, น้ำเงิน, เหลือง, ฟ้า, ม่วงแดง)
DLosc

ถ้ามันเป็นไปไม่ได้ที่จะใช้สีที่ระบุแล้วใช่มันก็โอเคที่จะใช้ทางเลือกที่ใกล้เคียงที่สุด ถ้ามันอีกสักหน่อยก็ไม่ r,g,y,b,ฯลฯ มีขนาดสั้นลงในหลายภาษา
Stewie Griffin

@LuisMendo ขอโทษสำหรับการตอบกลับล่าช้า ฉันชอบวิธีที่คุณทำในคำตอบของคุณ มันจะโอเคที่จะใช้ 25 ms แม้ว่ามันจะทำให้แอนิเมชั่นช้าลง ฉันหลีกเลี่ยงdrawnowเมื่อฉันใช้สิ่งนี้ใน MATLAB เนื่องจากผลลัพธ์ช้าเกินไป ฉันคิดว่าคำตอบต้องเป็น: หากเป็นตัวเลือกการออกแบบที่ล่ามมีความละเอียดเวลาต่ำสุดคงที่> = 25 ms ก็ถือว่าใช้ได้ ถ้ามันเกิดจากการใช้งานที่ไม่ดี / เรียบง่ายล่ามออนไลน์ที่มีการโหลดมากเกินไป / ช้าเป็นต้นดังนั้นจึงไม่เป็นไร
Stewie Griffin

1
@Stewie เข้าใจแล้วขอบคุณ และความท้าทายที่ดี!
Luis Mendo

คำตอบ:


6

JavaScript / CSS / HTML, 436 ไบต์

b="red"
f=_=>{o.textContent='';o.style.width=w.value*10+"px";o.style.height=h.value*10+"px"}
setInterval(_=>o.insertBefore(document.createElement("s"),o.firstChild).style.background=b=["red","yellow","lime","aqua","blue","fuchsia"][Math.random()*100|0]||b,25)
#o{overflow:hidden;background:red}s{display:block;float:left;width:10px;height:10px}
<div oninput=f()><input id=h type=number min=1><input id=w type=number min=1></div><div id=o>


6

Mathematica, 186 161 158 bytes

(b=Table[{1,0,0},1##];Dynamic@Image[Partition[Pause@.025;If[Random[]<.06,b[[1]]={1,1,0,0}~RandomSample~3];b=RotateRight@b;b[[1]]=b[[2]];b,#],ImageSize->50#])&

คำอธิบาย

b=Table[{1,0,0},1##];

สร้างบอร์ดเริ่มต้นใน 1D เต็มไปด้วยสีแดง bเก็บไว้ในที่

Pause@.025

หยุดชั่วคราวเป็นเวลา 25 มิลลิวินาที

If[Random[]<.06,b[[1]]={1,1,0,0}~RandomSample~3]

ถ้า (หลอก) จำนวนจริงสุ่มน้อยกว่า 0.06 เปลี่ยนองค์ประกอบแรกของbที่มีความยาวตัวอย่างสุ่มของรายการ3 {1,1,0,0}(เช่นหนึ่งในใด ๆ{1, 1, 0}, {1, 0, 1}, {1, 0, 0}, {0, 1, 1}, {0, 1, 0}, {0, 0, 1})

b=RotateRight@b

วงกลมหมุนไปทางขวา

b[[1]]=b[[2]]

เปลี่ยนค่าเซลล์แรกเป็นค่าเซลล์ที่สอง (เช่นเลิกทำการเปลี่ยนเซลล์แรก)

Partition[ ... ;b,#]

แบ่งพาร์ติชันbเป็น (ความสูง)

Dynamic@Image[ ... ,ImageSize->50#]

ทำให้เป็นภาพไดนามิก (อัปเดตตลอดเวลา) ซึ่งมีความกว้าง 50 (ความกว้าง)

รุ่นเซลลูลาร์อัตโนมัติ (186 ไบต์)

(b=Table[{1,0,0},1##];Dynamic@Image[Partition[Pause@.025;If[Random[]<.06,b[[1]]={1,1,0,0}~RandomSample~3];i=2;b={#[[2-Boole[i--<0],2]]&,{},{1,1}}~CellularAutomaton~b,#],ImageSize->50#])&

เอาต์พุตตัวอย่าง (อินพุต: 16, 10)

ป้อนคำอธิบายรูปภาพที่นี่


6

MATLAB, 255 210 ไบต์

นี่เป็นสนามกอล์ฟครั้งแรกของฉันดังนั้นอาจมีการปรับปรุงให้ดีขึ้น

ขอบคุณ Luis ที่ช่วยฉันประหยัด 45 ไบต์ :)

function f(n,m)
c=dec2bin(1:6)-48;r=1;p=c(r,:);x=zeros(1,n*m,3);x(:,:,1)=1;while 1
x=circshift(x,[0,1,0]);if rand>0.94;r=randi(6);end
x(1,1,:) = c(r,:);imagesc(permute(reshape(x,n,m,3),[2 1 3]));pause(1/40);end

คำอธิบาย:

c=dec2bin(1:6)-48  % c is the colormap
r=1;p=c(r,:);                % p is color number r (starting at 1) from the colormap c
x=zeros(1,n*m,3);x(:,:,1)=1; % 2D matrix in the third dimension. The first layer is 1
while 1                      % while true
x=circshift(x,[0,1,0]);      % shift the vector horizontally along the second dimension
if rand()>0.94;              % 5 percent chance of changing color
k=randperm(6);k=k(k~=r);r=k(1); % Create a vector with color numbers 1..6. Discard the current color, and choose the first color
x(1,1,:) = c(r,:);           % The first light gets color number r
imagesc(permute(reshape(x,n,m,3),[2 1 3]));  % Reshape the vector so that it's a 3D matrix
% Permute it so that the dimensions are correct
% Use imagesc to display
pause(1/40)  % 0.025 seconds pause

น่าเสียดายที่นี่ไม่ได้บันทึกอนิเมชั่น imwriteเพื่อที่จะบันทึกไว้ฉันอาจต้องใช้โปรแกรมจับภาพหน้าจอหรือเขียนมันทั้งหมดที่ใช้ แต่ฉันจะให้สองภาพที่แสดงเวลาต่างกันn=15,m=30แทน

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


1
บางข้อเสนอแนะการเล่นกอล์ฟ: แทนdec2bin([4 2 1 6 3 5])-48 แทน นอกจากนี้คุณยังสามารถแทนที่โดยและกำจัด(เพราะ 0.94 + 0.06 / 6 = 0.95 ดูคำตอบของฉันสำหรับคำอธิบายรายละเอียดเพิ่มเติม)[1 0 0;0 1 0;0 0 1;1 1 0; 0 1 1;1 0 1].950.95.95.94k=k(k~=r);
หลุยส์ Mendo

1
ยังดีกว่าc=dec2bin(1:6)-48ตามคำสั่งไม่สำคัญ
Luis Mendo

คำตอบแรกที่ดี! แต่ฉันกลัวฉันได้outgolfed คุณได้ถึง 40%
Sanchises

Golfed มันลงเล็กน้อย :) ขอบคุณสำหรับความช่วยเหลือ Luis ! :) Sanchises ทำได้ดีมาก!
CG

4

MATL , 52 47 ไบต์

6:BoHZGKipY"`tGe!2YG50Yr3>?t1)}6Yr]0(1YS.015Y.T

[ncols nrows]การป้อนข้อมูลเป็นอาร์เรย์ เอาท์พุทเป็นรูปที่มีกราฟิกแบบเวกเตอร์

ตัวอย่างเรียกใช้ 15 แถว× 10 แถว:

ป้อนคำอธิบายรูปภาพที่นี่

มันทำงานอย่างไร

เวลาหยุดชั่วคราวตั้งไว้ที่ 15 ms (สำหรับจำนวนไบต์เดียวกันกับ 25 ms) เพื่อลองชดเชยเวลาประมวลผล

เพื่อให้สีมีความน่าจะเป็น 19/20 (เปลี่ยนเป็น 1/20) เราดำเนินการดังนี้:

  • ด้วยความน่าจะเป็น 47/50 เราคงสีไว้
  • ด้วยความน่าจะเป็น 3/50 เราจึงเลือกสีใหม่อย่างสม่ำเสมอใน 6 สี อาจเกิดขึ้นได้ว่าสี "ใหม่" นั้นเหมือนกันกับสีเก่าและเกิดขึ้นกับความน่าจะเป็น 1/6

ดังนั้นความน่าจะเป็นในการรักษาสีคือ 47/50 + 3 / (50 * 6) = 19/20

6:        % Push [1 2 3 4 5 6]
B         % Convert to binary. This gives a 6×3 matrix, where each row 
          % corresponds to a number. First row is [0 0 1] (blue), second is
          % [0 1 0] (green), etc
o         % Convert to double
HZG       % Set as colormap (creates a figure)
K         % Push 4
i         % Take input array
p         % Product of array. This gives the total number of squares
Y"        % Repeat 4 that many times. This gives a row vector representing the
          % image. The initial value, 4, corresponds to red in the colormap
`         % Do...while
  t       %   Duplicate
  Ge      %   Reshape to size given by the input. Gives a matrix where each
          %   entry  will be interpreted as a pointer to the colormap
  !       %   Transpose. This is required because the color shifting will be
          %   done in column-major order: down, then across; whereas we want
          %   the opposite
  2YG     %   Show matrix as image using the defined colormap
  50Yr    %   Push a uniformly distributed random integer between 1 and 50
  3>      %   True if greater than 3. This happens with probability 47/50
  ?       %   If true
    t1)   %     Duplicate and get first entry (to repeat the first color)
  }       %   Else
    6Yr   %     Push a uniformly distributed random integer between 1 and 6.
          %     This is the new color (possibly the same as the old)
  ]       %   End
  0(      %   Assign that color (repeated or new) to the last entry of the row
          %   vector representing the image
  1YS     %   Circularly shift to the right. The last value becomes the first
 .015Y.   %   Pause 0.015 ms
 T        %   Push true
          % End (implicit). Since the top of the stack is true, this creates
          % an infinite loop

3

MATLAB, 153 147 ไบต์

หมายเหตุ : GIF ที่แสดงเป็นของรุ่นเก่าซึ่งเป็นสิ่งที่ดีที่มันไม่ได้แสดงแกน (ดูแก้ไขประวัติ) แต่ก็มากimshowช้าเนื่องจากการดำเนินงานของ สำหรับเวอร์ชั่นปัจจุบันคำตอบ MATLAB ของ Chelsea G.หรือคำตอบ MATLAB ของLuis Mendoแสดงผลลัพธ์เดียวกันกับเวอร์ชันปัจจุบันของฉัน

ขนาดจะถูกนำมาเป็น2x1เวกเตอร์ดังนั้นจึงเรียกเช่น:

>> l([5 5])

function l(s)
c=eye(3);x=eye(s);while 1
a=rand>.94;x=[a*randi(6)+~a*x(1),x(1:end-1)];imagesc(reshape(x,s)',[1,6]);colormap([c;1-c])
pause(.025)
end

คำตอบนี้ใช้ประโยชน์จากรายละเอียดปลีกย่อยของภาษา MATLAB ตัวอย่างเช่นxinitalized เป็นm x nศูนย์เมทริกซ์ แต่สิ่งที่เรียกว่าการจัดทำดัชนีเชิงเส้นช่วยให้การขยับแบบวงกลมด้วยดัชนี 1 มิติ การพิมพ์ที่อ่อนแอช่วยให้สามารถคูณด้วยตรรกะได้ดังนั้นจึงifหลีกเลี่ยงคำสั่ง (เคล็ดลับที่ฉันใช้อย่างหนักในสมัยของการเขียนโปรแกรมในเครื่องคิดเลข TI-84) แม้ว่าตารางสีจะถูกอ่านแบบแถวกัน แต่ MATLAB ถือว่าเป็นเมทริกซ์ปกติดังนั้นจึงeye(3)สามารถใช้ในการสร้างสีแดงสีเขียวและสีน้ำเงินและ1-eye(3)อีกสามสี ง่ายนำกลับเวกเตอร์เชิงเส้นในรูปแบบเมทริกซ์ซึ่งเป็นแมปกับสีที่ต้องการใช้reshape ind2rgbสุดท้ายimagesc, แสดงภาพ, แสดงที่ขนาดรูปเริ่มต้น (ซึ่งมีขนาดใหญ่พอสำหรับความต้องการ) เป็นโชคจะมีมันimagescไม่ทราบค่าที่อยู่นอกช่วงที่ระบุดังนั้นeyeสามารถใช้ในการเริ่มต้นเมทริกซ์ตั้งแต่ทั้งสอง1และ0ถือว่าเป็นสีแดง

ป้อนคำอธิบายรูปภาพที่นี่


1
โอ๊ะลืมลงคะแนนให้คุณ ... ฉันชอบลูกเล่นเล็ก ๆ ของคุณ :-)
CG

ถูกต้องหรือไม่ที่สีแบบสุ่มจะไม่เป็นสีแดงในเวอร์ชันที่อัพเดต? ดูเหมือนว่าใน Octave อย่างน้อยที่สุด (ไม่มี MATLAB)
Stewie Griffin

@StewieGriffin ฉันต้องนอนเมื่อฉันทำสิ่งนี้ แน่นอนว่าคุณเป็นคนที่สมบูรณ์แบบ - และมันช่วยฉันด้วยเช่นกัน ...
Sanchises

(ทำสองไบต์นั้น)
Sanchises

2

Python 3.6 (316 ไบต์)

การใช้รหัสสี ANSI และตัวอักษรสตริงที่จัดรูปแบบใหม่ของ Python 3.6 ( PEP 489 ) ( f"{X}"เวทมนต์)

ไม่อย่างนั้นมันก็แค่พื้นฐานธรรมดา แต่ก็เป็นงูหลามที่ทำให้งง ความกว้างและความสูงจะถูกส่งผ่านเป็นอาร์กิวเมนต์ในบรรทัดคำสั่ง

import random as n,time,sys
r=range
X="\x1b["
C=[f"{X}1;4{x}m " for x in r(1,7)]
w,h=list(map(int,sys.argv[1:]))
a=[C[0]for i in r(w*h)]
while 1:
 print(f"{X}0m{X}2J{X}f");f=a[0];a.pop();a[:0]=n.choice([x for x in C if x!=f])if n.random()<=.05 else f,
 for i in r(0,h*w,w):print(*a[i:i+w],sep="")
 time.sleep(.025)

ป้อนคำอธิบายรูปภาพที่นี่


คุณสามารถสำรองได้ 6 ไบต์โดยการใช้w,h=map(int,sys.argv[1:])การแกะการทำงานกับ iterable ใด ๆ (ขนาดที่เหมาะสม) การโทรไปยังรายการนั้นไม่จำเป็น
Sebastian Riese

อีกไม่กี่ไบต์: "\x1b["=> "\33["(ใช้ฐานแปดแทนการหลบหนีฐานสิบหก) จากนั้นตัวย่อ X และสตริงการจัดรูปแบบจะทำให้มันยาวขึ้นจริงf""ๆ (สิ่งนี้จะลดขนาดลงเป็น 301 ไบต์)
Sebastian Riese

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