एंड्रॉइड लॉक पैटर्न से बाहर चित्रा


26

कहते हैं कि आपने देखा कि आपका दोस्त अपने Android फ़ोन में अपना पासवर्ड दर्ज करता है। आपको याद नहीं है कि उन्होंने कैसे पैटर्न बनाया है लेकिन आपको याद है कि पैटर्न कैसा दिखता है। संबंधित मित्र होने के नाते आप यह जानना चाहते हैं कि उनका पासवर्ड कितना सुरक्षित है। आपका काम उन सभी तरीकों की गणना करना है जो एक विशेष पैटर्न बनाया जा सकता है।

एंड्रॉइड पैटर्न कैसे काम करता है

नोड्स के 3x3 ग्रिड पर पैटर्न तैयार किए जाते हैं। एक पैटर्न में कोई भी स्क्रीन से अपनी उंगली उठाए बिना नोड्स की एक श्रृंखला का दौरा करता है। उनके द्वारा जाने वाला प्रत्येक नोड पिछले किनारे से एक किनारे से जुड़ा होता है। ध्यान रखने के दो नियम हैं।

  • आप एक से अधिक बार किसी एक नोड पर नहीं जा सकते हैं

  • हो सकता है कि एक बढ़त गैर-स्वीकृत नोड से न गुजरे

ध्यान दें कि, आमतौर पर प्रदर्शन करने के लिए बहुत कठिन है और इस प्रकार वास्तविक एंड्रॉइड लॉक संयोजनों में बहुत आम नहीं है, यह एक नाइट की तरह चलना संभव है । यही है, एक तरफ से एक गैर-आसन्न कोने या दूसरे रास्ते से जाना संभव है। ऐसी चाल को रोजगार देने वाले पैटर्न के दो उदाहरण हैं:

यहाँ इसका एक एनिमेटेड Gif प्रदर्शन किया जा रहा है।

एक पैटर्न हल करना

एक विशिष्ट पैटर्न कुछ इस तरह दिख सकता है:

इस तरह के एक साधारण पैटर्न के साथ यह दो तरीके हैं दो पैटर्न खींचते हैं। आप दोनों ढीले सिरों में से किसी पर भी शुरू कर सकते हैं और हाइलाइट किए गए नोड्स से दूसरे तक यात्रा कर सकते हैं। हालांकि यह कई पैटर्न के लिए सच है, विशेष रूप से यह है कि मनुष्य आमतौर पर इसे नियोजित करता है सभी पैटर्न के लिए सही नहीं है।

निम्नलिखित पैटर्न पर विचार करें:

दो तुरंत पहचानने योग्य समाधान हैं। ऊपरी बाएँ में एक शुरू:

और नीचे केंद्र में एक शुरू:

हालाँकि, क्योंकि एक पंक्ति को एक बिंदु से गुजरने की अनुमति दी जाती है, क्योंकि यह पहले ही चयनित हो चुका है और शीर्ष मध्य में शुरू होने वाला एक अतिरिक्त पैटर्न है:

इस विशेष पैटर्न में 3 समाधान हैं, लेकिन पैटर्न 1 और 4 समाधान [उद्धरण वांछित] के बीच कहीं भी हो सकते हैं ।

यहाँ प्रत्येक के कुछ उदाहरण दिए गए हैं:

1।

2।

3।

4।

आई / ओ

एक नोड को शून्य से नौ समावेशी, उनके स्ट्रिंग समकक्ष या एक से i (या A से I) के वर्णों के पूर्णांक के रूप में दर्शाया जा सकता है। प्रत्येक नोड में इनमें से एक सेट से एक अद्वितीय प्रतिनिधित्व होना चाहिए।

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

एक पैटर्न नोड्स के जोड़े के एक अनियंत्रित कंटेनर द्वारा दर्शाया जाएगा। प्रत्येक जोड़ी जोड़ी में दो बिंदुओं को जोड़ने वाली एक बढ़त का प्रतिनिधित्व करती है। पैटर्न अभ्यावेदन अद्वितीय नहीं हैं।

