टेट्रिस टैंग्राम्स


13

परिचय

टैंग्राम एक क्लासिक पहेली है जिसमें विभिन्न आकृतियों में ब्लॉकों को व्यवस्थित / फिटिंग किया जाता है। चीनी "से - शाब्दिक अर्थ है" कौशल के सात बोर्ड "। आइए इस विचार को लें और एक ग्रिड को भरने के लिए सात Tetrominos के टुकड़ों का उपयोग करें ।

चुनौती

एक फ़ंक्शन या प्रोग्राम लिखें, जो इनपुट के रूप में ग्रिड निर्देशांक की एक सरणी लेता है, और निर्दिष्ट निर्देशांक को छोड़कर टेट्रिस के टुकड़ों से भरे 20 ग्रिड द्वारा 10 को पूरा करता है।

टुकड़ों के वितरण को समान रखने का प्रयास करके अपने स्कोर का अनुकूलन करें।

मानदंड

अपने कार्य को पूरा करने के लिए निर्देशांक के इस पास्टबिन का उपयोग करें । निर्देशांक के पांच सेट हैं। उस प्रारूप को संशोधित करने के लिए स्वतंत्र महसूस करें जिसमें निर्देश लिखे गए हैं, लेकिन मूल्य नहीं।

डेटा सेट # 2 को हल नहीं किया जा सकता है - इस मामले में, बस (यानी Xजहां छेद हैं) में भरे इनपुट कोशिकाओं के साथ ग्रिड का उत्पादन करें ।

इनपुट

ग्रिड में ग्रिड 'होल' का प्रतिनिधित्व करते हैं। ये ऐसी कोशिकाएं हैं जिनमें टेट्रोमिनो का कोई भी भाग नहीं हो सकता है।

समन्वित ग्रिड:

(0,0), (1,0), (2,0), ... (9,0)
(0,1), (1,1), (2,1), ... (9,1)
.
.
.
(0,19), (1,19), (2,19), ... (9,19)
  • निर्देशांक इनपुट करने के लिए अपनी प्रोग्रामिंग भाषा की पसंद की सरणी शैली का उपयोग करें।

  • एक Xया अन्य मुद्रण योग्य ASCII के साथ ग्रिड में छेद का प्रतिनिधित्व करते हैं ।

उत्पादन

20 सेल लंबा चौड़ा 10 कोशिकाओं के एक मानक टेट्रिस ग्रिड आकार का उपयोग करके , एक समाधान ग्रिड प्रिंट करें यदि और केवल ग्रिड पूरी तरह से और पूरी तरह से टेट्रोमिनो टुकड़ों का उपयोग करके भरा जा सकता है।

पत्र के साथ निर्माण किया मोहरे I, O, L, J, T, Z, Sके रूप में इस प्रकार है:

I          
I          L      J
I    OO    L      J     T     ZZ      SS
I    OO    LL    JJ    TTT     ZZ    SS

उदाहरण

कोई इनपुट निर्देशांक के साथ आउटपुट समाधान उदाहरण:

ZZIIIILLLI
JZZTTTLLLI
JJJSTLOOLI
SZZSSLOOLI
SSZZSLLJJI
TSOOSLLJII
TTOOSSLJII
TZOOSSLZII
ZZOOSSZZII
ZJJJJSZLLI
TTTJJOOILI
ITZJJOOILI
IZZTTTLIII
IZOOTZLIII
IJOOZZLLII
LJJJZSSTII
LLLTSSTTTI
LLLTTSSZJI
OOLTSSZZJI
OOIIIIZJJI

वितरण निम्नानुसार है:

I          
I          L      J
I    OO    L      J     T     ZZ      SS
I    OO    LL    JJ    TTT     ZZ    SS

11   6     8     6      6     7      6

टिप्पणियाँ

निर्देशांक ग्रिड पर एकल Xऔर Yस्थिति का प्रतिनिधित्व करते हैं । ग्रिड 0 आधारित है, जिसका अर्थ है समन्वय (0,0)या तो ऊपर बाईं ओर होना चाहिए या नीचे बाईं ओर सेल, लेखक की पसंद।

