अपना लॉक अनलॉक करें


34

आपने अपनी बाइक को 3 अंकों के संयोजन लॉक के साथ बंद कर दिया है। अब आप एक सवारी के लिए जाना चाहते हैं और निम्नलिखित कार्यक्रम की मदद से इसे अनलॉक करने की आवश्यकता है।

इनपुट

1 पैरामीटर

लॉक अवस्था में आपके लॉक का डिजिट संयोजन । यह 2 पैरामीटर (= अनलॉक का संयोजन) से अलग होना चाहिए राज्य ) । (या फिर आपकी बाइक चोरी हो सकती है!)

रेंज 000..999। अग्रणी शून्य को छोड़ा नहीं जाना चाहिए।

दूसरा पैरामीटर

अनलॉक में आपके लॉक का अंक संयोजन राज्य । यह मूल्य आपका लक्ष्य है।

रेंज 000..999। अग्रणी शून्य को छोड़ा नहीं जाना चाहिए।

उत्पादन

प्रारंभिक अवस्था (जो हमेशा 1 पैरामीटर है) और अंतिम चरण (जो हमेशा 2 पैरामाटर होता है) सहित प्रत्येक "रोटेशन" के बाद संयोजन लॉक के प्रत्येक राज्य की एक सूची।

कलन विधि

जब तक आप अनलॉक किए गए राज्य में सही अंक तक नहीं पहुंचते, तब तक आप एक-एक करके पहला अंक "घुमाते" हैं । लेकिन, क्योंकि आप संपूर्ण अनलॉक-कोड के ज्ञान में हैं, तो आप अंक को उस दिशा में घुमाते हैं, जिसमें आपको अनलॉक अवस्था में अंक तक पहुंचने के लिए सबसे छोटी मात्रा में घुमावों की आवश्यकता होती है । एक टाई के मामले में आप जो भी दिशा चाहें चुन सकते हैं।

जब आप सही पहले अंक पर पहुंच गए हैं, तो आप उसी प्रक्रिया को 2 और फिर 3 के साथ शुरू करते हैं।

अंकों के क्रम को एक चक्र के रूप में समझना है:

... 9 0 1 2 3 4 5 6 7 8 9 0 1 2 ...

इसका मतलब है, कि 1 से 9 तक की छोटी मात्रा में घुमाव नहीं है

1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 = 8

परंतु

1 -> 0 -> 9 = २।

टिप्पणियाँ

उदाहरण

उदाहरण 1, सही

Input: 999 001

Output:
999
099
009
000
001

उदाहरण 2, सही

Input: 000 292

Output:
000
100
200
290
291
292

उदाहरण 3, गलत आउटपुट

Input: 999 121

Wrong output:
999
899 // Wrong because wrong rotation direction.
799
699
...

Correct output:
999
099
199
109
119
129
120
121

उदाहरण 4, गलत इनपुट

Input: 1 212 // Wrong because no leading zeros.

यह सबसे छोटी उत्तर जीत है।


क्या मैं दो मापदंडों के क्रम को बदल सकता हूं?
tsh

क्या हम किसी भी क्रम में अंकों को अपडेट कर सकते हैं जब तक कि यह इष्टतम है?
अरनुलद

@Arnauld नहीं क्योंकि मैं अपना लॉक एक-एक करके अनलॉक करता हूं :)
user2190035

2
@ रात 2 नहीं, क्योंकि कार्यक्रम को संयोजन की "अनलॉकिंग प्रक्रिया" का अनुकरण करना चाहिए।
user2190035

जवाबों:


12

पायथन 2 , 113 107 105 99 95 बाइट्स

a,b=input()
i=0
print a
for x in a:
 while x-b[i]:a[i]=x=(x+(x-b[i])%10/5*2-1)%10;print a
 i+=1

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

पूर्णांकों की सूची के रूप में इनपुट लेता है


बचाया:

  • -6 बाइट्स, जोएल के लिए धन्यवाद
  • -4 बाइट्स, जीट्स के लिए धन्यवाद

2
गणना करने के लिए एक अलग तरीके का उपयोग करके 99 बाइट्स
जोएल

@Joel धन्यवाद! :)
टीएफडीएल

