Taxicab vs karga


36

Yatan bir noktaya seyahat düşünün bir uzak yatay mil ve B bulunduğunuz konumdan uzak dikey mil. Başka bir deyişle, bir (0, 0)noktadan seyahat etmek (a, b). Ne kadar uzağa seyahat etmen gerekiyor? Bu basit bir soru gibi görünüyor, ancak cevap kime sorduğunuza bağlı. Eğer bir karga, ve seyahat Eğer kuş uçuşu mesafe adildir gitti Öklit mesafesi kadar (a, b). Bu

sqrt(a^2 + b^2)

Ama eğer sadece sıkıcı bir insansanız, gerçekten o kadar yürümek istemezsiniz, bu yüzden taksiye binmeniz gerekir. Çoğu taksiler gideceğiniz yere doğru düz bir yolda gitmezler çünkü genellikle yollarda kalmaya çalışırlar. Bu yüzden seyahat edeceğiniz gerçek mesafe dikey mesafenin ve yatay mesafenin toplamıdır. Veya formül:

abs(a) + abs(b)

Buna Taxicab Distance denir . Bu resim, ikisi arasındaki farkı güzel bir şekilde gösteriyor:

görüntü tanımını buraya girin

Seyahat etmek için (6, 6), bir karga sadece yeşil hatta uçabilir ve bu, 6 * sqrt(2)yaklaşık 8.49'luk bir mesafe verir . Bir taksici kırmızı, mavi veya sarı yolları alabilir, ancak hepsi 12 olacak.

Bu soruyorum gerçek soruya yol açar. Bir karga ve bir taksinin her ikisi de noktadan ayrılır ve bir noktaya (0, 0)seyahat ederse (a, b), taksinin yolu ne kadar uzundur? Veya, daha fazla matematik jargonunda,

İki boyutlu bir vektör verildiğinde, vektörün norm2'si ile vektörün norm1'i arasındaki farkı belirleyin.

Bu soruyu cevaplamak için mümkün olan en kısa programı veya işlevi yazmalısınız. 'A' ve 'b' yi iki ayrı giriş olarak ya da iki öğe parçası olarak almayı seçebilirsiniz. Herhangi bir makul formatta girdi ve çıktı alabilirsiniz. Fark tam sayı değilse, en az iki ondalık basamağa kadar doğru olmalısınız.

Her zaman 'a' ve 'b'nin tamsayı olacağını ve her ikisinin de 0 olmayacağını varsayabilirsiniz. (Her ikisinden birinin sıfır olması mümkün olsa da)

Her zaman olduğu gibi, standart boşluklar geçerlidir ve programınızı bayt sayılarak mümkün olduğunca kısa tutmaya çalışın.

Kodun nasıl çalıştığı hakkında bir açıklama yapan ve baytları kurtarmak için kullanılan herhangi bir harika hileyi gösteren yanıtları iptal edeceğim.

Kodunuzu sınamanız için bazı örnekler:

#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

Golf eğlenin! :)


9
Girdiyi karmaşık sayı olarak alabilir miyiz?
Uriel

Bence bunun için test çantasının 10,105.86 olması gerekiyor, çünkü ortaya çıkıyor 5.85786...ve altını da yuvarladınız.
numbermaniac

4
Başlığı The Cow vs The Taxicab olarak okudum ve çarpışma fiziğini içeren bir şey bulmayı umuyordum ...
MooseBoys 10:07

Olumsuz sonuçlar verebilir miyiz?
Adám

@ Adám No. (Kavramsal yana, her zaman pozitif olan bir mesafe döndürüyorsunuz)
DJMcMayhem

Yanıtlar:


108

Taksi , 7394 3773 bayt

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.

Çevrimiçi deneyin!

Çok daha tecrübeli bir Taksi golfçü Mühendisi Toast biraz zaman almaya karar verdi (muhtemelen benden çok daha az) ve Taksi programımı temel olarak yeniden yazarak golf oynamaya karar verdi. Eski cevap kuruluşumu ve eski TIO'larımın bağlantılarını düzenleme geçmişinde bulabilirsiniz.

Mühendis Toast'ın ungolfed karekök algoritması: Çevrimiçi deneyin!

Ungolfed, açıklamalarıyla birlikte:

