The Crow vs The Taxicab


36

Immagina di viaggiare verso un punto disteso A miglia di distanza in orizzontale e B miglia di distanza in verticale dalla tua posizione attuale. O in altre parole, viaggiando da un (0, 0)punto all'altro (a, b). Quanto lontano dovresti finire per viaggiare? Questa sembra una domanda semplice, ma la risposta dipende da chi chiedi. Se sei un corvo, e si può viaggiare in linea d'aria , la distanza percorsa è solo la distanza euclidea a (a, b). Questo è

sqrt(a^2 + b^2)

Ma se sei solo un essere umano noioso, non vuoi davvero camminare così lontano, quindi dovrai prendere un taxi. La maggior parte dei taxi non guida in linea retta verso la destinazione perché generalmente cerca di rimanere sulle strade. Quindi la vera distanza che finirai per viaggiare è la somma della distanza verticale e della distanza orizzontale. O la formula è:

abs(a) + abs(b)

Questa si chiama Taxicab Distance . Questa immagine dimostra bene la differenza tra i due:

inserisci qui la descrizione dell'immagine

Per viaggiare (6, 6), un corvo può semplicemente volare sulla linea verde e questo dà una distanza di 6 * sqrt(2)circa 8,49. Un taxi può prendere i percorsi rosso, blu o giallo, ma ne prenderanno tutti 12.

Questo porta alla vera domanda che sto ponendo. Se un corvo e un taxi partono entrambi da un punto (0, 0)all'altro e viaggiano verso un punto (a, b), quanto dura il percorso del taxi? O, in più gergo matematico,

Dato un vettore bidimensionale, determinare la differenza tra la norma2 del vettore e la norma1 del vettore.

È necessario scrivere il programma o la funzione più breve possibile per rispondere a questa domanda. Puoi scegliere di prendere 'a' e 'b' come due input separati o come tupla a due elementi. Puoi accettare input e output in qualsiasi formato ragionevole. Se la differenza non è un numero intero, è necessario essere precisi con almeno due cifre decimali.

Puoi sempre presumere che 'a' e 'b' saranno numeri interi e che non saranno entrambi 0. (Anche se è possibile che uno dei due sia zero)

Come al solito, si applicano scappatoie standard e cercano di rendere il programma il più breve possibile, conteggiato in byte.

Valuterò qualsiasi risposta che pubblichi una spiegazione del funzionamento del codice e mostri eventuali trucchi interessanti utilizzati per salvare i byte.

Ecco alcuni esempi su cui testare il tuo codice:

#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

Divertiti a giocare a golf! :)


9
possiamo prendere input come numero complesso?
Uriel,

Penso che il testcase 10,10debba essere 5,86, dal momento che viene fuori 5.85786...e hai arrotondato quello sotto di esso.
numbermaniac

4
Ho letto per la prima volta il titolo di The Cow vs The Taxicab e speravo di trovare qualcosa che riguardasse la fisica delle collisioni ...
MooseBoys,

Possiamo dare risultati negativi?
Adám,

@ Adám No. (Dal momento che concettualmente stai restituendo una distanza, che è sempre positiva)
DJMcMayhem

Risposte:


107

Taxi , 7394 3773 byte

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.

Provalo online!

L'ingegnere Toast , un giocatore di golf di Taxi molto più esperto, ha deciso di prendersi un po 'di tempo (probabilmente molto meno di me) e giocare a golf sul mio programma di taxi praticamente riscrivendolo. Puoi trovare il mio vecchio corpo di risposta e i collegamenti ai miei vecchi TIO nella cronologia delle modifiche.

Algoritmo di radice quadrata non modificata dell'ingegnere Toast: provalo online!

Ungolfed, con spiegazioni:

