Öffne dein Schloss


34

Sie haben Ihr Fahrrad mit einem 3-stelligen Zahlenschloss gesperrt. Jetzt möchten Sie eine Fahrt machen und müssen diese mit Hilfe des folgenden Programms entsperren.

Eingang

1. Parameter

Die Ziffernkombination Ihres Schlosses im gesperrten Zustand. Es muss sich vom 2. Parameter unterscheiden (= die Kombination des entsperrten Zustands). (Sonst könnte dein Fahrrad gestohlen werden!)

Bereich 000..999. Führende Nullen dürfen nicht weggelassen werden.

2. Parameter

Die Ziffernkombination Ihres Schlosses im entsperrten Zustand. Dieser Wert ist Ihr Ziel.

Bereich 000..999. Führende Nullen dürfen nicht weggelassen werden.

Ausgabe

Eine Liste aller Zustände des Zahlenschlosses nach jeder "Drehung", einschließlich des Anfangszustands (der immer der 1. Parameter ist) und des letzten Schritts (der immer der 2. Parameter ist).

Algorithmus

Sie beginnen, die erste Ziffer einzeln zu "drehen", bis Sie im entsperrten Zustand die richtige Ziffer erreicht haben . Da Sie jedoch den gesamten Entsperrcode kennen, drehen Sie die Ziffer in die Richtung, in der Sie die geringste Anzahl von Umdrehungen benötigen, um die Ziffer im entsperrten Zustand zu erreichen . Bei einem Unentschieden können Sie die Richtung wählen, die Sie bevorzugen.

Wenn Sie die richtige erste Ziffer erreicht haben, beginnen Sie den gleichen Vorgang mit der 2. und dann mit der 3. Ziffer.

Die Reihenfolge der Ziffern ist als Kreis zu verstehen:

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

Dies bedeutet, dass die kleinste Anzahl von Umdrehungen von 1 bis 9 nicht ist

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

aber

1 -> 0 -> 9 = 2.

Anmerkungen

Beispiele

Beispiel 1, richtig

Input: 999 001

Output:
999
099
009
000
001

Beispiel 2, richtig

Input: 000 292

Output:
000
100
200
290
291
292

Beispiel 3, falsche Ausgabe

Input: 999 121

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

Correct output:
999
099
199
109
119
129
120
121

Beispiel 4, falsche Eingabe

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

Dies ist die kürzeste Antwort gewinnt.


Darf ich die Reihenfolge zweier Parameter ändern?
Dienstag,

Dürfen wir die Ziffern in beliebiger Reihenfolge aktualisieren, solange es optimal ist?
Arnauld

@ Arnauld Nein, weil ich mein Schloss eins nach dem anderen entsperre :)
user2190035

2
@ Night2 Nein, da das Programm den "Entsperrvorgang" eines Kombinationslooks simulieren soll.
user2190035

Antworten:


12

Python 2 , 113 107 105 99 95 Bytes

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

Probieren Sie es online!

Übernimmt Eingaben als Listen von ganzen Zahlen


Gerettet:

  • -6 Bytes, danke an Joel
  • -4 Bytes, danke an Jitse

2
99 Bytes auf eine andere Art zu berechnen.
Joel

@ Joel Danke! :)
TFeld

2
96 Bytes - Bonus: Funktioniert für jede Array-Größe
Jitse

1
95 Bytes - da Sie Python 2 verwenden, können Sie den//
Jitse

@Jitse Danke :)
TFeld

6

Gelee , 15 Bytes

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

[0,9]

Probieren Sie es online!

Wie?

_æ%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

JavaScript (ES6),  73 72  70 Byte

2 Bytes dank @tsh gespeichert

Nimmt die Eingabe als 2 Ziffernfelder in Curry-Syntax an (a)(b). Gibt eine Zeichenfolge zurück.

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

Probieren Sie es online!

Kommentiert

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

Python 2 , 101 97 Bytes

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

Probieren Sie es online!

3 Bytes Danke an Joel .

Nimmt Eingaben als Listen von Ints entgegen.



1
@ Joel: Danke! Da es sich um Python 2 handelt, //ist es dasselbe wie /, sodass ein zusätzliches Byte gewonnen wird.
Chas Brown

Dies sieht genauso aus wie die Antwort von @ TFeld , nur mit geringfügigen Änderungen
Jitse

@Jitse: Nun, wir haben beide unsere Antworten geändert. Zum Beispiel begann er mit, for x,y,i in zip(a,c,[0,1,2])wenn ich mich erinnere ...
Chas Brown

1

Gelee , 30 Bytes

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

Probieren Sie es online!

Ein dyadischer Link, der als linkes Argument den Entsperrcode und als rechtes den aktuellen gesperrten Zustand verwendet, beide als Listen von ganzen Zahlen.

Das fühlt sich viel zu lang an!


1

PHP , 114 Bytes

for([,$a,$b]=$argv;$i<3;($x=$a[$i]-$b[$i])?(print$a._).$a[$i]=($y=$a[$i]+(5/$x>$x/5?-1:1))<0?9:$y%10:++$i);echo$b;

Probieren Sie es online!

Meine Lösung ist wahrscheinlich zum Kotzen, aber das ist das Beste, was ich mir vorstellen kann!


1

Kohle , 48 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

θ

Drucken Sie die Ausgangsposition.

≔EθIιθ

Ändern Sie die anfängliche Positionszeichenfolge zu Berechnungszwecken in ein Array aus numerischen Ziffern.

F³«

Jede Ziffer der Reihe nach durchlaufen.

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

Berechnen Sie die Anzahl der Umdrehungen, die zum Entsperren dieser Ziffer erforderlich sind. Dies ist eine Zahl von -5bis, 4wobei -55 Abwärtsdrehungen und 44 Aufwärtsdrehungen gemeint sind.

F↔ζ«

Schleife über jede Umdrehung.

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

Aktualisieren Sie die Ziffer entsprechend dem Vorzeichen der Drehung.

⸿⪫θω

Geben Sie die Ziffern als Zeichenfolge in einer neuen Zeile aus.


1

T-SQL 2008, 170 Byte

Ich habe einige Zeilenumbrüche hinzugefügt, um die Anzeige lesbar zu machen

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

Probieren Sie es online aus


Bei dieser Lösung werden in der Ausgabe keine führenden Nullen angezeigt. Beispiel: 000-999
Matthew

1
@Matthew, Sie haben fast recht, ich hatte gehofft, diese eingebaute Eingabeoption zu verwenden. Wenn Sie jedoch mit 0 in der Eingabe beginnen, wird sie aus der Eingabe entfernt. Es ist jedoch nicht die Lösung, die fehlschlägt
t-clausen.dk

1
@Matthew - es ist nun übrigens behoben. Die Eingabefelder, die sowieso nicht Teil von SQL sind, wurden entfernt
t-clausen.dk



0

MATLAB, 100 89 Bytes

Ein anderer Ansatz (implizite Erweiterung zum Erstellen einer Subtraktionsmatrix) reduziert 11 Bytes:

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

[Ursprüngliche 100-Byte-Lösung]

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

Beide werden durch Übergabe der Eingänge als 3-Element-Arrays aufgerufen, z f([9 1 1], [2 3 2])


0

Java (JDK) , 139 Byte

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;}}

Probieren Sie es online!

Gleicher Algorithmus wie alle anderen, anders gerollt, weil Javas System.out.printlnziemlich teuer ist!



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.