Tính toán Numpad Taxicab


8

Tín dụng đi nơi tín dụng đến hạn


Cho hai chữ số, x và y, tính số lần nhảy ngang hoặc dọc ngắn nhất để có được từ x đến y trên một bàn phím tiêu chuẩn, ví dụ:

789
456
123
00

Bạn có thể giả định một cách an toàn rằng tất cả các đầu vào sẽ là 0-9 và bạn không phải xử lý các đầu vào không hợp lệ. Đầu vào có thể là cùng một số hai lần, có khoảng cách bằng 0.

IO có thể ở bất kỳ định dạng hợp lý nào , và các lỗ hổng tiêu chuẩn đều bị cấm. Câu trả lời ngắn nhất trong byte chiến thắng!

Mẫu IO:

1, 4: 1
1, 8: 3
3, 7: 4
8, 2: 2
6, 1: 3
0, 9: 4
4, 4: 0
0, 4: 2

Câu trả lời:


3

Thạch , 11 byte

o-1.’d3ạ/ḞS

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

o-1.’d3ạ/ḞS  Main link. Argument: [a, b] (list of integers)

 -1.         Yield -1.5.
o            Take the logical OR of a and b with -1.5.
             This maps 0 to -1.5, and all other integers to themselves.
    ’        Decrement the results.
     d3      Divmod; compute quotient and remainder of each result divided by 3.
       ạ/    Reduce by absolute difference across columns.
         Ḟ   Floor; round all differences down to the nearest integer.
          S  Sum; add the rounded absolute differences.

Sự trở lại đẹp .
Nữ tu bị rò rỉ

3

Python, 140 114 byte

Tôi là một bộ đếm thời gian đầu tiên, vì vậy xin vui lòng giúp đỡ. Đây là mã của tôi.

def f(x,y):x,y,k=x-1,y-1,abs;return x!=-1 and y!=-1 and k(y//3-x//3)+k(y%3-x%3) or k(y//3-x//3)+int(max(x,y)%3==2)

1
Một số mẹo: 1) sử dụng các khoảng trắng đơn cho thụt lề, 2) bỏ dấu ngoặc quanh điều kiện if, 3) loại bỏ khoảng trắng trong danh sách đối số, 4) divmodcó thể giúp bạn, 5) thay vì if cond:return A\nelse:return Blàm return cond and A or B.
Mego

@Mego Làm thế nào để divmodgiúp đỡ? Tôi không nghĩ rằng tôi đã từng lưu byte với điều đó
Sp3000

@ Sp3000 Có lẽ Mego có nghĩa là bằng cách xác định (ví dụ) p,q=divmod(x,3);r,s=divmod(y,3), Dhruv có thể lưu byte k(y//3-x//3)+k(y%3-x%3bằng cách thay đổi thành k(r-p)+k(s-q). Ngoài ra, tôi nghĩ bạn có thể xóa intvà chỉ cần có(max(x,y)%3==2)
Sherlock9

2
@ Sherlock9 Điều này p,q=x//3,x%3luôn luôn tốt hơn p,q=divmod(x,3), ngay cả trong Python 3
Sp3000

1
@DrGreenEggsand HamDJ Python lambdas không hỗ trợ nhiều nhiệm vụ. Anh ta sẽ mất rất nhiều byte nếu không có những định nghĩa đó.
Sherlock9


2

JavaScript (ES6), 59

Thật không may, không có divmodtrong javascript. Trong thực tế, không có số nguyên divvà cũng không modcó: %không chính xác mod. Nhưng lần đầu tiên, hành vi kỳ lạ %với số âm là hữu ích.

(a,b,A=Math.abs)=>A(~(--a/3)-~(--b/3))+A(a%3-b%3)-(a*b%3<0)

Kiểm tra

f=(a,b,A=Math.abs)=>A(~(--a/3)-~(--b/3))+A(a%3-b%3)-(a*b%3<0)

for(i=0;i<10;console.log(r),i++)
  for(r='',j=0;j<10;j++)
    r+=[i,j,f(i,j)]+' '


Vì vậy, điều này kết thúc việc tính toán như thể 0ở bên trái 1thay vì bên dưới nó, và sau đó (a*b%3<0)là điều chỉnh lén lút cho lần thứ hai 0. Đẹp!
Neil



1

Python 2, 61 byte

lambda x,y:abs(x/-3-y/-3)+abs((x or 1.5)%-3-(y or 1.5)%-3)//1

Kiểm tra nó trên Ideone .

Làm thế nào nó hoạt động

  • Khoảng cách dọc

    Phân chia số nguyên luôn làm tròn xuống số nguyên gần nhất trong Python, thu được các kết quả sau cho 10 cổ tức có thể chia cho -3 .

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

    Do đó, chúng ta có thể tính khoảng cách dọc giữa xyabs(x/-3-y/-3).

  • Khoảng cách ngang

    Đối với các cột, chúng ta có thể tránh coi 0 là trường hợp đặc biệt bằng cách thay thế nó bằng 1,5 , do đó đặt nó "giữa" cột thứ nhất và cột thứ hai.

    Modulus ( %) luôn có dấu của ước số trong Python, mang lại kết quả sau cho 10 modulo cổ tức có thể có -3 .

       0  1  2  3  4  5  6  7  8  9
    -1.5 -2 -1  0 -2 -1  0 -2 -1  0
    

    Do đó, bằng cách làm tròn xuống ( //1) kết quả của abs((x or 1.5)%-3-(y or 1.5)%-3), chúng ta có thể tính toán sự khác biệt theo chiều ngang giữa xy .


0

Java 149 160 ký tự

Điều bắt buộc: Bởi vì ... bạn biết ... Java! Vui chơi với Java dưới 150 161 ký tự:

int d(int f,int t){if(f==t)return 0;if(Math.min(f,t)==0){int m=Math.max(f,t);return Math.min(d(1,m),d(2,m))+1;}return Math.abs(--t%3- --f%3)+Math.abs(t/3-f/3);}

Ungolfed vào một lớp học:

public class Q80357 {

    static int distance(int from, int to) {
        if (from == to)
            return 0;
        if (Math.min(from, to) == 0) {
            int max = Math.max(from, to);
            return Math.min(distance(1, max), distance(2, max)) + 1;
        }
        return Math.abs(--to % 3 - --from % 3) + Math.abs(to / 3 - from / 3);
    }
}

Làm thế nào nó hoạt động

Đầu tiên, nó bắt được trường hợp tiêu chuẩn mà chúng ta không phải di chuyển bất cứ nơi nào.

Bây giờ chúng ta có thể giả sử rằng cả hai số nguyên khác nhau, do đó chỉ có số nguyên nhỏ hơn có thể bằng 0. Nếu đây là trường hợp chúng ta tính khoảng cách từ khóa 1 và 2 đến khóa khác. Chúng tôi sẽ sử dụng một với khoảng cách ngắn hơn và thêm một bước để có được từ 1 hoặc 2 đến 0.

Nếu chúng ta không muốn đi đến / từ số 0, chúng ta chỉ phải di chuyển trong lưới 3x3. Chúng ta có thể xác định cột và hàng của khóa bằng cách sử dụng mod hoặc div tương ứng. Sau đó, chúng tôi tính toán khoảng cách cột và hàng và thêm chúng. Đây là khoảng cách chúng ta cần để đi từ khóa này đến khóa khác.

Tôi hy vọng lời giải thích có thể được hiểu, hãy chơi golf :)

Cập nhật

Phải thay đổi nó thành một hàm thực tế vì nó sử dụng đệ quy không thể có với lambdas :, (

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.