Java 149 160文字
義務:なぜなら...あなたが知っている... Java!150 161文字未満でJavaを楽しんでください。
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);}
クラスに属さない:
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);
}
}
使い方
まず、どこにでも移動する必要がない標準的なケースを捉えます。
これで両方の整数が異なると想定できるため、小さい方の整数のみが0になります。これが当てはまる場合は、キー1と2から他のキーまでの距離を計算します。距離が短い方を使用し、1または2から0に到達するために1つのステップを追加します。
ゼロに行きたくない場合は、3x3グリッド内を移動するだけです。それぞれmodまたはdivを使用して、キーの列と行を決定できます。次に、列と行の距離を計算して追加します。これは、あるキーから別のキーまでの距離です。
説明が理解できたらいいなと思います。気軽にゴルフをしてください:)
アップデート
ラムダでは不可能である再帰を使用するため、実際の関数に変更する必要がありました:、(