Android लॉक स्क्रीन


25

पहचान

आप एक लंबी मेज के अंत में एक बोर्ड रूम में बैठे हैं। आप चारों ओर देखते हैं और टिम कुक, ऐप्पल बोर्ड ऑफ डायरेक्टर्स, स्टीव जॉब्स और जैक डोनाघी के भूत को देखते हैं। ऐप्पल ने इस बैठक को बुलाया क्योंकि उन्हें एहसास हुआ कि एंड्रॉइड लॉक स्क्रीन कितना कूलर है, और वे उन्हें 1-यूपी करना चाहते हैं। कमरे में हर कोई आपको भूत स्टीव के रूप में देखता है, रोता है, "मेरी मदद करो, कोड गॉल्फ मैन! तुम मेरी एकमात्र आशा हो!"

समस्या

एंड्रॉइड लॉक स्क्रीन डॉट्स की एक 3 x 3 ग्रिड है जो एक बिंदु से दूसरे तक एक उंगली को स्वाइप करके कनेक्ट किया जा सकता है, एक पथ बना सकता है। एक पासवर्ड किसी भी संभावित पथ को माना जाता है जिसमें किसी भी संख्या में डॉट्स शामिल होते हैं, और किसी भी संख्या में डॉट्स को बाहर करता है। (वास्तविक फोन पर, पथ कम से कम 4 डॉट लंबा होना चाहिए। इस चुनौती के लिए, उस प्रतिबंध पर ध्यान न दें।) Apple की योजना 3 x 3 ग्रिड को M x N ग्रिड से बदलने की है, जो कि (M * N) / 9 है। समय बेहतर!

