Odblokuj swoją blokadę


34

Zablokowałeś swój rower 3-cyfrowym zamkiem szyfrowym. Teraz chcesz wybrać się na przejażdżkę i odblokować ją za pomocą następującego programu.

Wkład

1. parametr

Kombinacja cyfr zamka w stanie zablokowanym . Musi różnić się od drugiego parametru (= kombinacja stanu odblokowanego ). (Albo twój rower może zostać skradziony!)

Zakres 000..999. Zera wiodącego nie można pominąć.

2. parametr

Kombinacja cyfr zamka w stanie odblokowanym . Ta wartość jest twoim celem.

Zakres 000..999. Zera wiodącego nie można pominąć.

Wydajność

Lista każdego stanu zamka szyfrowego po każdym „obrocie”, w tym stan początkowy (który zawsze jest pierwszym parametrem) i ostatni krok (który zawsze jest drugim parametrem).

Algorytm

Zaczynasz „obracać” pierwszą cyfrę jeden po drugim, aż do uzyskania prawidłowej cyfry w stanie odblokowanym . Ponieważ jednak znasz cały kod odblokowujący, obracasz cyfrę w kierunku, w którym potrzebujesz najmniejszej liczby obrotów, aby osiągnąć cyfrę w stanie odblokowanym . W przypadku remisu możesz wybrać dowolny kierunek.

Po osiągnięciu poprawnej pierwszej cyfry rozpocznij tę samą procedurę od drugiej, a następnie od trzeciej.

Kolejność cyfr należy rozumieć jako okrąg:

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

Oznacza to, że najmniejsza liczba obrotów od 1 do 9 nie jest

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

ale

1 -> 0 -> 9 = 2

Notatki

Przykłady

Przykład 1, poprawny

Input: 999 001

Output:
999
099
009
000
001

Przykład 2, poprawny

Input: 000 292

Output:
000
100
200
290
291
292

Przykład 3, złe wyjście

Input: 999 121

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

Correct output:
999
099
199
109
119
129
120
121

Przykład 4, nieprawidłowe wprowadzanie

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

To jest wygrywa najkrótsza odpowiedź.


Czy mogę zmienić kolejność dwóch parametrów?
tsh

Czy możemy aktualizować cyfry w dowolnej kolejności, o ile jest to optymalne?
Arnauld

@Arnauld Nie, ponieważ odblokowuję blokadę jeden po drugim :)
user2190035

2
@ Night2 Nie, ponieważ program powinien symulować „proces odblokowania” wyglądu kombinacji.
user2190035

Odpowiedzi:


12

Python 2 , 113 107 105 99 95 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako listy liczb całkowitych


Zapisano:

  • -6 bajtów, dzięki Joel
  • -4 bajty, dzięki Jitse

2
99 bajtów przy użyciu innego sposobu obliczania.
Joel

@Joel Thanks! :)
TFeld

2
96 bajtów - bonus: działa dla dowolnej wielkości tablicy
Jitse

1
95 bajtów - ponieważ używasz języka Python 2, równie dobrze możesz stracić//
Jitse

@Jitse Thanks :)
TFeld

6

Galaretka , 15 bajtów

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

[0,9]

Wypróbuj online!

W jaki sposób?

_æ%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 bajtów

Zaoszczędzono 2 bajty dzięki @tsh

Pobiera dane wejściowe jako 2 tablice cyfr w składni curry (a)(b). Zwraca ciąg.

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

Wypróbuj online!

Skomentował

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 bajtów

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

Wypróbuj online!

3 bajty dzięki Joelowi .

Pobiera dane wejściowe jako listy int.



1
@Joel: Dzięki! W rzeczywistości, ponieważ jest to Python 2, //jest taki sam jak /, więc uzyskano dodatkowy bajt.
Chas Brown

To wygląda dokładnie tak samo jak odpowiedź @ TFeld , ale z niewielkimi modyfikacjami
Jitse

@Jitse: Cóż, oboje modyfikujemy nasze odpowiedzi; na przykład zaczął, for x,y,i in zip(a,c,[0,1,2])jeśli pamiętam ...
Chas Brown

1

Galaretka , 30 bajtów

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

Wypróbuj online!

Dyadyczny link przyjmujący za lewy argument kod odblokowujący, a po prawej bieżący stan zablokowany, oba jako listy liczb całkowitych.

To wydaje się zbyt długie!


1

PHP , 114 bajtów

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;

Wypróbuj online!

Moje rozwiązanie prawdopodobnie jest do bani, ale to najlepsze, o czym mogę teraz myśleć!


1

Węgiel drzewny , 48 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

θ

Wydrukuj pozycję początkową.

≔EθIιθ

Zmień ciąg pozycji początkowej na tablicę cyfr numerycznych do celów obliczeniowych.

F³«

Zapętlaj kolejno każdą cyfrę.

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

Oblicz liczbę obrotów potrzebną do odblokowania tej cyfry. Jest liczbą od -5na 4którym -5oznacza 5 obrotach dół oraz 4urządzenia 4 obroty w górę.

F↔ζ«

Pętla nad każdym obrotem.

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

Zaktualizuj cyfrę zgodnie ze znakiem obrotu.

⸿⪫θω

Wypisz cyfry jako ciąg znaków w nowym wierszu.


1

T-SQL 2008, 170 bajtów

Dodałem kilka podziałów liniowych, aby były czytelne

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

Wypróbuj online


To rozwiązanie nie utrzymuje wiodących zer na wyjściu. Przykład: 000-999
Mateusz

1
@Mathew masz prawie rację, miałem nadzieję użyć tej wbudowanej opcji wprowadzania, jednak jeśli zaczniesz od 0 na wejściu, zostanie ona usunięta z wejścia. Nie jest to jednak rozwiązanie, które zawodzi
t-clausen.dk

1
@Matthew - jest teraz naprawione btw. Usunięto pola wprowadzania, które i tak nie są częścią sql
t-clausen.dk



0

MATLAB, 100 89 bajtów

Inne podejście (użycie niejawnego rozszerzenia do utworzenia macierzy odejmowania) zmniejsza 11 bajtów:

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

[Oryginalne rozwiązanie 100 bajtów]

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

Oba są wywoływane przez przekazywanie danych wejściowych jako tablice 3-elementowe, np f([9 1 1], [2 3 2])


0

Java (JDK) , 139 bajtów

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

Wypróbuj online!

Ten sam algorytm, co wszyscy, działał inaczej, ponieważ Java System.out.printlnjest dość droga!



0

Kotlin , 162 bajty

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

Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.