ईंटें कर सकते हैं:

  • लेखक के विवेक पर चुना जाना चाहिए।
  • लेखक के फिट होते ही घुमाया जाए।
  • लेखक के विवेक पर कहीं भी ग्रिड पर रखा जा सकता है (उर्फ: कोई टेट्रिस ग्रेविटी)

ईंटें नहीं हो सकती:

  • ग्रिड की सीमा के बाहर रखा जाए।
  • ग्रिड में मौजूदा ईंट या छेद को ओवरलैप करें।
  • एक गैर-मानक टेट्रोमिनो टुकड़ा हो।

स्कोरिंग

आपका स्कोर प्रारूप में है:

(1000 - [कोड में बाइट्स)) * (एम / 10 + 1)

जहां एम आपके समाधान सेट में उपयोग किए गए टुकड़ों के वितरण के लिए एक गुणक है।

मार्च के आयड्स द्वारा उच्चतम स्कोर।

एम की गणना करने के लिए, प्रत्येक सेट के लिए सबसे कम व्यक्तिगत टेट्रोमिनो वितरण मूल्य जोड़ें और फिर एम की गणना करने के लिए औसत गोल नीचे ले जाएं।

उदाहरण के लिए:

Set 1: 5
Set 2: 4
Set 3: 5
Set 4: 6
Set 5: 3

6 + 4 + 5 + 4 + 4 = 21/5 = 4.6

तो आप 4अपने M मान के रूप में उपयोग करेंगे ।

नोट: यदि किसी सेट का कोई समाधान नहीं है, तो एम की गणना करने वाले कारक को न लें, क्योंकि इसका कोई टेट्रोमिनो वितरण नहीं होगा।


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

@ मार्टिनबटनर ने विधिवत रूप से उल्लेख किया, प्रतिक्रिया के लिए धन्यवाद।
CzarMatt

2
मार्च का महीना = 15 मार्च। मुझे वह देखना था।
लेवल रिवर सेंट

मैंने कार्य विवरण को फ्रंट-लोड करने के लिए कुछ छोटे बदलाव किए हैं, क्योंकि अन्यथा यह समझना असंभव है कि हमें पहले रीड-थ्रू पर क्या करने के लिए कहा जा रहा है। मुझे लगता है कि यह एक सुधार होगा यदि आपने कहा कि कौन से इनपुट मामलों को हल नहीं किया जा सकता है, ताकि वे एक स्केचर्स के अलावा परीक्षण मामलों के रूप में कार्य करें।
पीटर टेलर

@PeterTaylor मेला पर्याप्त है, मैंने जोड़ा है कि कौन सा समाधान सेट नहीं किया जा सकता है। प्रतिक्रिया के लिए धन्यवाद।
CzarMatt

जवाबों:


2

पायथन 3 , 819 बाइट्स, एम = 0, स्कोर = 181

यह एक ब्रूट फोर्स DFS प्रोग्राम है। यह एक सुन्न सरणी बनाता है, और सभी इनपुट छेदों को सम्मिलित करता है। यह तब उच्चतम पंक्ति पर बाईं ओर की अधूरी टाइल लेता है जिसमें एक होता है, और एक टेट्रोमिनो होता है। पुनरावर्ती, हम अब इसे फिर से करते हैं - जब हम या तो हम एक समाधान नहीं ढूंढ सकते हैं, या हम पहले मौके पर एक और टुकड़ा बैकग्राउंड और कोशिश करते हैं।

इसका एक M 0 है, क्योंकि यह एक निर्धारित क्रम में टुकड़ों का उपयोग करने की कोशिश करता है, और लगभग हमेशा सूची में पिछले एक के बिना एक समाधान पाता है। मैंने एक बेतरतीब ढंग से ऑर्डर की गई सूची का उपयोग करके अधिक समान वितरण के लिए प्रयास किया, लेकिन मुझे केवल 2 का M मिला , जो कि random.shuffle को आयात करने के लिए आवश्यक बाइट्स के लायक नहीं था ।

