Berechnen Sie das Numpad Taxicab


8

Kredit geht dahin, wo Kredit fällig ist


Berechnen Sie bei zwei Ziffern, x und y, die kürzeste Anzahl horizontaler oder vertikaler Sprünge, um auf einem Standard-Nummernblock von x nach y zu gelangen, z

789
456
123
00

Sie können davon ausgehen, dass alle Eingaben 0-9 sind und Sie keine ungültigen Eingaben verarbeiten müssen. Die Eingabe kann zweimal dieselbe Nummer sein, die einen Abstand von 0 hat.

E / A kann in jedem vernünftigen Format vorliegen , und Standardlücken sind verboten. Die kürzeste Antwort in Bytes gewinnt!

Beispiel 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

Antworten:


3

Gelee , 11 Bytes

o-1.’d3ạ/ḞS

Probieren Sie es online aus! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

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.

Cooles Comeback .
Undichte Nonne

3

Python, 140 114 Bytes

Ich bin ein Anfänger, also bitte helfen Sie. Hier ist mein Code.

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
Einige Tipps: 1) Verwenden Sie einzelne Leerzeichen für Einrückungen, 2) setzen Sie die Klammern um die if-Bedingung, 3) entfernen Sie das Leerzeichen in der Argumentliste, 4) divmodkönnen Sie helfen, 5) statt zu if cond:return A\nelse:return Btun return cond and A or B.
Mego

@ Mego Wie divmodhilft? Ich glaube nicht, dass ich jemals Bytes damit gespeichert habe
Sp3000

@ Sp3000 Vielleicht bedeutet Mego, dass p,q=divmod(x,3);r,s=divmod(y,3)Dhruv durch Definieren (zum Beispiel) Bytes einsparen könnte, k(y//3-x//3)+k(y%3-x%3indem er zu wechselt k(r-p)+k(s-q). Darüber hinaus denke ich, dass Sie entfernen können intund nur haben(max(x,y)%3==2)
Sherlock9

2
@ Sherlock9 Die Sache ist, p,q=x//3,x%3ist immer besser als p,q=divmod(x,3), auch in Python 3
Sp3000

1
@DrGreenEggsandHamDJ Python-Lambdas unterstützen keine Mehrfachzuweisung. Ohne diese Definitionen würde er viele Bytes verlieren.
Sherlock9


2

JavaScript (ES6), 59

Leider nicht divmodin Javascript. In der Tat keine ganze Zahl divund auch keine mod: das %ist nicht genau mod. Aber ausnahmsweise ist das seltsame Verhalten %mit negativen Zahlen nützlich.

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

Prüfung

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


Dies führt also dazu, dass berechnet wird, als ob 0es links von und 1nicht darunter liegt, und dann (a*b%3<0)ist dies die hinterhältige Anpassung für die Sekunde 0. Nett!
Neil

1

Pyth, 22 21 19 Bytes

FGITW.

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

Testsuite.

Umrechnungstabelle:

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]


1

Python 2, 61 Bytes

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

Testen Sie es auf Ideone .

Wie es funktioniert

  • Vertikale Entfernung

    Ganzzahlige Teilung immer rund nach unten auf die nächste ganze Zahl in Python, was die folgenden Ergebnisse für die 10 möglichen Dividenden geteilt durch -3 .

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

    Somit können wir den vertikalen Abstand zwischen x und y als berechnen abs(x/-3-y/-3).

  • Horizontaler Abstand

    Bei Spalten können wir vermeiden, 0 als Sonderfall zu behandeln , indem wir sie durch 1,5 ersetzen und sie so "zwischen" der ersten und zweiten Spalte platzieren.

    Modulus ( %) hat in Python immer das Vorzeichen des Divisors und liefert die folgenden Ergebnisse für die 10 möglichen Dividenden modulo -3 .

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

    Durch Abrunden ( //1) des Ergebnisses von abs((x or 1.5)%-3-(y or 1.5)%-3)können wir also die horizontale Differenz zwischen x und y berechnen .


0

Java 149 160 Zeichen

Das obligatorische: Weil ... du weißt ... Java! Spaß mit Java in weniger als 150 161 Zeichen:

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 in eine Klasse:

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

Wie es funktioniert

Zuerst wird der Standardfall erfasst, in dem wir uns nirgendwo bewegen müssen.

Nun können wir annehmen, dass sich beide Ganzzahlen unterscheiden, daher kann nur die kleinere 0 sein. Wenn dies der Fall ist, berechnen wir den Abstand von Schlüssel 1 und 2 zum anderen Schlüssel. Wir werden den mit dem kürzeren Abstand verwenden und einen Schritt hinzufügen, um von 1 oder 2 auf 0 zu gelangen.

Wenn wir nicht auf / von Null gehen wollen, müssen wir uns nur im 3x3-Gitter bewegen. Wir können die Spalte und Zeile des Schlüssels mit mod bzw. div bestimmen. Dann berechnen wir den Spalten- und Zeilenabstand und addieren sie. Dies ist die Entfernung, die wir von einem Schlüssel zum anderen benötigen.

Ich hoffe die Erklärung konnte verstanden werden, zögern Sie nicht Golf zu spielen :)

Aktualisierung

Musste es in eine tatsächliche Funktion ändern, da es eine Rekursion verwendet, die mit Lambdas nicht möglich ist :, (

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.