अजगर, 30 29 बाइट्स
L?bsmy-tb]dfq1.a-VThbb1y*FUMQ
इसे ऑनलाइन आज़माएँ: प्रदर्शन / टेस्ट सूट
सभी उदाहरण इनपुट ऑनलाइन संकलक में चलते हैं। अंतिम हालांकि कुछ सेकंड लगते हैं।
स्पष्टीकरण:
अपने कोड में मैं एक पुनरावर्ती कार्य को परिभाषित करूंगा y
। फ़ंक्शन y
2D-निर्देशांक की एक सूची लेता है और इन निर्देशांक का उपयोग करके विभिन्न डोमिनोज़ झुकाव की संख्या देता है। जैसे y([[0,0], [0,1]]) = 1
(एक क्षैतिज डोमिनोज़), y([[0,0], [1,1]]) = 0
(निर्देशांक आसन्न नहीं हैं) और y([[0,0], [0,1], [1,0], [1,1]]) = 2
(या तो दो क्षैतिज या दो ऊर्ध्वाधर डोमिनोज़)। फ़ंक्शन को परिभाषित करने के बाद, मैं इसे सभी निर्देशांक के [x,y]
साथ कॉल करूंगा x in [0, 1, m-1], y in [0, 1, n-1]
।
पुनरावर्ती कार्य कैसे कार्य करता है? यह काफी सरल है। यदि कोर्डर्स की सूची खाली है, तो वास्तव में एक मान्य टाइलिंग और y
रिटर्न है 1
।
अन्यथा मैं सूची में पहला समन्वय लेता हूं b[0]
, और पड़ोसियों के लिए शेष निर्देशांक खोजता हूं । यदि कोई पड़ोसी नहीं है b[0]
, तो कोई छेड़छाड़ संभव नहीं है, इसलिए मैं वापस लौटता हूं। 0. यदि एक या एक से अधिक पड़ोसी हैं, तो झुकाव की संख्या है (झुकाव की संख्या जहां मैं b[0]
एक पड़ोसी के माध्यम से एक डोमिना से जुड़ता हूं , प्लस) झुकाव की संख्या जहां मैं b[0]
दूसरे पड़ोसी के साथ जुड़ता हूं , प्लस ...) इसलिए मैं प्रत्येक पड़ोसी के लिए संक्षिप्त सूची के साथ फ़ंक्शन को पुन: कॉल करता हूं (दो सहयोगियों b[0]
और पड़ोसी को हटाकर )। बाद में मैं सभी परिणामों को समेटता हूं और उन्हें वापस करता हूं।
कोर्ड्स के आदेश के कारण हमेशा केवल दो पड़ोसी संभव होते हैं, एक दाईं ओर और एक नीचे। लेकिन मेरे एल्गोरिथ्म के बारे में परवाह नहीं है।
UMQ convert the input numbers into ranges
*F Cartesian product (coords of each square)
L define a function y(b):
?b if len(b) > 0:
f b filter b for squares T, which satisfy:
.a-VThb Euclidean distance between T and b[0]
q1 is equal to 1 (direct neighbors)
m map each neighbor d to:
-tb]d remove d from b[1]
y and call recursively y with the rest
s sum all those values and return them
else:
1 return 1 (valid domino tiling found)
y*FUMQ Call y with all coords and print the result