चेतन प्रकाश सजावट से निपटने


22

यह चुनौती मेरे ससुराल में क्रिसमस की रोशनी से निपटने के लिए है।


चुनौती "वास्तविक समय" में सजावट दिखाते हुए एक चित्रमय आउटपुट बनाने की है।

वीडियो (gif या अन्य प्रारूप) में n-by-m वर्टिकल और क्षैतिज "लाइट्स" होंगे। 5 <= एम, एन <= 40 । फ़्रेम का आकार और रिज़ॉल्यूशन n और m पर निर्भर हो सकता है , लेकिन n, m = 5 (वेक्टर ग्राफिक्स ठीक है) के लिए कम से कम 50x50 पिक्सेल होना चाहिए । एक चित्र और कुछ इस तरह दिखेगा:n=6m=5

यहां छवि विवरण दर्ज करें


सजावट:

रंग की:

सभी रोशनी निम्नलिखित 6 आरजीबी-रंगों में से एक होगा {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% संभावना है कि पहला प्रकाश (ऊपर-बाएं) रंग बदल देगा। सभी रंग (वर्तमान में जो रंग है उसे छोड़कर) समान रूप से संभावना होनी चाहिए।
  • प्रत्येक प्रकाश (पहले को छोड़कर) को प्रकाश का रंग उसके बाईं ओर मिलेगा। यदि प्रकाश बाईं ओर है, तो यह ऊपर की पंक्ति पर दाईं ओर प्रकाश का रंग प्राप्त करेगा। रोशनी को नीचे दिखाए गए अनुसार दर्शाया गया है। लाइट नंबर kको लाइट नंबर का रंग मिलेगा k-1

     1  2  3  4  5  6
     7  8  9 10 11 12
    13 14 15 16 17 18
    
  • आउटपुट को सिद्धांत रूप में हमेशा के लिए चलना चाहिए (जब तक कि आपकी भाषा / दुभाषिया में कुछ सीमा न हो जो इसे रोकती है)।

  • कृपया कम से कम 5 सेकंड का एक नमूना प्रदान करें, अधिमानतः उत्तर में अधिक (यह एक प्रोत्साहन है, आवश्यकता नहीं)। (टीआईओ या इसी तरह की एक कड़ी बिल्कुल ठीक है: डी)
  • फ्रेम, कुल्हाड़ियों, ग्रिड लाइनों आदि को स्वीकार किया जाता है।

6 बटे 5

यहां छवि विवरण दर्ज करें

15-बटा 30

यहां छवि विवरण दर्ज करें


यदि दुभाषिया धीमा है, तो ठहराव समय समायोजित किया जाना चाहिए ताकि छवि अपडेट के बीच कुल समय उदाहरणों में समान हो? क्या होगा यदि ठहराव की आवश्यकता नहीं है (कोड पहले से ही काफी धीमा है)? यह बाइट्स को बचाएगा, शायद चुनौती की भावना के खिलाफ
लुइस मेंडो

1
चूंकि आपने कार्यान्वयन में आसानी के लिए रंगों को चुना है - QBasic जैसी भाषाओं में जिनके पास रंगों का एक सीमित बिल्ट सेट है, क्या यह आपके द्वारा निर्दिष्ट लोगों के लिए निकटतम उपलब्ध रंगों का उपयोग करने के लिए स्वीकार्य है? (लाल, हरा, नीला, पीला, सियान, मैजेंटा)
DLosc

यदि निर्दिष्ट रंगों का उपयोग करना असंभव है तो हां, निकटतम विकल्पों का उपयोग करना ठीक है। अगर यह थोड़ा लंबा है तो नहीं। r,g,y,b,आदि कई भाषाओं में छोटे हैं।
स्टीवी ग्रिफ़िन

@LuisMendo, देर से जवाब के लिए माफी माँगता हूँ। मुझे आपके जवाब में जिस तरह से किया गया, वह पसंद है। 25 एमएस का उपयोग करना ठीक होगा, भले ही वह एनीमेशन धीमा कर देगा। drawnowजब मैंने MATLAB में इसे लागू किया तो मैं इससे बच गया , क्योंकि परिणाम बहुत धीमा था। मुझे लगता है कि उत्तर होना चाहिए: यदि यह एक डिजाइन विकल्प है कि दुभाषिया का निश्चित न्यूनतम समय संकल्प = = 25 एमएस है तो यह ठीक है। यदि यह खराब / सरल कार्यान्वयन के कारण है, तो एक ऑनलाइन दुभाषिया जो अतिभारित / धीमा है आदि तो यह ठीक नहीं है।
स्टीवी ग्रिफिन

1
@ स्टेवी समझ गया, धन्यवाद। और अच्छी चुनौती!
लुइस मेंडो

जवाबों:


6

जावास्क्रिप्ट / सीएसएस / एचटीएमएल, 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

गणितज्ञ, 186 161 158 बाइट्स

(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##];

1 डी में प्रारंभिक बोर्ड बनाएं, लाल रंग से भरा हुआ। इसमें स्टोर करें b

Pause@.025

25ms के लिए रोकें

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 बाइट्स

यह मेरा पहला गोल्फ है, इसलिए इसमें सुधार किए जाने की संभावना है।

लुइस को 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बजाय [1 0 0;0 1 0;0 0 1;1 1 0; 0 1 1;1 0 1].95के बजाय 0.95। तुम भी बदल सकते हैं .95द्वारा .94और से छुटकारा पाने के k=k(k~=r);लिए (क्योंकि 0.94 + 0.06 / 6 = 0.95; एक अधिक विस्तृत विवरण के लिए मेरा उत्तर देखें)
लुइस Mendo

1
बेहतर है अभी तक, c=dec2bin(1:6)-48जैसा कि आदेश से कोई फर्क नहीं पड़ता
लुइस मेंडू

अच्छा पहला जवाब! हालांकि, मुझे डर है कि मैंने आपको 40% तक पछाड़ दिया है
Sanchises

यह थोड़ा नीचे गिरा दिया :) मदद के लिए धन्यवाद लुइस। ! :) अच्छी तरह से किया Sanchises!
सी.जी.

