Розблокуйте свій замок


34

Ви заблокували свій велосипед комбінованим блокуванням у 3 цифри. Тепер ви хочете покататися і потрібно розблокувати його за допомогою наступної програми.

Вхідні дані

1-й параметр

Комбінація цифр вашого блокування в заблокованому стані. Він повинен відрізнятися від 2-го параметра (= поєднання стану, що розблокується ). (Інакше ваш велосипед може бути викрадений!)

Діапазон 000..999. Не слід опускати провідні нулі.

2-й параметр

Комбінація цифр вашого блокування у розблокованому стані. Ця цінність - ваша мета.

Діапазон 000..999. Не слід опускати провідні нулі.

Вихідні дані

Список кожного стану блокування комбінації після кожного "обертання", включаючи початковий стан (який завжди є першим параметром) та останній крок (який завжди є другим параметром).

Алгоритм

Ви починаєте "обертати" першу цифру по черзі, поки не досягнете правильної цифри у розблокованому стані. Але, оскільки ви знаєте весь код розблокування, ви обертаєте цифру в тому напрямку, в якому вам потрібна найменша кількість обертів, щоб досягти цифри в незамкненому стані . У разі краватки ви можете вибрати будь-який напрямок.

Досягнувши правильної першої цифри, ви починаєте ту саму процедуру з 2-ї, а потім з 3-ї.

Порядок цифр - це розуміти як коло:

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

Це означає, що найменшої кількості обертів від 1 до 9 немає

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

але

1 -> 0 -> 9 = 2.

Примітки

Приклади

Приклад 1, правильно

Input: 999 001

Output:
999
099
009
000
001

Приклад 2, правильно

Input: 000 292

Output:
000
100
200
290
291
292

Приклад 3, неправильний вихід

Input: 999 121

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

Correct output:
999
099
199
109
119
129
120
121

Приклад 4, неправильне введення

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

Це виграє найкоротший відповідь.


Чи можу я змінити порядок двох параметрів?
tsh

Чи можемо ми оновлювати цифри в будь-якому порядку, якщо це буде оптимально?
Арнольд

@Arnauld Ні, тому що я розблокував замок по черзі :)
user2190035

2
@ Night2 Ні, оскільки програма повинна імітувати "процес розблокування" комбінованого вигляду.
користувач2190035

Відповіді:


12

Python 2 , 113 107 105 99 95 байт

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

Спробуйте в Інтернеті!

Вводить дані як списки цілих чисел


Збережено:

  • -6 байт, завдяки Джоелу
  • -4 байти, завдяки Джице

2
99 байт, використовуючи інший спосіб обчислення.
Джоель

@Joel Дякую! :)
TFeld

2
96 байт - бонус: працює для будь-якого розміру масиву
Jitse

1
95 байт - оскільки ви використовуєте Python 2, можливо, втратите//
Jitse

@Jitse Спасибі :)
TFeld

6

Желе , 15 байт

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

[0,9] , довжини рівні, але в іншому випадку довільні), що дає список списків кодів із стартового коду націлити-код.

Спробуйте в Інтернеті!

Як?

_æ%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 байт

Збережено 2 байти завдяки @tsh

Вводить дані як 2 масиви цифр у витриманому синтаксисі (a)(b). Повертає рядок.

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

Спробуйте в Інтернеті!

Прокоментував

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 байт

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

Спробуйте в Інтернеті!

3 байти thx Джоелу .

Вводить дані як списки входів.



1
@Joel: Дякую! Насправді, оскільки це Python 2, //це те саме /, що є додатковий байт.
Час Браун

Це схоже на той самий підхід, що і у відповіді @ TFeld , але з незначними змінами
Jitse

@Jitse: Ну, ми обидва модифікували свої відповіді; наприклад, він почав з, for x,y,i in zip(a,c,[0,1,2])якщо я пригадую ...
Час Браун

1

Желе , 30 байт

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

Спробуйте в Інтернеті!

Дьядичне посилання, що в якості лівого аргументу бере код розблокування, а праворуч - поточний заблокований стан, обидва як списки цілих чисел.

Це відчувається занадто довго!


1

PHP , 114 байт

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;

Спробуйте в Інтернеті!

Моє рішення, ймовірно, відстійне, але це найкраще, про що я можу придумати зараз!


1

Вугілля деревне , 48 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

θ

Роздрукуйте початкове положення.

≔EθIιθ

Змініть початковий рядок позиції на масив числових цифр для цілей обчислення.

F³«

Переведіть по черзі кожну цифру.

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

Обчисліть кількість обертів, необхідних для розблокування цієї цифри. Це число від -5до , 4де -5означає 5 низхідних обертання і 4засіб 4 вгору обертань.

F↔ζ«

Петля над кожним обертанням.

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

Оновіть цифру відповідно до знака обертання.

⸿⪫θω

Виведіть цифри як рядок у новому рядку.


1

T-SQL 2008, 170 байт

Я додав кілька перерв рядків, щоб зробити його читабельним

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

Спробуйте в Інтернеті


Це рішення не підтримує 0 у виводі. Приклад: 000-999
Метью

1
@Matthew ви майже праві, я сподівався використати цю опцію збірки введення, однак, якщо ви почнете з 0 у введенні, він буде видалений із входу. Не вдалося вирішити це рішення, але не
вдалося

1
@Matthew - це тепер виправлено btw. Видалено вхідні поля, які так чи інакше не входять до sql
t-clausen.dk



0

MATLAB, 100 89 байт

Інший підхід (використання неявного розширення для створення матриці віднімання) зменшує 11 байт:

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

[Оригінальний 100-байтний розчин]

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

Обидва викликаються, передаючи входи у вигляді 3-елементних масивів, наприклад f([9 1 1], [2 3 2])




Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.