Mở khóa của bạn


34

Bạn đã khóa chiếc xe đạp của mình với khóa kết hợp gồm 3 chữ số. Bây giờ bạn muốn đi xe và cần mở khóa với sự trợ giúp của chương trình sau.

Đầu vào

Tham số 1

Sự kết hợp chữ số của khóa của bạn trong trạng thái khóa . Nó phải khác với tham số thứ 2 (= sự kết hợp của trạng thái đã mở khóa ). (Hoặc nếu không xe đạp của bạn có thể bị đánh cắp!)

Phạm vi 000..999. Các số 0 đứng đầu không được bỏ qua.

Tham số thứ 2

Sự kết hợp chữ số của khóa của bạn trong trạng thái mở khóa . Giá trị này là mục tiêu của bạn.

Phạm vi 000..999. Các số 0 đứng đầu không được bỏ qua.

Đầu ra

Danh sách từng trạng thái của khóa kết hợp sau mỗi lần "xoay" bao gồm trạng thái ban đầu (luôn luôn là tham số thứ 1) và bước cuối cùng (luôn luôn là tham số thứ 2).

Thuật toán

Bạn bắt đầu "xoay" từng chữ số đầu tiên cho đến khi bạn đạt được chữ số chính xác ở trạng thái mở khóa . Nhưng, vì bạn có kiến ​​thức về toàn bộ mã mở khóa, bạn xoay chữ số theo hướng bạn cần số vòng quay nhỏ nhất để đạt được chữ số ở trạng thái mở khóa . Trong trường hợp cà vạt, bạn có thể chọn bất cứ hướng nào bạn thích.

Khi bạn đã đạt được chữ số đầu tiên chính xác, bạn bắt đầu quy trình tương tự với số 2 và sau đó với số thứ ba.

Thứ tự của các chữ số là để hiểu như một vòng tròn:

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

Điều này có nghĩa là, số lượng vòng quay nhỏ nhất từ ​​1 đến 9 không phải là

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

nhưng

1 -> 0 -> 9 = 2.

Ghi chú

Ví dụ

Ví dụ 1, đúng

Input: 999 001

Output:
999
099
009
000
001

Ví dụ 2, đúng

Input: 000 292

Output:
000
100
200
290
291
292

Ví dụ 3, đầu ra sai

Input: 999 121

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

Correct output:
999
099
199
109
119
129
120
121

Ví dụ 4, nhập sai

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

Đây là câu trả lời ngắn nhất chiến thắng.


Tôi có thể thay đổi thứ tự của hai tham số không?
tsh

Chúng tôi có thể cập nhật các chữ số theo bất kỳ thứ tự nào miễn là tối ưu không?
Arnauld

@Arnauld Không vì tôi mở khóa từng cái một :)
user2190035

2
@ Night2 Không, vì chương trình sẽ mô phỏng "quá trình mở khóa" của giao diện kết hợp.
user2190035

Câu trả lời:


12

Python 2 , 113 107 105 99 95 byte

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

Hãy thử trực tuyến!

Lấy đầu vào là danh sách các số nguyên


Đã lưu:

  • -6 byte, nhờ Joel
  • -4 byte, nhờ Jitse

2
99 byte sử dụng một cách khác để tính toán.
Joel

@Joel Cảm ơn! :)
TFeld

2
96 byte - tiền thưởng: hoạt động cho mọi kích thước mảng
Jitse

1
95 byte - vì bạn đang sử dụng Python 2, có thể như Wel bị mất//
Jitse

@ Xin cảm ơn :)
TFeld

6

Thạch , 15 byte

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

[0,9] , độ dài bằng nhau nhưng khác tùy ý) sẽ đưa ra danh sách danh sách mã từ mã bắt đầu để mã đích.

Hãy thử trực tuyến!

Làm sao?

_æ%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 byte

Đã lưu 2 byte nhờ @tsh

Lấy đầu vào là 2 mảng chữ số theo cú pháp được uốn (a)(b). Trả về một chuỗi.

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

Hãy thử trực tuyến!

Đã bình luận

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 byte

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

Hãy thử trực tuyến!

3 byte thx để Joel .

Lấy đầu vào là danh sách các số nguyên.



1
@Joel: Cảm ơn! Trên thực tế, vì Python 2, //giống như /vậy, nên có một byte bổ sung.
Chas Brown

Điều này trông giống như cách tiếp cận chính xác như câu trả lời của @ TFeld , nhưng với những sửa đổi nhỏ
Jitse

@Jitse: Vâng, cả hai chúng tôi đã sửa đổi câu trả lời của chúng tôi; ví dụ, anh ấy bắt đầu với for x,y,i in zip(a,c,[0,1,2])nếu tôi nhớ lại ...
Chas Brown

1

Thạch , 30 byte

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

Hãy thử trực tuyến!

Một liên kết dyadic lấy làm đối số bên trái của nó mã mở khóa và bên phải của nó là trạng thái bị khóa hiện tại, cả hai như là danh sách các số nguyên.

Cảm giác này quá dài!


1

PHP , 114 byte

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;

Hãy thử trực tuyến!

Giải pháp của tôi có thể hút, nhưng đó là cách tốt nhất tôi có thể nghĩ đến bây giờ!


1

Than , 48 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

θ

In vị trí ban đầu.

≔EθIιθ

Thay đổi chuỗi vị trí ban đầu thành một mảng các chữ số cho mục đích tính toán.

F³«

Lặp lại lần lượt từng chữ số.

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

Tính số vòng quay cần thiết để mở khóa chữ số đó. Đây là một số từ -5đến 4nơi -5có nghĩa là 5 lần quay xuống và 4có nghĩa là 4 lần quay lên.

F↔ζ«

Vòng qua mỗi vòng quay.

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

Cập nhật chữ số theo dấu hiệu của vòng quay.

⸿⪫θω

Xuất các chữ số dưới dạng một chuỗi trên một dòng mới.


1

T-SQL 2008, 170 byte

Tôi đã thêm một số ngắt dòng để làm cho nó dễ đọc

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

Dùng thử trực tuyến


Giải pháp này không tiếp tục dẫn đầu 0 trong sản lượng. Ví dụ: 000-999
Matthew

1
@Matthew bạn gần như đúng, tôi đã hy vọng sử dụng tùy chọn đầu vào xây dựng này, tuy nhiên, nếu bạn bắt đầu bằng 0 trong đầu vào, nó sẽ bị xóa khỏi đầu vào. Tuy nhiên, đây không phải là giải pháp thất bại
t-clausen.dk

1
@Matthew - nó đã được sửa bây giờ btw. Đã xóa các hộp đầu vào không phải là một phần của sql
t-clausen.dk



0

MATLAB, 100 89 byte

Một cách tiếp cận khác (sử dụng mở rộng ngầm để tạo ma trận trừ) làm giảm 11 byte:

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

[Giải pháp 100 byte gốc]

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

Cả hai được gọi bằng cách chuyển các đầu vào dưới dạng mảng 3 phần tử, vd f([9 1 1], [2 3 2])


0

Java (JDK) , 139 byte

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

Hãy thử trực tuyến!

Thuật toán giống như mọi người, khác nhau vì Java System.out.printlnkhá đắt!



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.