잠금 해제 (항상 두 번째

당신은 3 자리 숫자의 자물쇠로 자전거를 잠갔습니다. 이제 당신은 타고 가서 다음 프로그램의 도움으로 잠금을 해제해야합니다.

입력

첫 번째 매개 변수

잠금 상태 의 잠금 숫자 조합 . 두 번째 매개 변수와 달라야합니다 (= 잠금 해제 상태 조합 ). (그렇지 않으면 자전거를 도난 당했을 수도 있습니다!)

범위는 000..999입니다. 선행 0은 생략하면 안됩니다.

두 번째 매개 변수

잠금 해제 상태 에서 잠금 의 숫자 조합 . 이 가치는 당신의 목표입니다.

범위는 000..999입니다. 선행 0은 생략하면 안됩니다.

산출

초기 상태 (항상 첫 번째 매개 변수 임)와 마지막 단계 (항상 두 번째 매개 변수 임)를 포함하여 각 “회전”후 콤비네이션 잠금의 각 상태 목록.

연산

잠금 해제 상태 에서 올바른 숫자에 도달 할 때까지 첫 번째 숫자를 하나씩 “회전”하기 시작 합니다. 그러나 전체 잠금 해제 코드 에 대해 알고 있으므로 잠금 해제 상태 의 숫자에 도달하기 위해 가장 작은 회전 횟수가 필요한 방향으로 숫자를 회전시킵니다 . 넥타이의 경우 원하는 방향을 선택할 수 있습니다.

올바른 첫 번째 숫자에 도달하면 두 번째 및 세 번째와 동일한 절차를 시작합니다.

숫자의 순서는 원으로 이해하는 것입니다.

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

노트

  • 기본 I / O 규칙 에 의존 할 수 있습니다
  • 매개 변수의 순서를 변경할 수 있습니다.

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

이것은 가장 짧은 답변이이기는 입니다.



답변

파이썬 (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

온라인으로 사용해보십시오!

정수 목록으로 입력을받습니다.


저장 됨 :

  • Joel 덕분에 -6 바이트
  • Jitse 덕분에 -4 바이트

답변

젤리 , 15 바이트

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

왼쪽의 시작 코드와 오른쪽의 대상 코드를 정수 목록 ( 에서는 길이는 동일하지만 임의의 길이 임)으로 허용하는 2 진 링크는 시작 코드에서 코드 목록 을 생성합니다. 대상 코드에.

[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)

답변

자바 스크립트 (ES6),  73 72  70 바이트

@tsh 덕분에 2 바이트 절약

커리 구문에서 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[]

답변

젤리 , 25 바이트

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

온라인으로 사용해보십시오!

전체 프로그램.


답변

파이썬 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

온라인으로 사용해보십시오!

Joel 에게 3 바이트 thx .

입력을 정수 목록으로 취합니다.


답변

젤리 , 30 바이트

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

온라인으로 사용해보십시오!

잠금 해제 코드의 왼쪽 인수와 오른쪽의 현재 잠금 상태를 모두 정수 목록으로 사용하는 2 진 링크.

너무 오래 느낀다!


답변

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;

온라인으로 사용해보십시오!

내 솔루션은 아마 짜증나지만 지금은 내가 생각할 수있는 최선입니다!