नियम:

  • एक शून्य डॉट पथ एक पासवर्ड नहीं है, लेकिन एक 1 डॉट पथ है
  • एक रास्ता ही पार कर सकता है
  • एक पथ सीधे उस बिंदु को शामिल किए बिना किसी बिंदु पर नहीं जा सकता
  • एक डॉट केवल एक बार उपयोग किया जा सकता है
  • रोटेशन द्वारा समान होने वाले पथ समान पासवर्ड नहीं हैं
  • पथ जो समान हैं लेकिन रिवर्स में आदेश दिए गए समान पासवर्ड नहीं हैं
  • उदाहरण के लिए, एक 3x3 ग्रिड पर डॉट्स के साथ 1 से 9 तक गिने जाते हैं:

    1 2 3
    4 5 6
    7 8 9
    

    कुछ मान्य रास्ते हैं:

    1
    3
    7,2,3
    1,5,9,2
    1,8,6,5,4
    4,2,3,5,6,7,8,9
    5,9,6,4
    

    और कुछ अवैध रास्ते हैं:

    1,3
    1,9,5
    7,5,4,7
    4,6
    

    आपका इनपुट तीन नंबर का होगा:

    (M,N,d)
    

    जहां ग्रिड M x N है, और d पथ की लंबाई है

    1 <= M <= 16
    1 <= N <= 16
    1 <= d <= M * N
    

    आपके प्रोग्राम या फ़ंक्शन को अल्पविराम द्वारा अलग किए गए स्ट्रिंग के रूप में इनपुट दिया जाएगा, और इसे उस लंबाई के संभावित पासवर्ड की संख्या को वापस करना होगा। उदाहरण के लिए:

    Input:  2,2,1 
    Output: 4
    Input:  2,2,2
    Output: 12
    Input:  7,4,1
    Output: 28
    

    मानक कोड गोल्फ नियम लागू होते हैं, सबसे छोटा कोड जीतता है!

    //If I've made a mistake or the rules are unclear, please correct me!
    

    2
    क्या इनपुट कॉमा-सेपरेटेड स्ट्रिंग या तीन अलग-अलग पैरामीटर है?
    user80551

    1
    @ user80551 संदर्भ के आधार पर, मुझे लगता है कि यह एक स्ट्रिंग होगा यदि यह किसी प्रोग्राम के लिए इनपुट है, या फ़ंक्शन को कॉल करने के लिए उपयोग किया जाता है, तो अलग पैरामीटर।
    user12205

    1
    @Patatat क्या आप उपयोगकर्ता के80551 के सवाल का जवाब दे सकते हैं, क्योंकि यह कोड डिजाइन करने के लिए वास्तव में महत्वपूर्ण है
    RononDex

    3
    आपको यह तय करना चाहिए कि किसी दिए गए समाधान के संकलन और निष्पादन समय दोनों के लिए कोई समय सीमा होने वाली है या नहीं। इस तरह की सीमा के बिना, एक प्रोग्राम लिखना आसान है, जो सिद्धांत में, 256!16 x 16 ग्रिड पर डॉट्स के सभी अनुमतियों को सत्यापित करता है जो एक वैध अनलॉक पैटर्न का प्रतिनिधित्व करता है। व्यवहार में, ऐसा कार्यक्रम कभी समाप्त नहीं होगा।
    डेनिस

    3
    लेकिन मैंने कहा कि समस्या एंड्रॉइड लॉक सिस्टम पर आधारित थी ... तो मुझे एंड्रॉइड लॉक सिस्टम के समान नियमों का उपयोग क्यों नहीं करना चाहिए?
    प्लैटैट

    जवाबों:


    14

    पायथन - 170 बाइट्स

    from fractions import*
    p=lambda m,n,d,l=0,s=set():d<1or sum([p(m,n,d-1,i,s|{i})for i in range(m*n)if not(s and(s&{i}or set(range(l,i,abs(i-l)/gcd(i%n-l%n,i/n-l/n)))-s))])
    

    मुझे पता है कि अंदर कोष्ठक sum([...])कड़ाई से आवश्यक नहीं हैं, लेकिन उनमें शामिल नहीं करने के लिए एक बड़ा प्रदर्शन जुर्माना है।

    सभी 3x3s के लिए आउटपुट:

    for i in range(4, 10):
      print p(3, 3, i)
    

    पैदा करता है:

    1624
    7152
    26016
    72912
    140704
    140704
    

    परीक्षण / पुष्टि उद्देश्यों के लिए, 4x5 बोर्ड के लिए पहले 6 मान:

    20
    262
    3280
    39644
    459764
    5101232
    

    4x5 सत्यापित करने के लिए एक दिलचस्प मामला है, क्योंकि इसमें 2x2, 3x3 और 2x4 पेग जंप हैं।


    संक्षिप्त विवरण

    सामान्य तौर पर, यह एक संपूर्ण खोज है, जिसमें संचयी छंटाई होती है। उदाहरण के लिए, क्योंकि p(3, 3, 4)1624 है, p(3, 3, 5)केवल भयावह रूप से सभी 15120 की जाँच के बजाय 8120 सकारात्मकता की जाँच करेगा। अधिकांश तर्क हालत में निहित है:

    if not(s and(s&{i}or set(range(l,i,abs(i-l)/gcd(i%n-l%n,i/n-l/n)))-s))
    

    सादे अंग्रेजी में, इसे इस प्रकार समझा जा सकता है:

    If no pegs have been used yet
         OR
       the target peg has not yet been used
         AND
       each of the pegs directly between the target peg and the
       current peg (a.k.a. "jumped over") have already been used
    

    2
    क्या आप बता सकते हैं कि दुनिया में क्या हो रहा है?
    atı

    1
    आप sसूची के बजाय सेट होने से कुछ बाइट्स बचा सकते हैं । मैं कोष्ठक छोड़ने के बड़े प्रदर्शन का दंड नहीं देख रहा हूँ; ऐसा दंड क्यों होगा?
    user2357112

    1
    @ user2357112 एक जेनरेटर के ऊपर, एक लिस्ट में दूसरा है। CPython के साथ, आप सही हैं, बहुत अंतर नहीं है (केवल लगभग 20% धीमा)। PyPy के साथ, यह धीमी गति से 5 गुना अधिक है।
    प्रिमो

    1
    @ user2357112 मैं अंत में देख रहा हूं sकि एक सेट के रूप में परिभाषित करने से आपका क्या मतलब है । आज के लिए मेरा अजगर सबक: के {i}रूप में मूल्यांकन करता है set([i])। मुझे सिंटैक्स त्रुटि की उम्मीद होगी। एक आइटम को एक सेट पर लागू करना तब बन जाता है s|{i}, और यह भी इसे i in sप्रतिस्थापित करने की अनुमति देता है s&{i}
    प्रिमो
    हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
    Licensed under cc by-sa 3.0 with attribution required.