4

MATL , 52 47 बाइट्स

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

इनपुट एक सरणी है [ncols nrows]। आउटपुट वेक्टर ग्राफिक्स के साथ एक आकृति है।

15 कॉल × 10 पंक्तियों के लिए उदाहरण रन:

यहां छवि विवरण दर्ज करें

यह काम किस प्रकार करता है

प्रसंस्करण समय के लिए क्षतिपूर्ति करने के लिए प्रयास करने के लिए ठहराव का समय 15 एमएस (25 बाइट के रूप में एक ही बाइट के लिए) निर्धारित किया गया है।

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 बाइट्स

नोट : जीआईएफ दिखाया गया पुराने संस्करण का है, जो अच्छा है क्योंकि यह कुल्हाड़ियों को प्रदर्शित नहीं करता है (इतिहास संपादित करें देखें), लेकिन लागू होने के कारण बेहद धीमा था imshow। वर्तमान संस्करण के लिए, चेल्सी जी का MATLAB उत्तर या लुइस मेंडो का MATL उत्तर मेरे वर्तमान संस्करण के समान परिणाम दिखाता है।

आकार को एक 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 भाषा की सूक्ष्मता का शोषण करता है। उदाहरण के लिए, xएक m x nशून्य मैट्रिक्स के रूप में जन्मजात है , लेकिन तथाकथित रैखिक अनुक्रमण 1-आयामी सूचकांकों के साथ परिपत्र स्थानांतरण के लिए अनुमति देता है। कमजोर टाइपिंग तार्किकों के साथ गुणा करने की अनुमति देता है, ताकि ifबयानों से बचा जा सके (एक ट्रिक जिसे मैंने TI-84 कैलकुलेटर पर प्रोग्रामिंग के दिनों में वापस इस्तेमाल किया था)। भले ही एक कॉलॉर्मप पंक्ति-वार पढ़ा जाता है, MATLAB इसे एक सामान्य मैट्रिक्स के रूप में मानता है, ताकि eye(3)इसका उपयोग लाल, हरा और नीला और 1-eye(3)अन्य तीन रंगों को बनाने के लिए किया जा सके । एक सरल reshapeलीनियर वेक्टर को मैट्रिक्स रूप में वापस लाता है, जिसका उपयोग करके वांछित रंगों में मैप किया जाता हैind2rgb । आखिरकार,imagesc, छवि दिखाता है, डिफ़ॉल्ट आकृति आकार में दिखाया गया है (जो आवश्यकताओं के लिए काफी बड़ा है)। जैसा कि भाग्य में होता है, imagescमानों को निर्दिष्ट सीमा से बाहर होने का मन नहीं करता है, इसलिए eyeमैट्रिक्स को शुरू करने के लिए इस्तेमाल किया जा सकता है 1और दोनों 0को लाल माना जाता है।

यहां छवि विवरण दर्ज करें


1
उफ़, आप को उभारना भूल गए ... मुझे आपकी सभी छोटी-छोटी तरकीबें पसंद हैं :-)
सीजी।

क्या यह सही है कि अद्यतन संस्करण में यादृच्छिक रंग कभी लाल नहीं होता है? ऐसा लगता है कि ऑक्टेव में कम से कम (MATLAB नहीं है)।
स्टीवी ग्रिफिन

@StewieGriffin जब मैंने इसे बनाया है तो मुझे नींद आ रही होगी। आप निश्चित रूप से बिल्कुल सही हैं - और इसने मुझे एक बाइट भी बचा
ली है

(उस दो बाइट्स बनाते हैं)
Sanchises

2

अजगर 3.6 (316 बाइट्स)

ANSI रंग कोड और पायथन 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:]), किसी भी चलने योग्य (सही आकार के) के साथ अनपैकिंग काम करता है, सूची में कॉल शानदार है।
सेबेस्टियन रिसे

एक और कुछ बाइट नीचे: "\x1b["=> "\33["(हेक्स भागने के बजाय ऑक्टल का उपयोग करके), फिर एक्स संक्षिप्त नाम और प्रारूप के तार वास्तव में इसे लंबा बनाते हैं (और इससे छुटकारा पाने से f""आपको किसी भी python3 के साथ संगतता मिलती है)। (यह इसे 301 बाइट्स तक नीचे लाएगा)।
सेबेस्टियन रिसे

उफ़, आप {x}एक बार उपयोग करते हैं ... लेकिन आप अभी भी छुटकारा पाने के साथ जीतते हैं X
सेबेस्टियन रिसे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.