Déverrouiller votre serrure

34

Vous avez verrouillé votre vélo avec une serrure à combinaison à 3 chiffres. Maintenant, vous voulez aller faire un tour et vous devez le déverrouiller à l'aide du programme suivant.

Contribution

1er paramètre

La combinaison de chiffres de votre verrou en état verrouillé . Il doit être différent du 2ème paramètre (= la combinaison de déverrouillé état ). (Sinon, votre vélo pourrait être volé!)

Plage 000.,999. Les zéros au début ne doivent pas être omis.

2ème paramètre

La combinaison de chiffres de votre verrou à l' état déverrouillé . Cette valeur est votre objectif.

Plage 000.,999. Les zéros au début ne doivent pas être omis.

Sortie

Une liste de chaque état de la serrure à combinaison après chaque "rotation", y compris l'état initial (qui est toujours le premier paramètre) et la dernière étape (qui est toujours le deuxième paramètre).

Algorithme

Vous commencez à "faire tourner" le premier chiffre un par un jusqu'à ce que vous obteniez le chiffre correct dans l' état déverrouillé . Mais comme vous connaissez le code de déverrouillage complet, vous faites pivoter le chiffre dans le sens dans lequel vous avez besoin du plus petit nombre de rotations pour atteindre le chiffre en état déverrouillé. . En cas d'égalité, vous pouvez choisir la direction que vous préférez.

Lorsque vous avez atteint le premier chiffre correct, vous démarrez la même procédure avec le 2e puis avec le 3e.

L'ordre des chiffres est à comprendre comme un cercle:

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

Cela signifie que le plus petit nombre de rotations de 1 à 9 n’est pas

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

mais

1 -> 0 -> 9 = 2.

Remarques

Exemples

Exemple 1, correct

Input: 999 001

Output:
999
099
009
000
001

Exemple 2, correct

Input: 000 292

Output:
000
100
200
290
291
292

Exemple 3, mauvaise sortie

Input: 999 121

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

Correct output:
999
099
199
109
119
129
120
121

Exemple 4, mauvaise entrée

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

Ceci est le la réponse la plus courte gagne.

utilisateur2190035
la source
Puis-je changer l'ordre de deux paramètres?
tsh
Pouvons-nous mettre à jour les chiffres dans n'importe quel ordre tant que c'est optimal?
Arnauld
@Arnauld Non parce que je déverrouille mon verrou un à un :)
user2190035
2
@ Night2 Non, car le programme doit simuler le "processus de déverrouillage" d'un look combiné.
user2190035
6
Connexes
Luis Mendo

Réponses:

12

Python 2 , 113 107 105 99 95 octets

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

Essayez-le en ligne!

Prend les entrées sous forme de listes d'entiers


Enregistré:

  • -6 octets, merci à Joël
  • -4 octets, grâce à Jitse
TFeld
la source
2
99 octets en utilisant une autre façon de calculer.
Joel
@ Joël Merci! :)
TFeld
2
96 octets - bonus: fonctionne pour toute taille de tableau
Jitse
1
95 octets - puisque vous utilisez Python 2, vous risquez de perdre le//
Jitse
@Jitse Thanks :)
TFeld
6

Gelée , 15 octets

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

Un lien dyadique acceptant le code de début à gauche et le code-cible à droite sous forme de listes d’entiers (en [0,9], longueur égale mais arbitraire) qui produit une liste de listes de codes allant du code de début au code cible.

Essayez-le en ligne!

Comment?

_æ%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
la source
4

JavaScript (ES6),  73 72  70 octets

2 octets sauvés grâce à @tsh

Prend la saisie sous forme de 2 tableaux de chiffres en syntaxe curry (a)(b). Retourne une chaîne.

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

Essayez-le en ligne!

Commenté

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
la source
d/6&1^d>0||9->d/5>5/d?9:1
tsh
2

Gelée , 25 octets

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

Essayez-le en ligne!

Programme complet.

Erik le golfeur
la source
2

Python 2 , 101 97 octets

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

Essayez-le en ligne!

3 octets à Joël .

Prend les entrées sous forme de listes d'ints.

Chas Brown
la source
98 octets
Joel
1
@ Joel: Merci! En fait, puisque c'est Python 2, //c'est la même chose /, donc il y a un octet supplémentaire gagné.
Chas Brown
Cela ressemble exactement à la même approche que la réponse de @ TFeld , mais avec de légères modifications
Jitse
@ Jitse: Eh bien, nous avons tous deux modifié nos réponses. par exemple, il a commencé avec for x,y,i in zip(a,c,[0,1,2])si je me souviens ...
Chas Brown
1

Gelée , 30 octets

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

Essayez-le en ligne!

Un lien dyadique prenant comme argument de gauche le code de déverrouillage et à sa droite l'état de verrouillage actuel, les deux en tant que listes d'entiers.

Cela semble beaucoup trop long!

Nick Kennedy
la source
1

PHP , 114 octets

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;

Essayez-le en ligne!

Ma solution est probablement nulle, mais c'est le meilleur que je puisse penser pour le moment!

Nuit2
la source
1

Charbon de bois , 48 octets

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

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:

θ

Imprimer la position initiale.

≔EθIιθ

Modifiez la chaîne de position initiale en un tableau de chiffres numériques à des fins de calcul.

F³«

Boucle sur chaque chiffre à tour de rôle.

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

Calculez le nombre de rotations nécessaires pour déverrouiller ce chiffre. Il s’agit d’un nombre allant de -5à 4-5signifie 5 rotations vers le bas et 44 rotations vers le haut.

F↔ζ«

Boucle sur chaque rotation.

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

Mettez à jour le chiffre en fonction du signe de la rotation.

⸿⪫θω

Affiche les chiffres sous forme de chaîne sur une nouvelle ligne.

Neil
la source
1

T-SQL 2008, 170 octets

J'ai ajouté des sauts de ligne pour le rendre lisible

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

Essayez-le en ligne

t-clausen.dk
la source
Cette solution ne continue pas à précéder les 0 dans la sortie. Exemple: 000-999
Matthieu
1
@ Matthew, vous avez presque raison. J'espérais utiliser cette option d'entrée intégrée. Cependant, si vous commencez avec 0 en entrée, il sera supprimé de l'entrée. Ce n’est pas la solution qui échoue cependant
t-clausen.dk
1
@ Matthew - il est maintenant corrigé. Suppression des zones de saisie qui ne font pas partie de SQL de toute façon
t-clausen.dk
0

MATLAB, 100 89 octets

Une approche différente (utilisant le développement implicite pour créer une matrice de soustraction) réduit de 11 octets:

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

[Solution originale de 100 octets]

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

Appelés tous les deux en passant les entrées sous forme de tableaux à 3 éléments, par exemple f([9 1 1], [2 3 2])

Wolfie
la source
0

Java (JDK) , 139 octets

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

Essayez-le en ligne!

Même algorithme que tout le monde, roulé différemment car Java System.out.printlnest assez cher!

Olivier Grégoire
la source
0

C (clang) , 125 octets

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

Essayez-le en ligne!

AZTECCO
la source
0

Kotlin , 162 octets

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

Essayez-le en ligne!

JohnWells
la source