आप मानक इनपुट विधियों के माध्यम से इनपुट के रूप में एक पैटर्न प्रतिनिधित्व करेंगे और सभी संभव समाधानों का उत्पादन करेंगे जो मानक आउटपुट विधियों के माध्यम से एक ही पैटर्न बनाते हैं।

आप मान सकते हैं कि प्रत्येक इनपुट में कम से कम एक समाधान होगा और कम से कम 4 नोड्स कनेक्ट करेगा।

यदि आप बहुत इच्छा रखते हैं या भाषा चयन के लिए मजबूर हैं, तो आप किसी अनियंत्रित के स्थान पर एक ऑर्डर किए गए कंटेनर का उपयोग कर सकते हैं।

परीक्षण के मामलों

निम्न पैटर्न में व्यवस्थित नोड्स के साथ:

0 1 2
3 4 5
6 7 8

आज्ञा देना {...}एक अव्यवस्थित कंटेनर हो, [...]एक आदेश दिया कंटेनर हो, और (...)एक जोड़ी हो।

निम्नलिखित जानकारी और आउटपुट मैच होना चाहिए

{(1,4),(3,5),(5,8)} -> {[1,4,3,5,8]}
{(1,4),(3,4),(5,4),(8,5)} -> {[1,4,3,5,8]}
{(0,4),(4,5),(5,8),(7,8)} -> {[0,4,5,8,7],[7,8,5,4,0]}
{(0,2),(2,4),(4,7)} -> {[0,1,2,4,7],[1,0,2,4,7],[7,4,2,1,0]}
{(0,2),(2,6),(6,8)} -> {[0,1,2,4,6,7,8],[1,0,2,4,6,7,8],[8,7,6,4,2,1,0],[7,8,6,4,2,1,0]}
{(2,3),(3,7),(7,8)} -> {[2,3,7,8],[8,7,3,2]}
{(0,7),(1,2),(1,4),(2,7)} -> {[0,7,2,1,4],[4,1,2,7,0]}
{(0,4),(0,7),(1,3),(2,6),(2,8),(3,4),(5,7)} -> {[1,3,4,0,7,5,8,2,6]}
{(1,3),(5,8)} -> {}

तस्वीरों के रूप में सभी परीक्षण मामलों का एक imgur एल्बम यहां पाया जा सकता है । पैटर्न लाल में नीले समाधान में हैं।

स्कोरिंग

यह कोड गोल्फ है। सबसे कम बाइट्स जीतता है।


1
अच्छा सवाल है, मैं अक्सर निजी में वही सोचता था। :)
थ्री एफएक्स

क्या आप ब्रेनफ्लक में इसका उत्तर देने जा रहे हैं? अब यह प्रभावशाली होगा। : पी
DJMcMayhem

ऐसा कौन सा पैटर्न है जिसे केवल एक तरीके से हल किया जा सकता है? मुझे लगता है कि आपके पास तीर को उल्टा करके केवल कम से कम 2 हैं।
थ्री एफएक्स

@DJMcMayhem मैं कोशिश करूँगा लेकिन मैं कोई वादा नहीं कर सकता
गेहूं जादूगर

@ThreeFx अपने लिए यह प्रयास करें । क्योंकि आप एक नोड पर नहीं रुक सकते हैं जो पहले से ही दौरा किया गया है, लेकिन आप एक पैटर्न से गुजर सकते हैं, इसे दिशात्मक बनाया जा सकता है।
गेहूं जादूगर

जवाबों:


3

पायथन 2.7, 493 430 बाइट्स

exec("L=['012','345','678','036','147','258','048','246'];L+=[i[::-1]IL];S=sorted;F=lambda t:''.join(str(i)It)\ndef N(x):\n s=' '.join(F(S(i))Ix)\nIL:s=s.replace(i[::2],i[:2]+' '+i[1:])\n return S(set(s.split()))\ndef P(s):\n e=0\nIL:e|=-1<s.find(i[::2])<s.find(i[1])\n return[zip(s[:-1],s[1:]),L][e]\nx=N(input());print[F(i)I__import__('itertools').permutations({iI`x`if i.isdigit()})if x==N(P(F(i)))]".replace('I',' for i in '))

