अटैच , 51 बाइट्स
{[3,3]&Rotate[Sample[{Sum@_=_2}&_\BinBelow@8]'_,4]}
इसे ऑनलाइन आज़माएं!
व्याख्या
करने के लिए इसी तरह के गैलेन के जम्मू / एपीएल जवाब , बुनियादी तकनीक 1s और खानों की सही संख्या के साथ 0 की एक सरणी उत्पन्न करने के लिए, और अंत तक यह जोड़कर सरणी घूर्णन ऐसी है कि केंद्र में इनपुट झूठ, तब तक इनपुट डालने है 3x3 मैट्रिक्स में पुन: आकार देना।
भाग 1: बाइनरी सरणी उत्पन्न करना
ऐसा करने के बारे में जाने के कई तरीके हैं, लेकिन मैं मुख्य रूप से दो प्रकारों में हुआ: क्रूर बल और चयन।
प्राथमिक जानवर बल विधि इस तरह दिखती है:
NestWhile[{Random[8&2]},0,{Sum@_/=_2}&_]
यह 8 बाइनरी अंकों ( Random[8&2]
) के यादृच्छिक सरणियों को उत्पन्न करता है, जबकि उनकी रकम इनपुट के बराबर नहीं होती है {Sum@_/=_2}&_
। यह थोड़ा वर्बोज़ है, क्योंकि कोड के निम्नलिखित ज़ोर दिए गए भाग "बस इसे काम करने के लिए" हैं:
NestWhile[{Random[8&2]},0,{Sum@_/=_2}&_]
^ ^^^^^ ^^^^
और मैंने विचार त्याग दिया।
चयन अधिक रोचक है। मुख्य अवधारणा का उपयोग करने के लिए है BaseBelow[b, n]
निर्मित है, जो सभी base- की एक सूची उत्पन्न b
चौड़ाई के पूर्णांक n
से, (अंकों सरणियों के रूप में) 0
करने के लिए b^n-1
। उदाहरण के लिए, BaseBelow[3, 2]
चौड़ाई 2 के सभी टर्नरी पूर्णांक बनाता है:
A> BaseBelow[3, 2]
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2
हम विशेष रूप BaseBelow[2, 8]
से चौड़ाई के सभी द्विआधारी पूर्णांक के लिए उपयोग करते हैं। ये सभी लंबाई के सभी संभव खदानों का प्रतिनिधित्व करते हैं। यह पहला चरण हैं।
दूसरा चरण केवल N
1s के साथ ऐसे सभी सरणियों का चयन कर रहा है , जहां N
इनपुट है। मेरा पहला विचार इस अंग्रेजी कथन को सीधे अताशे में अनुवाद करना था:
Chunk[SortBy[Sum,BaseBelow[2,8]],Sum]@N@1
हालांकि, न केवल यह उपरोक्त दृष्टिकोण की तुलना में 1 बाइट से अधिक लंबा हो गया है, यह अत्यधिक दोहराव भी है - और यह अभी तक यादृच्छिक नहीं है! ज़रूर, मैं शायद 1 बाइट को बचाने के लिए कह सकता हूं कि BaseBelow
इसे कैसे कहा जाता है, लेकिन यह केवल दृष्टिकोण का उपयोग करने के लायक नहीं है।
इसलिए मैंने एक पत्थर से दो पक्षियों को मारने और एक Shuffle
आधारित दृष्टिकोण का उपयोग करने का फैसला किया । निम्नलिखित N
यादृच्छिक क्रम में लंबाई के सभी वैध खदान देता है :
{Sum@_=_2}&N\Shuffle[BaseBelow&8!2]
फिर, वह सब करने की ज़रूरत है जो पहले का चयन करना है। लेकिन मैं बेहतर कर सकता हूं - निश्चित रूप से यह केवल Sample
फ़िल्टर किए गए सरणी के लिए बेहतर होगा ? यह दृष्टिकोण कुछ इस प्रकार है:
Sample[{Sum@_=_2}&_\BaseBelow[2,8]]
मुझे BaseBelow&8!2
गोल्फ को वापस करना पड़ा क्योंकि \
पूर्ववर्तीता बहुत अधिक है। अन्यथा संतुष्ट, मैं एक बाइट काट कर आगे बढ़ा:
Sample[{Sum@_=_2}&_\2&BaseBelow@8]
(मुझे यहां एक डाइएडिक फ़ंक्शन को सफलतापूर्वक कॉल करने का एक और तरीका पता चला है: x&f@y
एक उच्च-मिसाल अभिव्यक्ति है जो इसका मूल्यांकन करती है f[x, y]
)।
हालांकि, इसके बावजूद, मुझे याद है कि, सभी के साथ, 2&BaseBelow
अस्तित्व के लिए एक उपनाम BinBelow
:। इसलिए मैंने इसका इस्तेमाल किया:
Sample[{Sum@_=_2}&_\BinBelow@8]
यह वांछित माइनफील्ड उत्पन्न करता है। मुझे यकीन है कि यह इष्टतम के पास है।
भाग 2: सरणी का निर्माण
जैसा कि पहले कहा गया था, मैंने जो तकनीक का उपयोग किया वह J / APL उत्तर के समान है, इसलिए मैं बहुत अधिक विस्तार में नहीं जाऊंगा। मान लीजिए MINEFIELD
कि अंतिम अनुभाग से परिणाम है। फ़ंक्शन तब बन जाता है:
{[3,3]&Rotate[MINEFIELD'_,4]}
MINEFIELD'_
मूल इनपुट के साथ माइनफील्ड को सम्मिलित करता है _
, हमें ऐसा कुछ देता है:
[1, 0, 0, 0, 1, 0, 0, 1, 3]
फिर, Rotate[MINEFIELD'_,4]
इस सूची 4
को बाईं ओर घुमाते हुए, केंद्र को रखते हुए:
[1, 0, 0, 1, 3, 1, 0, 0, 0]
अंतिम चरण का उपयोग [3,3]&
सूची को 3x3 मैट्रिक्स में फिर से देखने के लिए कर रहा है:
1 0 0
1 3 1
0 0 0
1
और0
?