मतलाब 171 बाइट्स
इनपुट 2d मैट्रिक्स होना चाहिए, इसलिए आप इसे कॉल करेंगे c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(अर्धविराम एक नई पंक्ति शुरू करें)। यह फ़ंक्शन केवल सभी संभावित चालों को सीमित करता है, इसलिए हमें एक रनटाइम मिलता है O(2^(n^2))
।
कैसे किया जाता है
यह उसी आकार के एक और मैट्रिक्स को भरने के लिए सभी संभावित तरीकों को चुनकर किया जाता है और शून्य के साथ, यह मूल रूप से बाइनरी विच में गिना जाता है जहां मैट्रिक्स का प्रत्येक प्रवेश 2 की एक निश्चित शक्ति का प्रतिनिधित्व करता है।
फिर हम उन कोशिकाओं पर चाल करते हैं जो 1 हैं, यह आकार 1xn और nx1 वाले लोगों के वेक्टर के साथ दो दो आयामी कनवल्शन के योग (मॉड 2) द्वारा किया जाता है।
अंत में हम तय करते हैं कि क्या उन चालों ने सभी प्रविष्टियों पर मानक विचलन की गणना करके वास्तव में वांछित परिणाम का उत्पादन किया है। यदि सभी प्रविष्टियाँ समान हैं, तो मानक विचलन केवल शून्य है। और जब भी हमें वास्तव में वांछित परिणाम मिला, हम इसकी तुलना पिछले समाधानों की संख्या से करते हैं। inf
दी गई समस्या हल नहीं होने पर फ़ंक्शन वापस आ जाएगा ।
गणित?
यह वास्तव में ध्यान देने योग्य है कि वे सभी चालें एक एबेलियन समूह उत्पन्न करती हैं! अगर कोई वास्तव में उन समूहों को रद्द करने का प्रबंधन करता है तो कृपया मुझे बताएं।
गोल्फ संस्करण:
function M=c(a);n=numel(a);p=a;M=inf;o=ones(1,n);for k=0:2^n-1;p(:)=dec2bin(k,n)-'0';b=mod(conv2(p,o,'s')+conv2(p,o','s'),2);m=sum(p(:));if ~std(b(:)-a(:))&m<M;M=m;end;end
पूर्ण संस्करण (वास्तविक चाल के उत्पादन के साथ।)
function M = c(a)
n=numel(a);
p=a;
M=inf; %current minimum of number of moves
o=ones(1,n);
for k=0:2^n-1;
p(:) = dec2bin(k,n)-'0'; %logical array with 1 where we perform moves
b=mod(conv2(p,o,'same')+conv2(p,o','same'),2); %perform the actual moves
m=sum(p(:)); %number of moves;
if ~std(b(:)-a(:))&m<M %check if the result of the moves is valid, and better
M=m;
disp('found new minimum:')
disp(M) %display number of moves of the new best solution (not in the golfed version)
disp(p) %display the moves of the new best solution (not in the golfed version)
end
end
1000
(एक वर्ग के रूप में पुन: व्यवस्थित किया जाता है, कोई फर्क नहीं पड़ता कि कैसे)।