Hitung Taksi Numpad

8

Kredit masuk ke tempat kredit jatuh tempo


Diberi dua digit, x, dan y, hitung lompatan horizontal atau vertikal terpendek untuk mendapatkan dari x ke y pada numpad standar, misalnya

789
456
123
00

Anda dapat dengan aman berasumsi bahwa semua input akan 0-9, dan Anda tidak harus menangani input yang tidak valid. Input mungkin nomor yang sama dua kali, yang memiliki jarak 0.

IO dapat dalam format apa pun yang masuk akal , dan celah standar dilarang. Jawaban terpendek dalam byte menang!

Sampel 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
James
sumber
Terkait
Dennis

Jawaban:

3

Jelly , 11 byte

o-1.’d3ạ/ḞS

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

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.
Dennis
sumber
Comeback yang bagus.
Leaky Nun
3

Python, 140 114 byte

Saya pengatur waktu pertama, jadi tolong bantu. Ini kode saya.

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)
TheRandomGuy
sumber
1
Beberapa tips: 1) gunakan spasi tunggal untuk indentasi, 2) letakkan tanda kurung di sekitar kondisi if, 3) singkirkan ruang dalam daftar argumen, 4) divmoddapat membantu Anda, 5) alih-alih if cond:return A\nelse:return B, lakukan return cond and A or B.
Mego
@Mego Bagaimana cara divmodmembantu? Saya tidak berpikir saya pernah menyimpan byte dengan itu
Sp3000
@ Sp3000 Mungkin Mego berarti bahwa dengan mendefinisikan (misalnya) p,q=divmod(x,3);r,s=divmod(y,3), Dhruv dapat menyimpan byte k(y//3-x//3)+k(y%3-x%3dengan mengubah ke k(r-p)+k(s-q). Selain itu, saya pikir Anda dapat menghapus intdan hanya memiliki(max(x,y)%3==2)
Sherlock9
2
@ Sherlock9 Masalahnya adalah, p,q=x//3,x%3selalu lebih baik daripada p,q=divmod(x,3), bahkan dalam Python 3
Sp3000
1
@DrGreenEggsandHamDJ Python lambdas tidak mendukung penugasan ganda. Dia akan kehilangan banyak byte tanpa definisi itu.
Sherlock9
2

JavaScript (ES6), 59

Sayangnya, tidak ada divmoddalam javascript. Bahkan, tidak ada bilangan bulat div, dan tidak ada mod: %tidak tepat mod. Tetapi untuk sekali, perilaku aneh %dengan angka negatif berguna.

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

Uji

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

edc65
sumber
Jadi, ini akhirnya menghitung seolah-olah 0berada di sebelah kiri dan 1bukan di bawahnya, dan kemudian (a*b%3<0)adalah penyesuaian licik untuk yang kedua 0. Bagus!
Neil
1

Pyth, 22 21 19 byte

FGITW.

L.D?b+2b.5 3ssaMCyM

Suite uji.

Tabel konversi:

0: [0.0, 0.5]
1: [1, 0]
2: [1, 1]
3: [1, 2]
4: [2, 0]
5: [2, 1]
6: [2, 2]
7: [3, 0]
8: [3, 1]
9: [3, 2]
Biarawati Bocor
sumber
1

Julia, 56 byte

x->sum(abs(-([[divrem(t>0?t+2:.5,3)...]for t=x]...)))÷1

Cobalah online!

Dennis
sumber
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

Uji di Ideone .

Bagaimana itu bekerja

  • Jarak vertikal

    Integer divisi selalu putaran bawah ke bilangan bulat terdekat dengan Python, menghasilkan hasil sebagai berikut untuk 10 dividen mungkin dibagi dengan -3 .

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

    Dengan demikian, kita dapat menghitung jarak vertikal antara x dan y sebagai abs(x/-3-y/-3).

  • Jarak horizontal

    Untuk kolom, kita dapat menghindari memperlakukan 0 sebagai kasus khusus dengan menggantinya dengan 1,5 , sehingga menempatkannya "antara" kolom pertama dan kedua.

    Modulus ( %) selalu memiliki tanda pembagi dalam Python, menghasilkan hasil berikut untuk 10 kemungkinan dividen modulo -3 .

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

    Jadi, dengan membulatkan ( //1) hasil abs((x or 1.5)%-3-(y or 1.5)%-3), kita dapat menghitung perbedaan horizontal antara x dan y .

Dennis
sumber
0

Jawa 149 160 karakter

Wajib: Karena ... Anda tahu ... Jawa! Bersenang-senang dengan Java di bawah 150 161 karakter:

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

Tidak digabung ke dalam kelas:

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

Bagaimana itu bekerja

Pertama-tama ia menangkap case standar di mana kita tidak harus pindah ke mana pun.

Sekarang kita dapat mengasumsikan bahwa kedua bilangan bulat berbeda, sehingga hanya yang lebih kecil yang dapat 0. Jika demikian, kami menghitung jarak dari kunci 1 dan 2 ke kunci lainnya. Kami akan menggunakan yang dengan jarak yang lebih pendek dan menambahkan satu langkah untuk mendapatkan dari 1 atau 2 ke 0.

Jika kita tidak ingin pergi ke / dari nol kita hanya perlu bergerak di kisi 3x3. Kita dapat menentukan kolom dan baris kunci dengan menggunakan mod atau div masing-masing. Kemudian kita menghitung jarak kolom dan baris dan menambahkannya. Ini adalah jarak yang perlu kita dapatkan dari satu kunci ke kunci lainnya.

Saya harap penjelasannya bisa dimengerti, silakan main golf :)

Pembaruan

Harus mengubahnya menjadi fungsi aktual karena menggunakan rekursi yang tidak mungkin dengan lambdas:, (

Frozn
sumber