[ 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
Bu delilik ...
Gryphon - Reinstate Monica

2
Deli şeydir @Gryphon ben yarı uykulu değilim iken benim mantığı tekrar bir kez% 100 emin ben iki bin bayt gibi kaldırabilirsiniz değilim
Stephen

4
4 saat kendi başına + 1'i hak ediyor!
Shaggy

4
Tüm açıklamayı okuyacak olan golfçü sayısının
baytınızdan

1
+1 için-1 is waiting at Starchild Numerology.
Keyu Gan

10

Javascript (ES6), 36 bayt

@Dtkaias sayesinde -1 bayt

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

Örnek kod pasajı:

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 sahip değil **.
Neil,

2
Gerçek ES6 versiyonu muhtemelen 41 byte olacaktır: (x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y).
Neil,

@DanEsparza Açıkça kullanılan. Bu, revizyon tarihinin ne için olduğunu ...
Neil,

Neden olmasın a=>b=>a+b-Math.hypot(a,b)?
dtkaias

1
Tamam, peki (x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y), 36 byte, ES6 ile de uyumlu
dtkaias

8

Julia, 20 bayt

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

Alır ave bbir liste olarak.

Julia'nın normikinci argümanı varsayılan olarak 2'dir - bu eşdeğer olacaktır norm(x, 1) - norm(x, 2).


Julia'yı kullanmayı da düşündüm!
enedil,

Yazmak üzere olduğum MATLAB cevabına çok benzer.
TheIncredibleZ1,

6

Java 8, 47 bayt

golfed:

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

Bu elde ettiği kadar basit: farkı bulmak için hesaplanan iki değeri çıkarın. Bu, Math.abs()her seferinde bir bayt kaydetmek yerine üçlü mantık kullanır . Ne yazık ki, parantez, operatör önceliği nedeniyle gereklidir.

Çıktı, Java'nın doubleyapabileceği her şeydir , bu ikiden fazla ondalık basamağa kadar doğrudur ve sorunun doğruluğunu karşılar.

Ungolfed:

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);
  }
}

Çıktı:

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
Bir byte kaydetmek için Currying kullanabilirsiniz: a->b->.
Jakob

4

Mathematica, 32 bayt

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

veya

Mathematica, 31 bayt

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

veya @Bir ağacın önerisi

Mathematica, 26 bayt

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

veya @ alephalpha'nın önerisi

Mathematica, 19 bayt

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