2
96 बाइट्स - बोनस: किसी भी सरणी आकार के लिए काम करता है
Jitse

1
95 बाइट्स - जब से आप पायथन 2 का उपयोग कर रहे हैं, स्वागत योग्य हो सकता है//
Jitse

@ जीत धन्यवाद :)
टीएफडी

6

जेली , 15 बाइट्स

_æ%5ḣT$ṂṠ⁸_%⁵ðƬ

[0,9] , लंबाई के बराबर लेकिन अन्यथा मनमाने ढंग से), जो शुरू कोड से कोड की सूची की एक सूची पैदावार लक्ष्य-कोड के लिए।

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

कैसे?

_æ%5ḣT$ṂṠ⁸_%⁵ðƬ - Link: list of integers, s; list of integers, t
              Ƭ - collect up values until a fixed point is reached applying:
             ð  -   the dyadic chain:  (i.e. f(x, t) where x starts off as s)
_               -     subtract (t from x) (vectorises) - i.e. [ta-xa, tb-xb, tc-xc]
   5            -     literal five
 æ%             -     symmetric modulo (vectorises) - i.e. [[-4..5][ta-xa], [-4..5][tb-xb], [-4..5][tc-xc]]
      $         -     last two links as a monad:
     T          -       truthy indices  - e.g. [0,-4,1]->[2,3]
    ḣ           -       head to index (vectorises)       [[0,-4],[0,-4,1]]
       Ṃ        -     minimum                            [0,-4]
        Ṡ       -     sign (vectorises)                  [0,-1]
         ⁸      -     chain's left argument (x)
          _     -     subtract (vectorises) - i.e. move the single spindle one in the chosen direction
            ⁵   -     literal ten
           %    -     modulo (since 9+1=10 not 0)

4

जावास्क्रिप्ट (ईएस 6),  73 72  70 बाइट्स

@ बाइट के लिए 2 बाइट्स को सहेजा गया

इनपुट किए गए सिंटैक्स में अंकों के 2 सरणियों के रूप में इनपुट लेता है (a)(b)। एक स्ट्रिंग लौटाता है।

a=>g=b=>b.some(x=>d=x-(a[++i]%=10),i=-1)?a+`
`+g(b,a[i]+=d/5<5/d||9):b

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

टिप्पणी की गई

a =>                  // a[] = initial combination
g = b =>              // b[] = target combination
  b.some(x =>         // for each digit x in b[]:
    d =               //   compute the difference d:
      x -             //     between x
      (a[++i] %= 10), //     and the corresponding digit in a[]
                      //     we apply a mod 10, because it may have exceed 9
                      //     during the previous iteration
    i = -1            //   start with i = -1
  ) ?                 // end of some(); if it's truthy:
    a + `\n` +        //   append a[] followed by a line feed
    g(                //   followed by the result of a recursive call:
      b,              //     pass b[] unchanged
      a[i] +=         //     add either 1 or 9 to a[i]:
        d / 5 < 5 / d //       add 1 if d / 5 < 5 / d
        || 9          //       otherwise, add 9
    )                 //   end of recursive call
  :                   // else:
    b                 //   stop recursion and return b[]

d/6&1^d>0||9->d/5>5/d?9:1
tsh


2

पायथन 2 , 101 97 बाइट्स

a,c=input()
print a
for i in 0,1,2:
 while a[i]!=c[i]:a[i]=(a[i]+(a[i]-c[i])%10/5*2-1)%10;print a

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

3 बाइट्स जोएल को

किलों की सूची के रूप में इनपुट लेता है।



1
@Joel: धन्यवाद! दरअसल, चूंकि यह पायथन 2 //है /, इसलिए जैसा है , इसलिए इसमें एडिटोनल बाइट प्राप्त किया गया है।
चास ब्राउन

यह @ TFeld के उत्तर के समान सटीक दृष्टिकोण के समान दिखता है , लेकिन थोड़े संशोधनों के साथ
Jitse

@ जीत: ठीक है, हम दोनों हमारे जवाब को संशोधित कर रहे हैं; उदाहरण के लिए, उन्होंने शुरुआत की थी for x,y,i in zip(a,c,[0,1,2])अगर मुझे याद है ...
चास ब्राउन

1

जेली , 30 बाइट्स

