カラスとタクシー


36

現在位置から水平方向にAマイル、垂直方向にBマイル離れた地点に移動することを想像してください。または言い換えると、から(0, 0)に移動します(a, b)。あなたはどこまで旅行する必要がありますか?これは簡単な質問のように思えますが、答えはあなたが尋ねる人によって異なります。あなたがカラスであり、カラスが飛ぶように移動できる場合、移動距離はユークリッド距離になり(a, b)ます。これは

sqrt(a^2 + b^2)

しかし、あなたが退屈な人間なら、それほど遠くまで歩きたくないので、タクシーに乗る必要があります。ほとんどのタクシーは、一般的に道路に留まろうとするため、目的地に向かって直線で運転することはありません。したがって、実際に移動する距離は、垂直距離と水平距離の合計になります。または、式は次のとおりです。

abs(a) + abs(b)

これはTaxicab Distanceと呼ばれます。この図は、2つの違いをうまく示しています。

enter image description here

に移動するため(6, 6)に、カラスは緑の線の上を飛ぶことができ、これにより6 * sqrt(2)約8.49の距離が得られます。タクシーは赤、青、または黄色の道を取ることができますが、すべて12になります。

これは私が尋ねている本当の質問につながります。カラスとタクシーの両方がポイントから出発し、ポイント(0, 0)に移動する場合(a, b)、タクシーの経路はどれくらい長くなりますか?または、より多くの数学の専門用語では、

2次元のベクトルが与えられた場合、ベクトルのnorm2とベクトルのnorm1の差を求めます。

この質問に答えるには、最短のプログラムまたは関数を作成する必要があります。「a」と「b」を2つの別々の入力として、または2つのアイテムのタプルとして選択できます。任意の適切な形式で入力および出力を取得できます。差が整数でない場合は、少なくとも小数点以下2桁まで正確である必要があります。

「a」と「b」は整数であり、両方とも0にはならないことを常に想定できます(ただし、どちらかがゼロになる可能性はあります)

いつものように、標準の抜け穴が適用され、プログラムをバイト単位で可能な限り短くしようとします。

コードがどのように機能するかについての説明を投稿し、バイトを節約するために使用されるクールなトリックを実証する回答を支持します。

コードをテストするための例を次に示します。

#input    #output
3, 4      2
-3, 4     2
-3, -4    2
6, 6      3.51
42, 0     0
10, 10    5.86
3, 3      1.76

ゴルフをお楽しみください!:)


9
入力を複素数として受け取ることはできますか?
ウリエル

テストケースは10,105.86である必要があると思います。なぜなら、それが出てきて5.85786...、その下のテストケースを丸めたからです。
numbermaniac

4
私は最初に「The Cow vs The
Taxicab」

否定的な結果を出すことはできますか?
アダム

アダム号(概念的ので、あなたは常に正である距離を、帰国している)@
DJMcMayhem

回答:


108

