Numpad Taxicabを計算する


8

クレジットは、クレジットが期限のある場所に移動します


xとyの2桁を指定して、標準のテンキーでxからyに到達するための水平または垂直ジャンプの最短数を計算します。たとえば、

789
456
123
00

すべての入力が0〜9であると想定でき、無効な入力を処理する必要はありません。入力は、距離が0の同じ数値を2回使用できます。

IOは任意の適切な形式することができ、標準の抜け穴は禁止されています。バイト単位の最短の答えが勝ちます!

サンプル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

回答:


3

ゼリー、11 バイト

o-1.’d3ạ/ḞS

オンラインでお試しください!またはすべてのテストケースを確認します

使い方

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.

素敵なカムバック。
Leaky Nun、

3

Python、140 114バイト

私は初めてのタイマーなので、助けてください。これが私のコードです。

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
いくつかのヒント:1)インデントに単一のスペースを使用する、2)if条件の周りに括弧をドロップする、3)引数リストのスペースを取り除く、4)divmod役立つかもしれない、5)ではなくif cond:return A\nelse:return B、行うreturn cond and A or B
Mego 2016年

@Megoどのようにdivmod役立ちますか?これでバイトを節約したことはないと思います
Sp3000

@ Sp3000おそらくMegoは、たとえばを定義することによりp,q=divmod(x,3);r,s=divmod(y,3)、Dhruvがにk(y//3-x//3)+k(y%3-x%3変更することでバイトを節約できることを意味しますk(r-p)+k(s-q)。また、私はあなたが削除することができると思うintし、ちょうど持っている(max(x,y)%3==2)
Sherlock9

2
@ Sherlock9問題は、Python 3でもp,q=x//3,x%3常により優れているp,q=divmod(x,3)
Sp3000

1
@DrGreenEg​​gsandHamDJ Pythonラムダは複数割り当てをサポートしていません。それらの定義がなければ、彼は多くのバイトを失うでしょう。
Sherlock9


2

JavaScript(ES6)、59

残念ながら、divmodJavaScriptにはありません。実際、整数もdivmodどちらも%ありませんmod。これは正確ではありません。しかし、最初は%、負の数を使用した奇妙な動作が役立ちます。

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

テスト

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


したがって、これはあたかも下で01なく左側にあるかのように計算され、次に(a*b%3<0)2番目のの卑劣な調整になり0ます。いいね!
ニール、



1

Python 2、61バイト

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

Ideoneでテストします。

使い方

  • 垂直距離

    整数除算は常にPythonで最も近い整数に切り捨てられ、可能な10の被除数を-3で除算した結果は次のようになります。

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

    したがって、xyの間の垂直距離をとして計算できabs(x/-3-y/-3)ます。

  • 水平距離

    列の場合、01.5に置き換えて、最初の列と2番目の列の「間に」配置することで、0を特別なケースとして扱うことを回避できます。

    Modulus(%)は常にPythonの除数の符号を持ち、-3を法とする10の可能な被除数に対して次の結果をもたらします。

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

    したがって、//1の結果を切り捨てる()ことにより、xyのabs((x or 1.5)%-3-(y or 1.5)%-3)水平方向の差を計算できます。


0

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を使用して、キーの列と行を決定できます。次に、列と行の距離を計算して追加します。これは、あるキーから別のキーまでの距離です。

説明が理解できたらいいなと思います。気軽にゴルフをしてください:)

アップデート

ラムダでは不可能である再帰を使用するため、実際の関数に変更する必要がありました:、(

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.