İyi iş! Öklid bölümü için karmaşık sayıları kullanarak birkaç bayttan tasarruf edebilirsiniz:N[Tr@Abs@{##}-Abs[#+I#2]]&
Ağaç değil

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

2
@alephalpha #~Norm~1-N@Norm@#&belki?
Martin Ender

4

Dyalog APL, 13 bayt

+/∘|-.5*⍨+.×⍨

Çevrimiçi deneyin!

Açıklama (giriş X):

+/∘|     - Sum of the element-wise absolute value of X
-        - Minus
.5*⍨+.×⍨ - Euclidean distance = sqrt(X . X)

4

R , 30 bayt

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

Alır v1-kolon matrisi olarak. normvarsayılan olarak L1 normu (taksicab) ve fL2 normu ( 'f'Frobenius / Euclidean için) olmak üzere belirli bir matris normunu hesaplar .

Çevrimiçi deneyin!


Vay, R her ikisi de yerleşik, güzel!
BLT


3

Japt , 11 9 bayt

@ETHproductions sayesinde -2 bayt

Nxa -MhUV

Çevrimiçi deneyin!

Açıklaması

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)

Güzel, sanırım ilk defa Mhkullanıyorum. Sana kısaltmak inanıyorum Ua +Vaiçin Nxa(koşu, girişlerin toplamı aher birinde)
ETHproductions

@ETHproductions Ah, bu toplamın isteğe bağlı harita parametresi olduğunu unuttum. Teşekkürler!
Justin Mariner

Öyleyse * 'bir kullanım Mh!' Dır: Japt'daki çoğu yöntem @ETHproductions'un bir "otomatik işlev" dediği şeyi bir argüman olarak alabilir. Bu ipucunu daha fazla bilgi için bu ipucuna bakın . bazı ilginç sonuçlar elde etmek için dizi azaltma işlevli otomatik işlevleri kullanma (örneğin, rwbir dizideki en büyük tam sayıyı döndürür)
Shaggy

@Shaggy Teşekkürler, "otomatik işlevler" hakkında temel bir fikrim vardı, ancak Japt ipuçlarının yayınlandığını bilmiyordum. Kesinlikle bu yazıya bakacağım.
Justin Mariner

Hala bu soru üzerinde yapacak çok işimiz var, bu yüzden eklenebileceğini düşündüğünüz bir şey varsa, lütfen yapın. Ya da oraya uygun olduğunu düşündüğünüz bir sorunuz varsa, yorumlarınızı bize bildirin veya bize sohbet odasına katılın .
Shaggy

3

Şema - 58 bayt.

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

3
PPCG'ye Hoşgeldiniz!
Martin Ender

Arasında bir tane - İki boşluk kaldırabilir defineve (ve aralarında bir tane )ve (.
clismique

Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
Aaron,

(lambda(a b)(...))onu bir isme bağlamak yerine yeterli olmalıdır. Ayrıca, (sqrt(* a a b b))bir kaç bayt kurtarır.
Daniel Schepler


3

APL (Dyalog) , 14 bayt

Formdaki argümanı alır xJy, örneğin3J4

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

Çevrimiçi deneyin!

| büyüklüğü Doc

| tartışmanın büyüklüğü

- eksi

2+/ çift ​​toplamı

 arasında

| büyüklükleri

9 11.○⊢ argüman gerçektir ve hayali kısımlardır. doktor

Golf oynamak için özel bir püf 2+/noktası , çift yönlü azaltma ( ) işleminin kullanılmayacak +/bir sol argüman sağlamak ve böylece parantezlerden kaçınmaktı.||-(+/∘|9 11○⊢)


3

J, 13 bayt

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

Bu, koordinatları bir dizi olarak alan bir fonksiyondur, örneğin:

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

Açıklama:

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

Güzel kullanımı &.:- Ben :Under farkında değildi .
Jonah


2

TI-Basic (TI-84 Plus CE), 10 bayt

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

Program bir iki tamsayılar listesi olarak girdi Ansile örneğin çağrı {3,4}:prgmCROW(yerine 3,4girişli veCROW programın adıyla ).

Açıklama:

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

Nasıl ve $ Ans ^ 2 $ kodlanmış bağlı olarak bana 24-26 bayt gibi görünüyor . Belki 10 tuşa basma, ancak bu aynı şey değil.
Ray

@Ray TI-Basic belirtilmiş bir dildir .
pizzapants184

Çoğunlukla TI-89 Basic'e aşinayım, burada böyle değil. İtiraz geri çekildi.
Ray

2

MATL , 8 7 bayt

|sG2&|-

Çevrimiçi deneyin!

açıklama

|    % Implicit input: vector of two numbers. Absolute value, element-wise
s    % Sum of vector
G    % Push input again
2    % Push 2
&|   % 2-norm of input
-    % Subtract. Implicit display


2

GNU APL 1.2, 24 bayt

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

∇f Pmesafeleri içeren fbir vektörü Pargüman olarak alan bir işlev bildirir (örn.[3, 4] )

APL, vektörler üzerinde çalışır, dolayısıyla operatörü ( işlevi) vektördeki her bir öğeye +/|Puygular ve sonra her bir öğeyi değerlendirir (tüm öğeleri ekleyin). Bu taksi mesafesini verir.|abs+

P*2PHer elemanın karesiyle aynı olan aynı vektörü verir . +/P*2Bunları bir araya getirmek ve sonra (APL sağdan sola olduğu için öncelikli parantez içinde) *.5karekök elde etmek. Bu, karga mesafesini verir.

Öncelik için taksi mesafesi için fazladan parantez çifti ekleyin ve farkı hesaplayın.

fonksiyonu sonlandırmak için


1
İsimsiz bir lambda kullanamaz mısın? {(+/|⍵)-(+/⍵*2)*.5}?
Adám

@ Adám APL ile ilgili çok fazla deneyimim yok ve GNU yorumlayıcısının (1.7) en yeni sürümü Mac'te derlenmiyor, bu nedenle bazı sınırlamalar olabilir. Çalışıp çalışmadığını görmek için daha sonra deneyeceğim. Bahşiş için teşekkürler.
Arc676

GNU APL'nin neredeyse tüm özellikleri , Mac'te ücretsiz olarak kullanılabilen Dyalog APL'de de bulunmaktadır . Ayrıca çevrimiçi deneyebilirsiniz .
Adám

Ayrıca, daha fazla APL öğrenmek için APL sohbet odasına katılmaktan çekinmeyin .
Adám

2

J , 9 8 bayt

-1 meslektaşım Marshall sayesinde.

+&|-|@j.

Çevrimiçi deneyin!

Alır A sol argüman gibi B sağ argüman olarak.

+ toplam

& arasında

| büyüklükler

- eksi

| büyüklük

@ arasında

j.A + B i

Golf hilesi: değerleri tek bir karmaşık sayıya birleştirin, çünkü köşegen böyle olsun kolaydır, aynı zamanda bunları ayrı tutar çünkü toplamı elde etmek kolaydır.


2

++ , 59 57 bayt ekle

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

Çevrimiçi deneyin!

Bu beni çözmek için yaş aldı. Son cevabı Add ++ 'da mümkün olmadığı için tamamlamıyor. Program girişlerle bu şekilde çalışır -3ve -4( ACCbiriktirici değeri)

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 Bayt

Menzilden girdi alan [A1:B1]ve Öklid ile Taxicab mesafeleri arasındaki farkı VBE acil durum penceresine çıkaran isimsiz VBE acil pencere işlevi .

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

1
Doğrudan sayfadaki bir hücreye yerleştirmek iki bayt daha kısadır:=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Engineer Toast

@EngineerToast, Google Sheets / Excel Çözümlerimi çoktan hazırladığımı sanıyordum - bunu gösterdiğiniz için teşekkürler
Taylor Scott





1

Yakut (2.0.0 - 2.3.0), 57 bayt

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

Bu, ARGV'den girdi almayı varsayar;

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

Ruby, abs ve sqrt işlevlerine sahip bir matematik kütüphanesiyle geldiği için hile gibi geliyor (kendi abs ve sqrt işlevlerini yazan adamın aksine, bu tür işlevlerin kullanımını yasaklayan hiçbir şey görmedim).

İlk numara bir bayttan tasarruf .mapyerine yerine kullanmak .each, sonra&:symbol yürüttüğümüz bir proc eşlemesini geçmek gösterimito_i dizideki her bir öğe üzerinde x ve y'ye değerler atamak için çoklu atama kullanın.

Daha uzun bir sürüm olacaktır:

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

(harita bir dizi döndürdüğünden, çoklu atama muhtemelen bunu yapmanın yoludur, bu herhangi bir ek parametreyi ortadan kaldırır, ancak yine de sadece iki girdi olduğunu varsayıyoruz)

Sonra denklemdeki tüm boşlukları kaldırdım.

İşte daha uzun bir sürüm, 84 bayt

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

Buradaki amaç kendimi tekrarlamamaktı, örneğin yazmak xya da absiki kez ve iki kez karelerim olmaktıx**2 + y**2

İşe yaramadı.

Ancak ilginç olan şey, kozların bir alana ihtiyaç duymamasıdır, sanırım Lexer özel karakterleri görecek ve onun özel bir var olduğunu bilecek kadar akıllıdır.

injectve reduceeş anlamlıdır, enjeksiyonun imzası vardır.

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

Bizim durumumuzda, başlangıç ​​değerini 0 olarak ayarlamamız gerekir, sonra akümülatörümüz (yani: memo = 0) ve her yinelemeden gelen nesneye sahibiz.

Bu yöntemin aşağı tarafı, ikiden fazla girdi alacağı ve dizideki tüm değerleri toplayacağı veya kareleyeceği, ekleyeceği, sonra da sqrt alacağı.

Ben düşünüyorum ben testine bir Ruby 2.4.0 yok --though - 72 bayt saatinde geldiğini bu yanı çalışacağını,:

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

Sum varsayılanları 0'dır ve söyleyebildiğim kadarıyla, enjekte / azaltma ile aynı şekilde çalışır.


Yerleşikleri kullanmamasının tek nedeni, o dilin kullanabileceği herhangi bir şey olmamasıydı. Güzel cevap ve PPCG'ye hoş geldiniz! :)
Conor O'Brien,

PPCG'ye Hoşgeldiniz! TIO Portal'da, çevrimiçi şeyleri denemek için kullanabileceğiniz çalışan bir Ruby 2.4.0 var. Burada deneyin
Value Ink

Esnek giriş / çıkış gereksinimlerinden yararlanarak, 35 baytlık bir lambda golf oynamaktan ayrıştırmaktan ve koymaktan kaçınabilirsiniz .
benj2240

1

Google Sayfaları, 31 Bayt

Menzilden girdi alan [A1:B1]ve Öklid ile Taxicab mesafeleri arasındaki farkı çıkaran çalışma sayfası işlevi

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

Excel, 32 bayt

Yukarıdakiyle aynı, ancak MS Excel için biçimlendirilmiş

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


0

Pip , 15 bayt

ABa+ABb-RT$+g*g

Komut satırı argümanlarından girdi alır. Çevrimiçi deneyin!

açıklama

Sahte kodda, bu abs(a) + abs(b) - sqrt(fold+(g*g)). ave bilk iki cmdline arg'dır ve gcmdline arg'larının listesidir (yani argv). *Operatör böylece birçok Pip operatörleri gibi vektör belirler $+g*gaynı şeydir a*a + b*b. Gerisi oldukça basit.

Ne yazık ki, hiçbir byte'ı kaydedemem $+ABg, çünkü katlanan operatörlerin önceliği henüz olması gerektiği gibi çalışmıyor. $+İkilikten biraz daha yüksek öncelikli olmalı -, fakat şu anda $+(ABg-RT$+g*g)yanlış cevap vererek ayrıştırıldı . Yapmak ($+ABg)-RT$+g*g, yukarıdaki daha az karışık olan sürümün üzerine herhangi bir baytı kaydetmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.