タクシー7394 3773バイト

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Tom's Trims.Pickup a passenger going to Tom's Trims.Go to Tom's Trims:n.[a]Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l 2 r.Pickup a passenger going to Addition Alley.Pickup a passenger going to Multiplication Station.1 is waiting at Starchild Numerology.Go to Starchild Numerology:s 2 l 2 r.Pickup a passenger going to Cyclone.Go to Cyclone:w 1 r 4 l.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to The Underground.Go to Cyclone:n 1 l 1 l.Pickup a passenger going to Multiplication Station.Go to The Underground:n 2 r 2 r.Switch to plan "b" if no one is waiting.Pickup a passenger going to Charboil Grill.Go to Charboil Grill:s 2 r 1 l 1 l 2 r.-1 is waiting at Starchild Numerology.Go to Starchild Numerology:e 2 r.Pickup a passenger going to Multiplication Station.Go to The Underground:w 1 r 2 r 1 r 2 l.[b]Go to Multiplication Station:s 1 l 1 r.Go to Tom's Trims:s 1 r 3 r.Switch to plan "c" if no one is waiting.Switch to plan "a".[c]Go to Multiplication Station:s 1 l 3 l.Pickup a passenger going to Cyclone.Pickup a passenger going to Cyclone.Go to Cyclone:s 1 r 2 l 2 r.Pickup a passenger going to Addition Alley.Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Multiplication Station.-1 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:w 1 r 2 r 1 r 4 l.Pickup a passenger going to Rob's Rest.Go to Rob's Rest:s 1 r 2 l 1 l 1 r 1 r.Go to Cyclone:s 1 l 1 l 1 l 1 r.Pickup a passenger going to Cyclone.[d]Pickup a passenger going to Multiplication Station.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:s 1 l 2 r 4 l.Pickup a passenger going to Addition Alley.Go to Cyclone:s 1 r 2 l 2 r.Switch to plan "e" if no one is waiting.Switch to plan "d".[e]Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Cyclone.99 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.Pickup a passenger going to The Underground.Go to Cyclone:e 1 l 2 r.Pickup a passenger going to Trunkers.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 r.Go to Trunkers:s 1 l.[f]Pickup a passenger going to Cyclone.Go to Cyclone:w 2 r.Pickup a passenger going to Divide and Conquer.Pickup a passenger going to Trunkers.Go to Trunkers:s 1 l.Go to Sunny Skies Park:w 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l.Pickup a passenger going to Divide and Conquer.Go to Zoom Zoom:n.Go to Divide and Conquer:w 1 l 2 r 1 r.Pickup a passenger going to Addition Alley.Go to Cyclone:e 1 l 1 l 2 l.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Divide and Conquer.2 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 3 l 2 r.Pickup a passenger going to Divide and Conquer.Go to Divide and Conquer:w 1 r 2 r 1 r 2 l 3 l.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:e 1 l 1 l 2 l 1 l.Go to The Underground:s 1 l 1 r 2 l.Switch to plan "g" if no one is waiting.Pickup a passenger going to The Underground.Go to Trunkers:s 2 r 1 l.Switch to plan "f".[g]Go to Rob's Rest:n 3 l 2 l 1 l 2 r 1 r.Pickup a passenger going to What's The Difference.Go to Sunny Skies Park:s 1 l 1 l.Pickup a passenger going to What's The Difference.Go to What's The Difference:n 1 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:e 3 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

オンラインでお試しください!

はるかに経験豊富なタクシーのゴルファーであるエンジニアトーストは、ある程度の時間をかけて(おそらく私よりもはるかに少ない)、基本的に書き直してタクシープログラムをダウンさせることにしました。編集履歴で古い回答の本文と古いTIOへのリンクを見つけることができます。

Engineer Toastの平方根アルゴリズムなし:オンラインで試してみてください!

説明なしで、ゴルフをしていません:

[ Crow vs. Taxi ]


[ GET THE NEGATIVE ABSOLUTE VALUES OF BOTH STDINS ]

[Move the stdin values to Tom's Trims b/c:]
[1) Stdin doesn't count as a passenger waiting]
[2) Checking for no one waiting is shorter that keeping tracker of a count for just 2 iterations OR repeating all the code over again]
Go to Post Office:w 1 l 1 r 1 l.
Pickup a passenger going to Tom's Trims.
Pickup a passenger going to Tom's Trims.
Go to Tom's Trims:n.

