당신은 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 진 링크는 시작 코드에서 코드 목록 을 생성합니다. 대상 코드에.
어떻게?
_æ%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[]
답변
답변
파이썬 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 .
입력을 정수 목록으로 취합니다.