Ö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.

user2190035
quelle
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
6
Related
Luis Mendo

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
TFeld
quelle
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)
Jonathan Allan
quelle
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[]
Arnauld
quelle
d/6&1^d>0||9->d/5>5/d?9:1
tsh
2

Gelee , 25 Bytes

_æ%5+⁹⁹rḊ€%⁵J;Ɱ"$ẎṄḢ}⁺¦¥ƒ

Probieren Sie es online!

Volles Programm.

Erik der Outgolfer
quelle
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.

Chas Brown
quelle
98 Bytes
Joel
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!

Nick Kennedy
quelle
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!

Night2
quelle
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.

Neil
quelle
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

t-clausen.dk
quelle
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])

Wolfie
quelle
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!

Olivier Grégoire
quelle
0

C (clang) , 125 Bytes

t,*d;f(*a,*b){for(t=d=a;t?printf("%d%d%d\n",*a,a[1],a[2]):d++,t=*d-b[d-a],d-a<3;*d=(*d+=!~*d*10)%10)t?*d+=(t+10)/5&1?1:-1:0;}

Probieren Sie es online!

AZTECCO
quelle
0

Kotlin , 162 Bytes

{s:Array<Int>,e:Array<Int>->var i=0
o@while(i<3){println(""+s[0]+s[1]+s[2])
while(s[i]==e[i]){if(i>1)break@o
i++}
s[i]=(s[i]+if((e[i]-s[i]+10)%10>5)9 else 1)%10}}

Probieren Sie es online!

JohnWells
quelle