Java 149 160 caracteres
O obrigatório: Porque ... você sabe ... Java! Divertir-se com Java em menos de 150 161 caracteres:
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 em uma classe:
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);
}
}
Como funciona
Primeiro, ele captura o caso padrão em que não precisamos ir a lugar algum.
Agora, podemos assumir que ambos os números inteiros diferem, portanto, apenas o menor pode ser 0. Se esse for o caso, calculamos a distância da chave 1 e 2 à outra chave. Usaremos o de menor distância e adicionaremos uma etapa para passar de 1 ou 2 a 0.
Se não queremos ir de / para zero, precisamos apenas mover-nos na grade 3x3. Podemos determinar a coluna e a linha da chave usando mod ou div, respectivamente. Depois calculamos a distância da coluna e da linha e as adicionamos. Essa é a distância que precisamos percorrer de uma chave para outra.
Espero que a explicação possa ser entendida, fique à vontade para jogar golfe :)
Atualizações
Teve que alterá-lo para uma função real, pois usa recursão que não é possível com lambdas:, (