सिंगल लाइन संस्करण प्रोग्राम को लपेटता है exec("...".replace('I',' for i in '))ताकि सभी लूप और जनरेटर एक के साथ शॉर्ट हो सकें Iऔर इस अधिक पठनीय संस्करण पर 15 बाइट्स बचाएं:

L=['012','345','678','036','147','258','048','246'];L+=[i[::-1]for i in L]
S=sorted;F=lambda t:''.join(str(i)for i in t)
def N(x):
 s=' '.join(F(S(i))for i in x)
 for i in L:s=s.replace(i[::2],i[:2]+' '+i[1:])
 return S(set(s.split()))
def P(s):
 e=0
 for i in L:e|=-1<s.find(i[::2])<s.find(i[1])
 return[zip(s[:-1],s[1:]),L][e]
x=N(input())
print[F(i)for i in __import__('itertools').permutations({i for i in`x`if i.isdigit()})if x==N(P(F(i)))]

कार्यक्रम दिखाए गए तरीके से इनपुट लेता है (जैसे {(1,4),(3,4),(5,4),(8,5)}) या स्ट्रिंग की सूची के रूप में (जैसे ['14','34','54','85']) (या अन्य अजगर के अनुकूल प्रारूपों में) और आउटपुट को स्ट्रिंग की सूची के रूप में वापस करता है। इसलिए हमारे पास तकनीकी रूप से ऑर्डर किए गए कंटेनरों का एक कंटेनर है।

फ़ंक्शन Nएक पैटर्न को सामान्य करता है ताकि दो पैटर्न की तुलना आसानी से की जा सके। सामान्यीकरण जोड़े को किनारों को चिह्नित करता है (इसलिए '02'इसके बजाय '20'), डबल किनारों (जैसे '02'बन जाता है '01 12') का विस्तार करने के लिए स्ट्रिंग प्रतिस्थापन का उपयोग करें , डुप्लिकेट को निकालने के लिए किनारों को एक सेट में विभाजित करता है, और परिणाम को सॉर्ट करता है।

फ़ंक्शन Fस्ट्रिंग्स के टुपल्स / स्ट्रिंग्स को समतल करता है , इसलिए हम विभिन्न तरीकों से निर्मित पथों को सामान्य कर सकते हैं।

सूची Lमें स्क्रीन पर सभी लाइनें हैं।

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

एक स्ट्रिंग के रूप में एक क्रमचय को मान्य करने के लिए आवश्यक मुख्य चेक sहै -1<s.find(i[::2])<s.find(i[1]), जो एक लाइन के साथ एक त्रुटि का पता लगाता है i। उदाहरण के लिए लाइन '210'के साथ कोड एक त्रुटि का पता लगाता है यदि ऐसा '20'होता है (यानी यह सूचकांक -1 से अधिक है) और '1'उसके बाद होता है। जब 1 इनपुट में नहीं था, तो हमें 1 न होने की चिंता नहीं करनी चाहिए क्योंकि 1 सामान्यीकृत पैटर्न में दिखाई देगा।


नोट: मुझे पता है कि इसके str(i)for i in t साथ map(str,t) और इसके {i for i in`x`if i.isdigit()} साथ set('012345678')&set(`x`) मूल कोड को छोटा किया जाएगा, लेकिन यह अभी भी थोड़ा अधिक लंबा होगा I


2
Falseहो सकता है 1<0और वहाँ एक बेकार व्हाट्सएप है F(i) for। +1।
यति

@TuukkaX धन्यवाद, जब मैंने अंदर देखा तो मुझे शर्म आ Falseगई।
लाइनस

['012','345','678','036','147','258','048','246']'012 345 678 036 147 258 048 246'.split()'-1 बाइट के लिए हो सकता है ।
श्री एक्सकोडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.