मैं नीचे दिए गए कोड पर टिप्पणी नहीं कर सकता, क्योंकि मेरे गोल्फ में मैं लंबे समय से भूल गया हूं कि यह कितना करता है। सामान्य विचार:

  • 1-अक्षर नामों के साथ, खस्ता और इटर्टूलस उत्पाद आयात करें
  • कुछ बिल्डरों को 1-अक्षर के कार्यों का नाम दें, और बाइट्स को बचाने के लिए एक लैम्ब्डा को परिभाषित करें
  • संभव tetrominos की संख्या का निर्माण सुन्न nd-arrays के रूप में, सभी घुमाव शामिल हैं
  • पुनरावर्ती कार्य में:
    • वांछित टाइल की स्थिति प्राप्त करें, और टुकड़ों की सूची के माध्यम से चक्र करें
    • प्रत्येक टुकड़े के लिए, इसके अनुवादों के माध्यम से चक्र (इसे ऊपर और नीचे ले जाना)
    • अगर कुछ काम नहीं करता है (टुकड़ा बोर्ड से बाहर जाता है, एक और टुकड़ा मारता है, एक छेद मारता है, आदि), अगले अनुवाद या अगले पूरे टुकड़े की कोशिश करें
    • अगर यह काम करता है, महान। इसे आज़माएं, फिर फ़ंक्शन को पुन: कॉल करें।
    • यदि वह रास्ता काम नहीं करता है, तो यह 'ए' वापस आ जाएगा, इसलिए हम फिर से कोशिश करते हैं। अगर यह काम करता है, तो यह बोर्ड को वापस कर देता है, और हम इसे लाइन पास करते हैं।
  • अंत में, कार्यक्रम। हम 10x20 बोर्ड का निर्माण 1 के एक सुस्पष्ट सरणी के रूप में करते हैं।
  • इनपुट फॉर्म का है (X1, y1); (x2, y2); ... हम इसमें प्रत्येक छेद के लिए 9 लगाते हैं, फिर उस पर फ़ंक्शन को चलाने का परिणाम मिलता है।
  • प्रिंट स्टेटमेंट या तो सफल परिणाम या लाइन द्वारा रिक्त, मूल बोर्ड लाइन प्रदर्शित करता है, जो संख्याओं के लिए उपयुक्त अक्षरों या प्रतीकों को प्रतिस्थापित करता है।
import numpy as n
from itertools import product as e
m,s=range,len
p=[n.rot90(a,k)for a,r in[([[2,2]]*2,1),([[3]*3,[1,3,1]],4),([[0]*4],2),([[1,1,6],[6]*3],4),([[7,1,1],[7]*3],4),([[4,4,1],[1,4,4]],2),([[1,5,5],[5,5,1]],2)]for k in m(r)]
o=lambda a:e(m(s(a)),m(s(a[0])))
def t(l,d=0):
	g=list(zip(*n.where(l==1)))[0]
	for a in p:
		for u,v in o(a):
			w,x=l.copy(),0
			for r,c in o(a):
				if a[r,c]!=1:
					i,j=g[0]+r-u,g[1]+c-v
					if any([i<0,i>19,j<0,j>9])or l[i,j]!=1:
						x=1
						break
					w[i,j]=a[r,c]
			if x==0:
				if len(w[w==1]):
					f=t(w,d+1)
					if type(f)==str:continue
					return f
				return w
	return'a'
b=n.ones((20,10))
b[list(zip(*[eval(k)[::-1]for k in input().split(';')]))]=9
a=t(b)
for r in(a,b)[type(a)==str]:
	print(''.join(map(dict(zip([0,2,3,4,5,6,7,9,1],'IOTZSLJX-')).get,r)))

इसे ऑनलाइन आज़माएं!

नमूना जाँच:

In: (1,1);(8,1);(4,4);(5,8);(4,11);(5,15);(1,18);(8,18)
Out: 
IIIIOOOOLL
TXOOOOOOXL
TTOOOOOOTL
TOOIOOOOTT
TOOIXOOTTI
TTTITOOTTI
TTTITTTTII
OOTTTTTTII
OOTTTXOOII
TTTTOOOOII
TTTTOOOOII
TTTTXTOOII
ITTTTTTTII
ITTTTTTTII
IITTTLLTTI
IITOOXLTTI
IITOOTLTTI
IITTLTTTTI
IXTLLTJTXI
ILLLLLJJJI

1
ओह माय - यह अद्भुत है। अद्भुत लिखने के लिए धन्यवाद, और अच्छा काम!
CzarMatt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.