_ż+¥⁵AÞḢṠxAƊ×€ʋ"JṬ€$$Ẏ;@W}+\%⁵

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

एक डायडिक लिंक, जो अपने बाएं तर्क के रूप में अनलॉक कोड और इसके दाईं ओर वर्तमान लॉक स्थिति, दोनों पूर्णांकों की सूची के रूप में है।

यह बहुत लंबा लगता है!



1

चारकोल , 48 बाइट्स

θ≔EθIιθF³«≔⁻﹪⁺⁻I§ηι§θι⁵χ⁵ζF↔櫧≔θι﹪⁺§θι÷ζ↔ζχ⸿⪫θω

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। स्पष्टीकरण:

θ

प्रारंभिक स्थिति प्रिंट करें।

≔EθIιθ

गणना के उद्देश्यों के लिए संख्यात्मक अंकों की एक सरणी में प्रारंभिक स्थिति स्ट्रिंग बदलें।

F³«

बदले में प्रत्येक अंक पर लूप।

≔⁻﹪⁺⁻I§ηι§θι⁵χ⁵ζ

उस अंक को अनलॉक करने के लिए आवश्यक घुमावों की संख्या की गणना करें। यह एक संख्या -5है 4जहाँ से -55 नीचे की ओर घूमने का 4मतलब है और 4 ऊपर की ओर घूमने का मतलब है।

F↔ζ«

प्रत्येक घुमाव पर लूप।

§≔θι﹪⁺§θι÷ζ↔ζχ

रोटेशन के संकेत के अनुसार अंक को अपडेट करें।

⸿⪫θω

नई लाइन पर एक स्ट्रिंग के रूप में अंकों को आउटपुट करें।


1

टी-एसक्यूएल 2008, 170 बाइट्स

मैंने इसे पठनीय बनाने के लिए कुछ लाइनब्रेक जोड़े

DECLARE @1 char(3)='123',@2 char(3)='956'

DECLARE @r int,@s int,@ int=0
g:SET @+=1
h:SELECT @r=substring(@1,@,1)+9,@s=@r-substring(@2+'1',@,1)
IF @s=9GOTO g
PRINT @1
SET @1=stuff(@1,@,1,(@r+@s/5%2*2)%10)
IF @<4GOTO h

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


यह समाधान आउटपुट में अग्रणी 0 नहीं रखता है। उदाहरण: 000-999
मैथ्यू

1
@ मैथ्यू आप लगभग सही हैं, मैं इस बिल्ड को इनपुट विकल्प में उपयोग करने की उम्मीद कर रहा था, हालांकि, यदि आप इनपुट में 0 से शुरू करते हैं तो इसे इनपुट से हटा दिया जाएगा। यह समाधान नहीं है जो विफल रहता है
t-clausen.dk

1
@ मैथ्यू - यह अब btw तय है। इनपुट बॉक्स को हटा दिया, जो वैसे भी sql का हिस्सा नहीं है
t-clausen.dk



0

MATLAB, 100 89 बाइट्स

एक अलग दृष्टिकोण (घटाव मैट्रिक्स बनाने के लिए अंतर्निहित विस्तार का उपयोग करके) 11 बाइट्स को कम करता है:

function f(a,b);c = mod(a-b+5,10)-5;a,mod(a-cumsum(repelem(eye(3).*sign(c),abs(c),1)),10)

[मूल 100 बाइट समाधान]

function f(a,b);c=mod(a-b+5,10)-5;a,for n=1:3;for r=1:abs(c(n));a(n)=mod(a(n)-sign(c(n)),10),end;end

दोनों को 3-तत्व सरणियों के रूप में इनपुट पास करके बुलाया जाता है, जैसे f([9 1 1], [2 3 2])


0

जावा (JDK) , 139 बाइट्स

a->b->{for(int i;;a[i]+=(a[i]-b[i]+10)%10<5?9:1,a[i]%=10){System.out.println(""+a[i=0]+a[1]+a[2]);for(;i<3&&a[i]==b[i];i++);if(i>2)break;}}

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

हर किसी के रूप में एक ही एल्गोरिदम, अलग-अलग लुढ़का क्योंकि जावा System.out.printlnबहुत महंगा है!



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.