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 :, (