[ 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.


2
@Gryphon la cosa folle è che sono sicuro al 100% di poter rimuovere come duemila byte una volta che rivisito la mia logica mentre non sono mezzo addormentato
Stephen

4
4 ore meritano il +1 in sé!
Shaggy,

4
Sono sicuro che il numero di giocatori che leggeranno l'intera spiegazione sarà inferiore ai tuoi byte: D
Grajdeanu Alex.

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

10

Javascript (ES6), 36 byte

-1 byte grazie a @dtkaias

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

Esempio di frammento di codice:

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 non ha **.
Neil,

2
Una vera versione ES6 probabilmente sarebbe 41 byte: (x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y).
Neil,

@DanEsparza Lo faceva chiaramente. Questo è ciò che la storia delle revisioni è per ...
Neil,

Perché no a=>b=>a+b-Math.hypot(a,b)?
dtkaias,

1
Bene, che ne dici (x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y), per 36 byte, compatibile anche con ES6
dtkaias l'

8

Julia, 20 byte

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

Prende ae bcome un elenco.

Il normsecondo argomento di Julia viene impostato automaticamente su 2, quindi questo equivarrebbe a norm(x, 1) - norm(x, 2).


Ho anche pensato di usare Julia!
enedil,

Molto simile alla risposta MATLAB che stavo per pubblicare.
TheIncredibleZ1

6

Java 8, 47 byte

golfed:

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

Questo è il più semplice possibile: sottrarre i due valori calcolati per trovare la differenza. Questo utilizza la logica ternaria invece di Math.abs()salvare un byte per ogni occorrenza. Sfortunatamente, le parentesi sono richieste a causa della precedenza dell'operatore.

L'output è tutto ciò che Java doublepuò contenere, che è preciso a più di due decimali e soddisfa il requisito di precisione della domanda.

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

Produzione:

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
È possibile utilizzare accattivarsi per salvare un byte: a->b->.
Jakob,

4

Mathematica, 32 byte

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

o

Mathematica, 31 byte

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

o @Non suggerimento di un albero

Mathematica, 26 byte

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

o il suggerimento di @ alephalpha

Mathematica, 19 byte

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

Bel lavoro! Puoi salvare alcuni byte usando numeri complessi per la parte euclidea:N[Tr@Abs@{##}-Abs[#+I#2]]&
Non un albero

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

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

4

Dyalog APL, 13 byte

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

Provalo online!

Spiegazione (input X):

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

4

R , 30 byte

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

Prende vcome una matrice a 1 colonna.normcalcola una norma particolare di una matrice, con l'impostazione predefinita la norma L1 (taxi) e fla norma L2 ( 'f'per Frobenius / Euclidean).

Provalo online!


Caspita, R ha entrambi integrati, bello!
BLT,

3

Python 2 , 40 38 byte

-2 byte grazie a vaultah.

Fatto curioso, 11 byte di questo codice sono stati appena copiati dalla domanda e giocati a golf.

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

Provalo online!


1
Sono stato ninja
Mr. Xcoder l'

@ Mr.Xcoder Non sarei troppo preoccupato per questo, probabilmente sarò fuori campo. : P
totalmente umano, l'

@vaultah Oh, buon punto. Grazie!
totalmente umano l'

5
abs(a+b*1j)dovrebbe funzionare invece di(a*a+b*b)**.5
SteamyRoot il

3

Japt , 11 9 byte

-2 byte grazie a @ETHproductions

Nxa -MhUV

Provalo online!

spiegato

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)

Bello, penso sia la prima volta che lo vedo Mhusato. Credo che puoi accorciare Ua +Vaa Nxa(somma degli input, in esecuzione asu ciascuno)
ETHproductions

@ETHproductions Oh giusto, ho dimenticato che la somma aveva il parametro opzionale della mappa. Grazie!
Justin Mariner l'

Quindi * c'è "un uso per Mh!: D La maggior parte dei metodi in Japt può prendere quello che @ETHproductions chiama un" auto-funzione "come argomento. Vedi questo consiglio per saperne di più su di loro. E scriverò un consiglio domani utilizzando le funzioni automatiche con riduzione dell'array per ottenere risultati interessanti (ad esempio, rwrestituirà il numero intero più grande in un array).
Shaggy,

@Shaggy Grazie, ho avuto l'idea di base delle "funzioni automatiche" ma non mi ero reso conto che esistesse un post per i suggerimenti di Japt. Sicuramente guarderò attraverso quel post.
Justin Mariner,

Abbiamo ancora un bel po 'di lavoro da fare su questa domanda, quindi se hai qualcosa che ritieni possa essere aggiunto, per favore fallo. Oppure, se hai una domanda che ritieni possa essere adatta, facci sapere nei commenti o unisciti a noi nella chat .
Shaggy,

3

Schema - 58 byte.

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

3
Benvenuti in PPCG!
Martin Ender,

È possibile rimuovere due spazi: uno tra il definee il (e uno tra il )e il (.
clismique,

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

(lambda(a b)(...))dovrebbe essere sufficiente invece di associarlo a un nome. Inoltre, (sqrt(* a a b b))salverebbe un paio di byte.
Daniel Schepler,


3

APL (Dyalog) , 14 byte

Prende argomento nella forma xJy, ad es3J4

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

Provalo online!

| la grandezza del doc

| la grandezza dell'argomento

- meno

2+/ la somma delle coppie

 di

| le magnitudini di

9 11.○⊢ le parti reali e immaginarie dell'argomento.Doc

Un trucco speciale per il golf era l'uso della riduzione a coppie ( 2+/) per fornire +/un argomento sinistro no-op, evitando così le parentesi:||-(+/∘|9 11○⊢)


3

J, 13 byte

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

Questa è una funzione che accetta le coordinate come un array, ad esempio:

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

Spiegazione:

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

Buon uso di &.:- non ero a conoscenza :di Under.
Giona,

2

05AB1E , 7 byte

ÄO¹nOt-

Provalo online!

Spiegazione

Ä        # absolute value of inputs
 O       # sum
  ¹      # push input again
   n     # square
    O    # sum
     t   # sqrt
      -  # subtract

2

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

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

Programmare quell'input come un elenco di due numeri interi in Ans, ad es. Chiamata con {3,4}:prgmCROW(sostituzione3,4 con l'input e CROWcon il nome del programma).

Spiegazione:

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

A me sembrano 24-26 byte, a seconda di come e $ Ans ^ 2 $ sono codificati. 10 battiture , forse, ma non è la stessa cosa.
Ray

@Ray TI-Basic è un linguaggio tokenizzato .
pizzapants184

Conosco principalmente la TI-89 Basic, dove non è così. Obiezione ritirata.
Ray

2

MATL , 8 7 byte

|sG2&|-

Provalo online!

Spiegazione

|    % 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 byte

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

∇f Pdichiara una funzione fche accetta un vettore Pcontenente le distanze come argomento (ad es. [3, 4])

APL opera su vettori, quindi +/|Papplica l' |operatore ( absfunzione) a ciascun elemento nel vettore e quindi valuta+ su ciascun elemento (quindi aggiungi tutti gli elementi). Questo dà la distanza del taxi.

P*2produce un vettore uguale a Pma con ogni elemento al quadrato. +/P*2per aggiungerli insieme e poi (con parentesi per precedenza perché APL è da destra a sinistra)*.5 per ottenere la radice quadrata. Questo dà la distanza del corvo.

Aggiungi un altro paio di parentesi per la distanza del taxi per la precedenza e calcola la differenza.

per terminare la funzione.


1
Non puoi usare un lambda anonimo? {(+/|⍵)-(+/⍵*2)*.5}?
Adám,

@Adám Non ho molta esperienza con APL e la versione più recente dell'interprete GNU (1.7) non verrà compilata su Mac, quindi potrebbero esserci delle limitazioni. Proverò più tardi per vedere se funziona. Grazie per il consiglio.
Arc676,

Quasi tutte le funzionalità di GNU APL sono anche in Dyalog APL, che è disponibile gratuitamente su Mac . Puoi anche provarlo online .
Adám,

Inoltre, sentiti libero di unirti alla chat room APL per saperne di più su APL.
Adám,

2

J , 9 8 byte

-1 grazie al mio collega Marshall.

+&|-|@j.

Provalo online!

Prende A come argomento di sinistra e B come argomento di destra.

+ la somma

& di

| le magnitudini

- meno

| la grandezza

@ di

j.A + B i

Gioco di golf: combina i valori in un singolo numero complesso perché la diagonale è facile da ottenere in quel modo, pur mantenendoli separati perché la somma è facile da ottenere in quel modo.


2

Aggiungi ++ , 59 57 byte

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

Provalo online!

Mi ci sono voluti anni per risolverlo. Non completa la risposta finale in quanto ciò non è possibile in Add ++. Ecco come funziona il programma con gli ingressi -3e -4( ACCè il valore dell'accumulatore)

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 byte

Funzione di finestra immediata VBE anonima che prende input dall'intervallo [A1:B1]e genera la differenza tra le distanze Euclidean e Taxicab nella finestra immediata VBE.

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

1
È più corto di due byte per inserirlo direttamente in una cella del foglio:=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
ingegnere Toast l'

@EngineerToast, pensavo di aver già installato le mie soluzioni di Fogli Google / Excel - grazie per averlo segnalato
Taylor Scott





1

Rubino (2.0.0 - 2.3.0), 57 byte

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

Ciò presuppone l'assunzione di input da ARGV, ad es

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

Sembra un imbroglione poiché Ruby ha una libreria matematica con funzioni abs e sqrt (a differenza del ragazzo che ha scritto le sue funzioni abs e sqrt, anche se non ho visto nulla che proibisse esplicitamente l'uso di tali funzioni).

Il primo trucco sta usando .map anziché .eachsalvare un byte, quindi utilizzare la &:symbolnotazione per passare una mappa a un proc che eseguiamoto_i su ciascun elemento dell'array e utilizzare l'assegnazione multipla per assegnare valori a xe y.

Una versione più lunga sarebbe:

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

(poiché la mappa restituisce un array, probabilmente l'assegnazione multipla è il modo per farlo, questo elimina tutti i parametri aggiuntivi, ma supponiamo comunque solo due input)

Quindi ho rimosso tutti gli spazi nell'equazione.

Ecco una versione più lunga, 84 byte

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

L'obiettivo qui era non ripetermi, ad esempio dover scrivere xoabs due volte e la mia quadratura due voltex**2 + y**2

Non ha funzionato.

Ma la cosa interessante è che il put non ha bisogno di spazio, immagino che il lexer sia abbastanza intelligente da vedere il carattere speciale e sapere che è un var speciale.

injecte reducesono sinonimi, inject ha una firma di

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

Nel nostro caso dobbiamo impostare l'iniziale su 0, quindi abbiamo il nostro accumulatore (cioè: memo = 0) e l'oggetto di ogni iterazione.

Il lato negativo di questo metodo è che ci vorranno più di due input e sommerà o quadrerà, aggiungerà, quindi sqrt tutti i valori nell'array.

Io penso --though non ho Ruby 2.4.0 per prova con - che questo lavoro pure, che arriva a 72 byte:

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

Somma, il valore predefinito è 0 e, per quanto ne so, funziona come iniettare / ridurre.


L'unico motivo per cui non ha usato i builtin è perché quella lingua non aveva a disposizione per lui. Bella risposta, e benvenuto in PPCG! :)
Conor O'Brien l'

Benvenuti in PPCG! Il portale TIO ha un Ruby 2.4.0 funzionante che puoi usare per provare le cose online. Provalo qui
Value Ink

Sfruttando i requisiti di I / O flessibili, è possibile evitare l'analisi e l'inserimento, il golf fino a un lambda a 35 byte .
benj2240,

1

Fogli Google, 31 byte

Funzione del foglio di lavoro che accetta input dall'intervallo [A1:B1]e genera la differenza tra le distanze Euclidean e Taxicab

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

Excel, 32 byte

Come sopra ma formattato per MS Excel

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

1

Pyth , 7 byte

a.aQsa0

Provalo qui


Pyth ,  25  23 byte

Questa è la soluzione iniziale, la mia prima soluzione Pyth non così banale e puoi vedere quanto fossi brutta giocando a golf in Pyth :)

K.aswJ.asw-+KJ^+^K2^J2 .5

Provalo online!


0

Pip , 15 byte

ABa+ABb-RT$+g*g

Accetta input dagli argomenti della riga di comando. Provalo online!

Spiegazione

In pseudocodice, questo è abs(a) + abs(b) - sqrt(fold+(g*g)). ae bsono i primi due arg cmdline, ed gè la lista degli arg cmdline (cioè argv). L' *operatore vettorializza, come molti operatori Pip, quindi $+g*gè la stessa cosa di a*a + b*b. Il resto è piuttosto semplice.

Sfortunatamente, non posso salvare alcun byte con $+ABg, perché la precedenza degli operatori con fold non funziona come dovrebbe ancora. $+dovrebbe avere una precedenza leggermente superiore rispetto al binario -, ma al momento analizza come $+(ABg-RT$+g*g), dando la risposta sbagliata. Fare ($+ABg)-RT$+g*gnon salva alcun byte rispetto alla versione meno offuscata sopra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.