Desbloqueie seu bloqueio

34

Você bloqueou sua bicicleta com uma trava combinada de 3 dígitos. Agora você quer dar um passeio e precisa desbloqueá-lo com a ajuda do programa a seguir.

Entrada

1º parâmetro

A combinação de dígitos do seu bloqueio no estado bloqueado . Ele deve ser diferente do segundo parâmetro (= a combinação do estado desbloqueado ). (Ou sua bicicleta pode ser roubada!)

Intervalo 000..999. Os zeros à esquerda não devem ser omitidos.

Segundo parâmetro

A combinação de dígitos do seu bloqueio no estado desbloqueado . Esse valor é seu objetivo.

Intervalo 000..999. Os zeros à esquerda não devem ser omitidos.

Saída

Uma lista de cada estado do bloqueio de combinação após cada "rotação", incluindo o estado inicial (que é sempre o 1º parâmetro) e a última etapa (que é sempre o 2º paramater).

Algoritmo

Você começa a "girar" o primeiro dígito, um por um, até atingir o dígito correto no estado desbloqueado . Mas, como você conhece todo o código de desbloqueio, você gira o dígito na direção em que precisa da menor quantidade de rotações para alcançar o dígito no estado desbloqueado . Em caso de empate, você pode escolher a direção que preferir.

Quando você alcança o primeiro dígito correto, inicia o mesmo procedimento com o 2º e depois com o 3º.

A ordem dos dígitos é entender como um círculo:

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

Isso significa que a menor quantidade de rotações de 1 a 9 não é

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

mas

1 -> 0 -> 9 = 2.

Notas

Exemplos

Exemplo 1, correto

Input: 999 001

Output:
999
099
009
000
001

Exemplo 2, correto

Input: 000 292

Output:
000
100
200
290
291
292

Exemplo 3, saída incorreta

Input: 999 121

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

Correct output:
999
099
199
109
119
129
120
121

Exemplo 4, entrada incorreta

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

Este é o a resposta mais curta ganha.

user2190035
fonte
Posso alterar a ordem dos dois parâmetros?
tsh
Podemos atualizar os dígitos em qualquer ordem, desde que seja ideal?
Arnauld
@Arnauld Não, porque eu desbloqueio meu bloqueio, um por um :)
user2190035 em 26/08
2
@ Night2 Não, pois o programa deve simular o "processo de desbloqueio" de uma aparência combinada.
user2190035
6
Related
Luis Mendo

Respostas:

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

Experimente online!

Recebe entrada como listas de números inteiros


Salvou:

  • -6 bytes, graças a Joel
  • -4 bytes, graças ao Jitse
TFeld
fonte
2
99 bytes usando uma maneira diferente de calcular.
Joel
@ Joel Thanks! :)
TFeld 27/08
2
96 bytes - bônus: funciona para qualquer tamanho de matriz
Jitse 27/08
1
95 bytes - como você está usando o Python 2, também pode perder o//
Jitse
@Jitse Thanks :)
TFeld
6

Gelatina , 15 bytes

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

[0 0,9]

Experimente online!

Quão?

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

JavaScript (ES6),  73 72  70 bytes

Guardado 2 bytes graças a @tsh

Recebe a entrada como 2 matrizes de dígitos na sintaxe ao curry (a)(b). Retorna uma string.

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

Experimente online!

Comentado

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

Gelatina , 25 bytes

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

Experimente online!

Programa completo.

Erik, o Outgolfer
fonte
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

Experimente online!

3 bytes thx para Joel .

Recebe entradas como listas de entradas.

Chas Brown
fonte
98 bytes
Joel
1
@ Joel: Obrigado! Na verdade, como é o Python 2, //é o mesmo /, então há um byte adicional ganho.
Chas Brown
Isso parece exatamente a mesma abordagem que a resposta do @ TFeld , mas com pequenas modificações
Jitse em
@Jitse: Bem, nós dois estamos modificando nossas respostas; por exemplo, ele começou com, for x,y,i in zip(a,c,[0,1,2])se bem me lembro ...
Chas Brown
1

Gelatina , 30 bytes

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

Experimente online!

Um link diádico que toma como argumento esquerdo o código de desbloqueio e o estado bloqueado atual, ambos como listas de números inteiros.

Parece demais!

Nick Kennedy
fonte
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;

Experimente online!

Minha solução provavelmente é péssima, mas é o melhor que consigo pensar por enquanto!

Night2
fonte
1

Carvão , 48 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

θ

Imprima a posição inicial.

≔EθIιθ

Altere a string da posição inicial em uma matriz de dígitos numéricos para fins de cálculo.

F³«

Faça um loop sobre cada dígito por vez.

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

Calcule o número de rotações necessárias para desbloquear esse dígito. Este é um número a partir de -5a 4, onde -5significa 5 rotações para baixo e 4meios 4 rotações para cima.

F↔ζ«

Faça um loop sobre cada rotação.

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

Atualize o dígito de acordo com o sinal da rotação.

⸿⪫θω

Produza os dígitos como uma sequência em uma nova linha.

Neil
fonte
1

T-SQL 2008, 170 bytes

Adicionei algumas quebras de linha para torná-lo legível

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

Experimente online

t-clausen.dk
fonte
Esta solução não mantém os 0's iniciais na saída. Exemplo: 000-999
Matthew
1
@ Matthew, você está quase certo, eu esperava usar esta opção de compilação na entrada, no entanto, se você começar com 0 na entrada, ele será removido da entrada. Não é a solução que falha embora
t-clausen.dk
1
@ Matthew - é corrigido agora btw. Removidas as caixas de entrada que não fazem parte do sql de qualquer maneira
t-clausen.dk
0

MATLAB, 100 89 bytes

Uma abordagem diferente (usando expansão implícita para criar uma matriz de subtração) reduz 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)

[Solução original de 100 bytes]

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

Ambos chamados passando as entradas como matrizes de 3 elementos, por exemplo f([9 1 1], [2 3 2])

Wolfie
fonte
0

Java (JDK) , 139 bytes

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

Experimente online!

O mesmo algoritmo que todos, rolou de maneira diferente porque o Java System.out.printlné muito caro!

Olivier Grégoire
fonte
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;}

Experimente online!

AZTECCO
fonte
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}}

Experimente online!

JohnWells
fonte