잠금 해제


34

당신은 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.

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


두 매개 변수의 순서를 변경할 수 있습니까?
tsh

최적의 숫자 만 순서대로 업데이트 할 수 있습니까?
Arnauld

@Arnauld 아니요 잠금을 하나씩 잠금 해제하기 때문에 :)
user2190035

2
@ Night2 아니요, 프로그램은 조합 모양의 "잠금 해제 프로세스"를 시뮬레이션해야하므로.
user2190035

답변:


12

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

2
다른 방법으로 계산하는 99 바이트
조엘

@Joel 감사합니다! :)
TFeld

2
96 바이트 -보너스 : 모든 어레이 크기에서 작동
Jitse

1
95 바이트 -파이썬 2를 사용하고 있기 때문에, //
Jitse

@Jitse Thanks :)
TFeld

6

젤리 , 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)

4

자바 스크립트 (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[]

d/6&1^d>0||9->d/5>5/d?9:1
tsh


2

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

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



1
@Joel : 감사합니다! 실제로 파이썬 2이기 때문에 //와 동일 /하므로 추가 바이트가 생깁니다.
Chas Brown

이것은 @TFeld의 답변 과 똑같은 접근법처럼 보이지만 약간 수정되었습니다.
Jitse

@Jitse : 글쎄, 우리는 우리의 답변을 수정했습니다. 예를 들어, for x,y,i in zip(a,c,[0,1,2])내가 기억한다면 그는 시작했습니다 .
Chas Brown


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§ηι§θι⁵χ⁵ζ

해당 숫자의 잠금을 해제하는 데 필요한 회전 수를 계산하십시오. 이것으로부터 번호 -54여기서 -55 하방 회전 수단은 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
Matthew

1
@Matthew 당신은 거의 옳았습니다. 입력 옵션 에서이 빌드를 사용하고 싶었지만 입력에서 0으로 시작하면 입력에서 제거됩니다. 그래도 실패하는 솔루션은 아닙니다
t-clausen.dk

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




당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.