[a]
[Clone the first waiting value]
[If we've already picked up both, move to the next process]
[Switch to plan "c" if no one is waiting.]
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery:s 1 l 1 r.
Pickup a passenger going to Cyclone.
Go to Cyclone:n 1 l 1 l 2 r.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Multiplication Station.

[Add one to the value]
1 is waiting at Starchild Numerology.
Go to Starchild Numerology:s 2 l 2 r.
Pickup a passenger going to Cyclone.
Go to Cyclone:w 1 r 4 l.
Pickup a passenger going to Addition Alley.
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to The Underground.

[Pick up a clone of that one to feed into Multiplication Station]
Go to Cyclone:n 1 l 1 l.
Pickup a passenger going to Multiplication Station.

[Subtract one and see if that's more than zero]
Go to The Underground:n 2 r 2 r.
Switch to plan "b" if no one is waiting.

[It was more than zero so we make it negative]
[First, though, get rid of the pesky result from The Underground]
Pickup a passenger going to Charboil Grill.
Go to Charboil Grill:s 2 r 1 l 1 l 2 r.
-1 is waiting at Starchild Numerology.
Go to Starchild Numerology:e 2 r.
Pickup a passenger going to Multiplication Station.
Go to The Underground:w 1 r 2 r 1 r 2 l.

[b]
[Make sure it's a negative value and leave it at Multiplication Station]
[Either it was already negative OR we now have -1 as a passenger]
Go to Multiplication Station:s 1 l 1 r.

[Get the next stdin unless we've already gotten them both]
Go to Tom's Trims:s 1 r 3 r.
Switch to plan "c" if no one is waiting.
Switch to plan "a".


[ ADD THE TWO NEGATIVES AND INVERT TO GET THE TAXI DISTANCE]

[c]
[Pickup the two negative absolute values and clone them]
Go to Multiplication Station:s 1 l 3 l.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Cyclone.
Go to Cyclone:s 1 r 2 l 2 r.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.

[Add the two clones values to get the negative Taxi distance]
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to Multiplication Station.

[Invert to get the Taxi distance and store it at Rob's Rest]
-1 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station:w 1 r 2 r 1 r 4 l.
Pickup a passenger going to Rob's Rest.
Go to Rob's Rest:s 1 r 2 l 1 l 1 r 1 r.


[ FIND THE CROW DISTANCE ]
[Uses the Babylonian method: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method ]

[Square and Sum the cloned values]
Go to Cyclone:s 1 l 1 l 1 l 1 r.
Pickup a passenger going to Cyclone.
[d]
Pickup a passenger going to Multiplication Station.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station:s 1 l 2 r 4 l.
Pickup a passenger going to Addition Alley.
Go to Cyclone:s 1 r 2 l 2 r.
Switch to plan "e" if no one is waiting.
Switch to plan "d".
[e]
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to Cyclone.

[Pickup our cycle counter]
[It's cheaper to do this than to check each iteration's value as equal to the last]
[Taxi can only handle integers up to 2^31-1 so 99 iterations is sufficient.]
99 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 1 l 3 l.
Pickup a passenger going to The Underground.

[Duplicate stdin to be stored as S at Trunkers and as x0 at Sunny Skies Park]
[a & b are always integers so Trunkers won't hurt S and it's close with a short name so it's good for golfing]
Go to Cyclone:e 1 l 2 r.
Pickup a passenger going to Trunkers.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park:n 1 r.
Go to Trunkers:s 1 l.

[ This is our starting position for square root:           ]
[  • x at Sunny Skies Park                                 ]
[  • S at Trunkers                                         ]
[  • Taxi at Trunkers                                      ]
[  • The iterator as a passenger going to The Underground  ]

[f]

[Duplicate S so we don't lose it]
Pickup a passenger going to Cyclone.
Go to Cyclone:w 2 r.
Pickup a passenger going to Divide and Conquer.
Pickup a passenger going to Trunkers.
Go to Trunkers:s 1 l.

[Diplicate x for division and addition]
Go to Sunny Skies Park:w 1 r.
Pickup a passenger going to Cyclone.
Go to Cyclone:n 1 l.
Pickup a passenger going to Divide and Conquer.

[Gas will be super important in this loop]
Go to Zoom Zoom:n.

[Perform (x + S/x)/2]
[(/2) turns out to be a few bytes shorter than (*.5), mostly due to place names]
Go to Divide and Conquer:w 1 l 2 r 1 r.
Pickup a passenger going to Addition Alley.
Go to Cyclone:e 1 l 1 l 2 l.
Pickup a passenger going to Addition Alley.
Go to Addition Alley:n 2 r 1 r.
Pickup a passenger going to Divide and Conquer.
2 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 3 l 2 r.
Pickup a passenger going to Divide and Conquer.
Go to Divide and Conquer:w 1 r 2 r 1 r 2 l 3 l.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park:e 1 l 1 l 2 l 1 l.
[Now we have the next iteration of x]

[Check the iterator]
Go to The Underground:s 1 l 1 r 2 l.
Switch to plan "g" if no one is waiting.
Pickup a passenger going to The Underground.

[Reset the loop]
Go to Trunkers:s 2 r 1 l.
Switch to plan "f".


[ ADD THE NEGATIVE SUM TO THE SQUARE ROOT TO GET THE NEGATIVE DIFFERENCE ]

[g]
Go to Rob's Rest:n 3 l 2 l 1 l 2 r 1 r.
Pickup a passenger going to What's The Difference.
Go to Sunny Skies Park:s 1 l 1 l.
Pickup a passenger going to What's The Difference.
Go to What's The Difference:n 1 r 1 l.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery:e 3 r.
Pickup a passenger going to Post Office.
Go to Post Office:n 1 l 1 r.

1
これは...正気です
グリフォン-復活モニカ

2
@Gryphon非常識なことは、私が半分眠っていない間にロジックを再訪すると、2000バイトほど削除できることを100%確信していることです。
スティーブン

4
4時間はそれだけで+1に値します!
シャギー

4
説明全体を読むゴルファーの数は、あなたのバイトよりも少なくなると
確信し

1
+1-1 is waiting at Starchild Numerology.
Keyu Gan

10

Javascript(ES6)、36バイト

@dtkaiasのおかげで-1バイト

(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)

サンプルコードスニペット:

f=

(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)

for(i=0;i<7;i++)
  a=[3,-3,-3,6,42,10,3][i],
  b=[4,4,-4,6,0,10,3][i],
  console.log(`f(${a},${b}) = ${f(a,b)}`)


ES6にはありません**
ニール

2
真のES6バージョンは、おそらく41バイトです(x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y)
ニール

@DanEsparzaそれは明らかに以前は使用されていました。これが改訂履歴の目的です
ニール

どうしてa=>b=>a+b-Math.hypot(a,b)
dtkaias

1
右、どの程度(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)、36バイト、ES6互換あまりにについて
dtkaias

8

ジュリア、20バイト

x->norm(x,1)-norm(x)

取りabリストなど。

ジュリアのnorm2番目の引数のデフォルトは2 norm(x, 1) - norm(x, 2)です。したがって、これはと同等になります。


ジュリアの使用も考えました!
-eneil

私が投稿しようとしていたMATLABの答えに非常に似ています。
-TheIncredibleZ1

6

Java 8、47バイト

ゴルフ:

(a,b)->(a<0?-a:a)+(b<0?-b:b)-Math.sqrt(a*a+b*b)

これは、基本的なことです。2つの計算値を減算して、差を見つけます。これはMath.abs()、オカレンスごとに1バイトを保存する代わりに、3値論理を使用します。残念ながら、演算子の優先順位のために括弧が必要です。

出力は、Java doubleが保持できるもので、小数点以下3桁まで正確で、質問の精度要件を満たします。

ゴルフをしていない:

public class TheCrowVsTheTaxicab {

  public static void main(String[] args) {
    int[][] inputs = new int[][] { { 3, 4 }, { -3, 4 }, { -3, -4 }, { 6, 6, }, { 42, 0 }, { 10, 10 }, { 3, 3 } };
    double[] outputs = new double[] { 2, 2, 2, 3.51, 0, 5.85, 1.76 };

    for (int i = 0; i < inputs.length; ++i) {
      double actual =
        f((a, b) -> (a < 0 ? -a : a) + (b < 0 ? -b : b) - Math.sqrt(a * a + b * b), inputs[i][0], inputs[i][1]);

      System.out.println("Input:    " + inputs[i][0] + ", " + inputs[i][1]);
      System.out.println("Expected: " + outputs[i]);
      System.out.println("Actual:   " + actual);
      System.out.println();
    }
  }

  private static double f(java.util.function.BiFunction<Integer, Integer, Double> f, int a, int b) {
    return f.apply(a, b);
  }
}

出力:

Input:    3, 4
Expected: 2.0
Actual:   2.0

Input:    -3, 4
Expected: 2.0
Actual:   2.0

Input:    -3, -4
Expected: 2.0
Actual:   2.0

Input:    6, 6
Expected: 3.51
Actual:   3.5147186257614305

Input:    42, 0
Expected: 0.0
Actual:   0.0

Input:    10, 10
Expected: 5.85
Actual:   5.857864376269049

Input:    3, 3
Expected: 1.76
Actual:   1.7573593128807152

1
カリーを使用してバイトを保存できます:a->b->
ヤコブ

4

Mathematica、32バイト

N[Tr@Abs[a={##1}]-Sqrt@Tr[a^2]]&

または

Mathematica、31バイト

N[Abs@#+Abs@#2-Sqrt[#^2+#2^2]]&

または@ツリーの提案ではありません

Mathematica、26バイト

N[Tr@Abs@{##}-Abs[#+I#2]]&

または@alephalphaの提案

Mathematica、19バイト

N[#~Norm~1-Norm@#]&

よくやった!あなたは、ユークリッド部分は複素数を使用して、いくつかのバイトを保存することができます:N[Tr@Abs@{##}-Abs[#+I#2]]&
未ツリー

2
N[#~Norm~1-Norm@#]&
-alephalpha

2
#~Norm~1-N@Norm@#&たぶん@alephalpha ?
マーティンエンダー


4

R、30バイト

function(v)norm(v)-norm(v,'f')

v1列のマトリックスとして受け取ります。norm行列の特定のノルムを計算します。デフォルトはL1ノルム(タクシー)、およびfL2ノルム('f'フロベニウス/ユークリッド)です。

オンラインでお試しください!


うわー、Rには両方が組み込まれています。
BLT

3

パイソン240の 38バイト

vaultahのおかげで-2バイト。

おもしろいことに、このコードの11バイトは質問からコピーされてゴルフされました。

lambda a,b:abs(a)+abs(b)-(a*a+b*b)**.5

オンラインでお試しください!



@ Mr.Xcoder私はそれについてあまり心配することはないでしょう。:P
完全に人間

@vaultahああ、良い点。ありがとう!
完全に人間

5
abs(a+b*1j)代わりに動作するはずです(a*a+b*b)**.5
-SteamyRoot

3

Japt11 9バイト

@ETHproductionsのおかげで-2バイト

Nxa -MhUV

オンラインでお試しください!

説明した

Nxa -MhUV   // implicit: U and V are input integers, N = [U,V]

N a         // get absolute value of both inputs
 x          // sum those values
    -MhUV   // subtract hypot(U, V) -> sqrt(U^2 + V^2)

いいですね、これは私がMh使ったのを見たのは初めてだと思います。私はあなたが短縮できると信じUa +VaNxa(入力の合計、実行中のa各上)
ETHproductions

@ETHproductionsそうそう、その合計にオプションのmapパラメーターがあることを忘れていました。ありがとう!
ジャスティンマリナー

だから、*は」のための使用であるMh!:JAPTでDほとんどの方法は@ETHproductionsが呼ぶものを取ることができます『を参照してください。引数としてオート機能』このヒントをより多くの彼らのために私は上の明日先端を書くことになります。いくつかの興味深い結果を達成するために、配列を縮小した自動関数を使用する(たとえば、rw配列内の最大の整数を返す)
Shaggy

@Shaggyありがとう、「自動機能」の基本的なアイデアは持っていましたが、Japtのヒントの投稿があることに気付きませんでした。間違いなくその投稿に目を通すつもりです。
ジャスティンマリナー

その質問についてはまだやるべきことがありますので、追加できると思われるものがある場合は行ってください。または、そこに収まると思われるクエリがある場合は、コメントでお知らせいただくか、チャットルームに参加してください。
シャギー

3

スキーム-58バイト。

(define (f a b) (-(+(abs a)(abs b))(sqrt(* a a)(* b b))))

3
PPCGへようこそ!
マーティンエンダー

2つのスペースを削除できます。1つはdefineとの(間、もう1つは)との間(です。
clismique

Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
アーロン

(lambda(a b)(...))名前にバインドするのではなく、十分である必要があります。また、(sqrt(* a a b b))数バイト節約できます。
ダニエルシェプラー


3

APL(Dyalog)、14バイト

形式の引数を取りますxJy、例えば3J4

||-2+/∘|9 11○⊢

オンラインでお試しください!

|Doc  の大きさ

| 引数の大きさ

- マイナス

2+/ ペアワイズ和

 の

| の大きさ

9 11.○⊢ 引数の実部と虚部。Doc

ゴルフの特別なコツは、ペアワイズリダクション(2+/)を使用+/して、no-op left引数を指定し、括弧を回避することでした。||-(+/∘|9 11○⊢)


3

J、13バイト

+/@:|-+/&.:*:

これは、座標を配列として取得する関数です。例:

   (+/@:|-+/&.:*:) _3 4
2

説明:

+/             sum
  @:           of
    |          absolutes
     -         minus
      +/       sum
        &.:    under
           *:  square

良い使用法&.:-私は:Underのことを知りませんでした。
ジョナ


2

TI-Basic(TI-84 Plus CE)、10バイト

sum(abs(Ans))-√(sum(Ans2

で2つの整数のリストとして入力するプログラムAns。たとえば、withで呼び出します{3,4}:prgmCROW3,4入力とCROWプログラム名で置き換えます)。

説明:

sum(abs(Ans))-√(sum(Ans2
        Ans               # The input list of two integers
    abs(   )              # Absolute value of each item in the list
sum(        )             # Sum of the list
                    Ans   # The input list of two integers
                       2  # Square of each item in the list
                sum(      # Sum of the list
              √(          # Square root of the sum
             -            # Difference of the two values

$ Ans ^ 2 $がどのようにエンコードされるかに応じて、24〜26バイトのように見えます。おそらく10回のキーストロークですが、それは同じことではありません。
レイ

@Ray TI-Basicはトークン化された言語です。
pizzapants184

私はほとんどTI-89 Basicに精通していますが、そうではありません。異議は撤回されました。
レイ



2

GNU APL 1.2、24バイト

∇f P
(+/|P)-(+/P*2)*.5
∇

∇f P引数として距離を含むfベクトルPを取る関数を宣言します(例[3, 4]

APLはベクトルで動作するため+/|P|演算子(abs関数)をベクトルの各要素に適用してから、各要素で評価+します(すべての要素を追加します)。これにより、タクシーの距離がわかります。

P*2は同じですPが、各要素が二乗されたベクトルを生成します。+/P*2それらを一緒に追加し、次に(APLは右から左への優先順位の括弧を使用して)*.5平方根を取得します。これにより、カラスの距離が得られます。

優先順位のためにタクシーの距離に括弧のペアを追加し、差を計算します。

機能を終了します。


1
匿名のラムダを使用できませんか?{(+/|⍵)-(+/⍵*2)*.5}
アダム

@Adám私はAPLの経験があまりなく、最新バージョンのGNUインタープリター(1.7)はMacでコンパイルできないため、いくつかの制限があるかもしれません。動作するかどうかを後で確認します。ヒントをありがとう。
Arc676

GNU APLのほとんどすべての機能はDyalog APLにもあります。これはMacで自由に利用できますオンラインで試すこともできます
アダム

また、APLチャットルームに参加して、APLの詳細を学んでください。
アダム

2

J9 8バイト

-1同僚のマーシャルに感謝します。

+&|-|@j.

オンラインでお試しください!

Aを左引数として、Bを右引数として取ります。

+ 合計

& の

| 大きさ

- マイナス

| 大きさ

@ の

j.A + B i

ゴルフのコツ:対角線は簡単に取得できるので、値を1つの複素数に結合します。また、合計はそのように取得しやすいので、それらを別々に保ちます。


2

Add ++59 57バイト

D,f,@@,|@|+
D,g,@@,d*@d*+
_
$f>G>G
V
$g>?>?
S
-G
$f>x>0
O

オンラインでお試しください!

これには、解決するのに何年もかかりました。Add ++では不可能なため、最終的な回答は丸められません。これは、プログラムが入力を処理する方法であり-3-4ACCはアキュムレータ値です)

D,        Define a function
  f,      called f
  @@,     that takes 2 arguments (e.g. -3, -4)
     |    absolute value;   STACK = [-3, 4]
     @    reverse stack;    STACK = [4, -3]
     |    absolute value;   STACK = [4, 3]
     +    sum;              STACK = [7]
          implicitly return the top of the stack

D,        Define a function
  g,      called g
  @@,     that takes 2 arguments (e.g. -3, -4)
     d    duplicate;  STACK = [-3, -4, -4]
     *    multiply;   STACK = [-3, 16]
     @    reverse;    STACK = [16, -3]
     d    duplicate;  STACK = [16, -3, -3]
     *    multiply;   STACK = [16, 9]
     +    sum;        STACK = [25]
          implicitly return the top of the stack

_         store the inputs in the second stack;  ACC = 0;  STACK = [-3, -4]
$f>G>G    apply f with -3 and -4 as arguments;   ACC = 7;  STACK = []
V         store ACC in the stack;                ACC = 7;  STACK = [7]
$g>?>?    apply g with -3 and -4 as arguments;   ACC = 25; STACK = [7]
S         square root the ACC;                   ACC = 5;  STACK = [7]
-G        subtract the stack value from the ACC; ACC = -2; STACK = []
$f>x>0    apply f with ACC and 0 as arguments;   ACC = 2;  STACK = []
O         output ACC as a number


1

Excel VBA、34バイト

範囲から入力を受け取り[A1:B1]、ユークリッド距離とTaxicab距離の差をVBEイミディエイトウィンドウに出力する匿名VBEイミディエイトウィンドウ関数。

?[ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)]

1
これは、シート内のセルに直接それを置くために2バイト短いです:=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
エンジニアトースト

この指摘をありがとう- @EngineerToastは、私はすでに私のGoogleスプレッドシート/エクセルソリューションは我慢していたことを考えた
テイラー・スコットが





1

Ruby(2.0.0-2.3.0)、57バイト

x,y=$*.map(&:to_i);puts x.abs+y.abs-Math.sqrt(x**2+y**2)

これは、例えばARGVからの入力を前提としています。

ruby -e 'x,y=$*.map(&:to_i);puts x.abs+y.abs-Math.sqrt(x**2+y**2)' -- -3 4

Rubyにはabsおよびsqrt関数を持つ数学ライブラリが付属しているため、これはごまかしのように感じられます(独自のabsおよびsqrt関数を書いた人とは異なりますが、そのような関数の使用を特に禁止するものは見ていません)。

最初のトリックは、バイトを保存する.map代わりに.each使用し、次に&:symbol表記法を使用to_iして配列内の各項目で実行するプロシージャをマップに渡し、複数の割り当てを使用して値をxおよびyに割り当てます。

より長いバージョンは次のようになります。

(x, y) = ARGV.map{ |string| string.to_i }

(マップは配列を返すため、複数の割り当てがおそらくそれを行う方法であり、これは追加のパラメーターを捨てますが、とにかく2つの入力のみを想定しています)

次に、方程式のすべてのスペースを削除しました。

これは、84バイトの長いバージョンです

$*.map!(&:to_i);puts$*.inject(0){|x,y|x+y.abs}-Math.sqrt($*.inject(0){|x,y|x+y**2})

ここでの目標は、例えば書くこと、自分自身を繰り返さないことだったxabs二度、私は二回乗x**2 + y**2

うまく行かなかった。

しかし、興味深いのは、putsにスペースが必要ないことです。レクサーは、特殊なcharを見てそれが特殊なvarであることを知るのに十分賢いと思います。

injectそしてreduce同義語であり、injectのシグネチャは

inject(initial) {| memo, obj | block }

この場合、イニシャルを0に設定する必要があります。その後、アキュムレーター(つまり、memo = 0)と各反復からのオブジェクトがあります。

この方法の欠点は、3つ以上の入力を受け取り、配列内のすべての値を合計または二乗し、加算してからsqrtすることです。

テストするRuby 2.4.0はありませんが、これも同様に機能すると思います。これは72バイトです。

$*.map!(&:to_i);puts$*.sub{|x,y|x+y.abs}-Math.sqrt($*.sum{|x,y|x+y**2})

Sumのデフォルトは0で、私が知る限り、inject / reduceと同じように機能します。


彼がビルトインを使用しなかった唯一の理由は、その言語に使用可能なものがないためです。いい答えです。PPCGへようこそ!:)
コナーオブライエン

PPCGへようこそ!TIOポータルには動作するRuby 2.4.0があり、これを使用してオンラインで試すことができます。ここで試してください
バリューインク

柔軟なI / O要件を活用することで、解析やパット、35バイトのラムダまでのゴルフを回避できます。
benj2240

1

Googleスプレッドシート、31バイト

範囲から入力を受け取り[A1:B1]、ユークリッド距離とタクシキャブ距離の差を出力するワークシート関数

=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2

Excel、32バイト

上記と同じですが、MS Excel用にフォーマットされています

=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)


0

ピップ、15バイト

ABa+ABb-RT$+g*g

コマンドライン引数から入力を取得します。オンラインでお試しください!

説明

擬似コードでは、これはabs(a) + abs(b) - sqrt(fold+(g*g))です。aおよびbは最初の2つのcmdline argsでありg、cmdline args(つまりargv)のリストです。*オペレータはそう、多くのピップ事業者のように、ベクトル化$+g*gと同じものですa*a + b*b。残りは非常に簡単です。

残念ながら、を使用してバイトを保存することはできません$+ABg。なぜなら、foldを使用した演算子の優先順位はまだ正常に機能していないからです。$+binaryよりもわずかに高い優先順位である必要-がありますが、現時点ではとして解析され$+(ABg-RT$+g*g)、間違った答えが返されます。実行して($+ABg)-RT$+g*gも、上記の難読化されていないバージョンよりもバイトは節約されません。

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