The Crow vs The Taxicab


36

Imagine viajar para um ponto situado A milhas de distância horizontalmente e B milhas de distância verticalmente de sua posição atual. Ou, em outras palavras, viajando do (0, 0)ponto ao ponto (a, b). Até onde você precisaria para viajar? Parece uma pergunta direta, mas a resposta depende de quem você perguntar. Se você é um corvo e pode viajar enquanto o corvo voa , a distância percorrida é apenas a distância euclidiana de (a, b). Isto é

sqrt(a^2 + b^2)

Mas se você é apenas um humano chato, não quer ir tão longe, então precisará pegar um táxi. A maioria dos táxis não dirige em linha reta em direção ao seu destino, porque geralmente tenta permanecer nas estradas. Portanto, a distância real que você vai viajar é a soma da distância vertical e da distância horizontal. Ou a fórmula é:

abs(a) + abs(b)

Isso é chamado de distância do táxi . Esta imagem demonstra bem a diferença entre os dois:

insira a descrição da imagem aqui

Para viajar (6, 6), um corvo pode simplesmente voar na linha verde, e isso dá uma distância de 6 * sqrt(2)aproximadamente 8,49. Um táxi pode seguir os caminhos vermelho, azul ou amarelo, mas todos seguirão 12.

Isso leva à verdadeira pergunta que estou fazendo. Se um corvo e um táxi partem do ponto (0, 0)e viajam para o ponto (a, b), quanto tempo é o caminho do táxi? Ou, em mais jargão matemático,

Dado um vetor bidimensional, determine a diferença entre a normam2 do vetor e a norma1 do vetor.

Você deve escrever o programa ou função mais curto possível para responder a esta pergunta. Você pode escolher 'a' e 'b' como duas entradas separadas ou como uma tupla de dois itens. Você pode receber entrada e saída em qualquer formato razoável. Se a diferença for um número inteiro, você deve ter precisão de pelo menos duas casas decimais.

Você sempre pode assumir que 'a' e 'b' serão números inteiros e que ambos não serão 0. (Embora seja possível que qualquer um deles seja zero)

Como sempre, brechas padrão se aplicam e tentam tornar seu programa o mais curto possível, contado em bytes.

Votarei qualquer resposta que postar uma explicação de como o código funciona e demonstre quaisquer truques interessantes usados ​​para salvar bytes.

Aqui estão alguns exemplos para você testar seu código:

#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

Divirta-se jogando golfe! :)


9
podemos considerar a entrada como um número complexo?
Uriel

Eu acho que o testcase 10,10precisa ser 5,86, já que ele sai 5.85786...e você arredondou o abaixo.
numbermaniac

4
Li pela primeira vez o título como a vaca vs o táxi e estava esperando encontrar algo que envolve a física de colisão ...
MooseBoys

Podemos dar resultados negativos?
Adám

@ Adám No. (Desde conceitualmente, você está retornando a distância, o que é sempre positivo)
DJMcMayhem

Respostas:


108

Táxi , 7394 3773 bytes

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.

Experimente online!

O engenheiro Toast , um jogador de táxi muito mais experiente, decidiu levar algum tempo (provavelmente muito menos do que eu) e jogar golfe no meu programa de táxi basicamente reescrevendo-o. Você pode encontrar meu antigo corpo de resposta e links para meus antigos TIOs no histórico de edições.

O algoritmo de raiz quadrada não destruída do Engineer Toast: Experimente online!

Ungolfed, com explicações:

[ 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
Isso é insano ...
Gryphon - Restabelece Monica

2
@Gryphon a coisa louca é que eu estou 100% certo de que pode remover como dois mil bytes uma vez que eu revisitar minha lógica, enquanto eu não estou meio dormindo
Stephen

4
4 horas é merecedor do +1 em si!
Shaggy

4
Tenho certeza de que o número de jogadores que lerão toda a explicação será menor que seus bytes: D
Grajdeanu Alex.

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

10

Javascript (ES6), 36 bytes

-1 byte graças a @dtkaias

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

Exemplo de trecho de código:

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 não tem **.
Neil

2
Uma versão verdadeira ES6 provavelmente seria 41 bytes: (x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y).
Neil

@DanEsparza Claramente costumava. Isto é o que o histórico de revisão é para ...
Neil

Por que não a=>b=>a+b-Math.hypot(a,b)?
Dtkaias 11/07/19

1
Bem, que tal (x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y), por 36 bytes, ES6 compatíveis também
dtkaias

8

Julia, 20 bytes

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

Toma ae bcomo uma lista.

O normsegundo argumento de Julia assume como padrão 2 - portanto, isso seria equivalente a norm(x, 1) - norm(x, 2).


Eu também pensei em usar Julia!
8117 enedil

Muito parecido com a resposta do MATLAB que eu estava prestes a postar.
TheIncredibleZ1

6

Java 8, 47 bytes

Golfe:

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

Isso é o mais básico possível: subtraia os dois valores calculados para encontrar a diferença. Isso usa lógica ternária em vez de Math.abs()salvar um byte em cada ocorrência. Infelizmente, os parênteses são necessários devido à precedência do operador.

A saída é o que o Java doublepode conter, com precisão de mais de duas casas decimais e que satisfaz o requisito de precisão da pergunta.

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

Saída:

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
Você pode usar currying para salvar um byte: a->b->.
Jakob

4

Mathematica, 32 bytes

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

ou

Mathematica, 31 bytes

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

ou @Não é uma sugestão de árvore

Mathematica, 26 bytes

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

ou sugestão de @ alephalpha

Mathematica, 19 bytes

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

Bom trabalho! Você pode economizar alguns bytes usando números complexos para a parte euclidiana:N[Tr@Abs@{##}-Abs[#+I#2]]&
Não uma árvore

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

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

4

Dyalog APL, 13 bytes

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

Experimente online!

Explicação (entrada X):

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

4

R , 30 bytes

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

Toma vcomo uma matriz de 1 coluna. normcalcula uma norma específica de uma matriz, com o padrão L1 (taxicab) e fL2 ( 'f'para Frobenius / Euclidiano).

Experimente online!


Uau, R tem ambos embutidos, bom!
BLT


3

Japonês , 11 9 bytes

-2 bytes graças a @ETHproductions

Nxa -MhUV

Experimente online!

Explicado

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)

Bom, acho que é a primeira vez que eu vejo Mhusado. Eu acredito que você pode encurtar Ua +Vaa Nxa(soma de entradas, correndo aem cada)
ETHproductions

@ETHproductions Ah, claro, esqueci que a soma tinha o parâmetro opcional do mapa. Obrigado!
Justin Mariner

Portanto, existe "um uso para Mh!": D A maioria dos métodos em Japt pode usar o que @ETHproductions chama de "função automática" como argumento. Veja esta dica para mais informações. E escreverei uma dica amanhã em utilizando auto-funções com redução matriz para atingir alguns resultados interessantes (por exemplo, rwirá devolver o maior inteiro em uma matriz).
Salsicha

@ Shaggy Obrigado, tive a idéia básica de "auto-funções", mas não percebi que havia um post para as dicas do Japt. Definitivamente vou dar uma olhada nesse post.
Justin Mariner

Ainda temos um bom trabalho a fazer sobre essa questão. Se você tem algo que acha que pode ser adicionado, faça. Ou, se você tiver uma consulta que você acha que caberia lá, informe-nos nos comentários ou junte-se a nós na sala de bate-papo .
Shaggy

3

Esquema - 58 bytes.

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

3
Bem-vindo ao PPCG!
Martin Ender

Você pode remover dois espaços - um entre o definee o (e outro entre o )e o (.
Clismique

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

(lambda(a b)(...))deve ser suficiente em vez de vinculá-lo a um nome. Além disso, (sqrt(* a a b b))economizaria alguns bytes.
Daniel Schepler


3

APL (Dyalog) , 14 bytes

Recebe argumento na forma xJy, por exemplo3J4

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

Experimente online!

| a magnitude do Doc

| magnitude do argumento

- menos

2+/ a soma aos pares

 do

| as magnitudes de

9 11.○⊢ as partes reais e imaginárias do argumento. Doc

Um truque especial para o golfe foi o uso da redução emparelhada ( 2+/) para fornecer +/um argumento à esquerda sem op, evitando parênteses:||-(+/∘|9 11○⊢)


3

J, 13 bytes

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

Esta é uma função que assume as coordenadas como uma matriz, por exemplo:

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

Explicação:

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

Bom uso de &.:- eu não estava ciente :do Under.
217 Jonah


2

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

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

Programe essa entrada como uma lista de dois números inteiros Ans, por exemplo, chame com {3,4}:prgmCROW(substituindo 3,4pela entrada e CROWpelo nome do programa).

Explicação:

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

Isso me parece de 24 a 26 bytes, dependendo de como e $ Ans ^ 2 $ são codificados. 10 digitações , talvez, mas não é a mesma coisa.
Raio

O @Ray TI-Basic é um idioma tokenizado .
pizzapants184

Estou familiarizado com a TI-89 Basic, onde esse não é o caso. Objeção retirada.
Raio

2

MATL , 8 7 bytes

|sG2&|-

Experimente online!

Explicação

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

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

∇f Pdeclara uma função fque pega um vetor que Pcontém as distâncias como argumento (por exemplo [3, 4])

O APL opera em vetores, então +/|Paplica o |operador ( absfunção) a cada elemento do vetor e depois avalia +em cada elemento (adicione todos os elementos). Isso dá a distância do táxi.

P*2produz um vetor que é o mesmo que Pmas com cada elemento ao quadrado. +/P*2para adicioná-los e depois (com parênteses para precedência porque a APL é da direita para a esquerda) *.5para obter a raiz quadrada. Isso dá a distância do corvo.

Adicione um par extra de parênteses para a distância do táxi como precedência e calcule a diferença.

para finalizar a função.


1
Você não pode usar uma lambda anônima? {(+/|⍵)-(+/⍵*2)*.5}?
Adám

@ Adám Não tenho muita experiência com APL e a versão mais recente do interpretador GNU (1.7) não será compilada no Mac; portanto, pode haver algumas limitações. Vou tentar mais tarde para ver se funciona. Obrigado pela dica.
Arc676

Quase todos os recursos do GNU APL também estão no Dyalog APL, disponível gratuitamente no Mac . Você também pode experimentá-lo online .
Adám

Além disso, sinta-se à vontade para entrar na sala de bate-papo da APL para saber mais sobre a APL.
Adám

2

J , 9 8 bytes

-1 obrigado ao meu colega Marshall.

+&|-|@j.

Experimente online!

Toma A como argumento da esquerda e B como argumento da direita.

+ a soma

& do

| as magnitudes

- menos

| a magnitude

@ do

j.A + B i

Truque no golfe: combine os valores com um único número complexo, pois é fácil obter a diagonal assim, mantendo-os separados porque a soma é fácil de obter.


2

Adicionar ++ , 59 57 bytes

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

Experimente online!

Isso levou séculos para resolver. Não arredonda a resposta final, pois isso não é possível no Add ++. É assim que o programa trabalha com as entradas -3e -4( ACCé o valor do acumulador)

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 bytes

Função de janela imediata VBE anônima que recebe entrada do intervalo [A1:B1]e gera a diferença entre as distâncias euclidiana e de táxi para a janela imediata VBE.

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

1
São dois bytes mais curtos para colocá-lo diretamente em uma célula da planilha:=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Engineer Toast

@EngineerToast, eu pensei que eu já tinha colocado o meu Google Folhas / Excel Soluções - obrigado por apontar isso
Taylor Scott





1

Ruby (2.0.0 - 2.3.0), 57 bytes

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

Isso pressupõe receber informações do ARGV, por exemplo

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

Isso parece uma trapaça, já que Ruby vem com uma biblioteca matemática que possui funções abs e sqrt (ao contrário do cara que escreveu suas próprias funções abs e sqrt, embora eu não tenha visto nada especificamente proibindo o uso de tais funções).

O primeiro truque é usar em .mapvez de .eachsalvar um byte e, em seguida, usar a &:symbolnotação para passar no mapa um processo que executamos to_iem cada item da matriz e usar várias atribuições para atribuir valores a x e y.

Uma versão mais longa seria:

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

(como o mapa retorna uma matriz, a atribuição múltipla é provavelmente a maneira de fazê-lo, isso descarta quaisquer parâmetros adicionais, mas estamos assumindo apenas duas entradas de qualquer maneira)

Acabei de remover todos os espaços da equação.

Aqui está uma versão mais longa, 84 bytes

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

O objetivo aqui foi a de não repetir-me, por exemplo, ter que escrever xou absduas vezes e minha quadratura duas vezesx**2 + y**2

Não funcionou.

Mas o interessante é que os putos não precisam de espaço, acho que o lexer é inteligente o suficiente para ver o caractere especial e saber que é um var especial.

injecte reducesão sinônimos, injetar tem uma assinatura de

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

No nosso caso, precisamos definir a inicial como 0, então temos o nosso acumulador (ou seja: memorando = 0) e o objeto de cada iteração.

O lado negativo desse método é que ele precisará de mais de duas entradas e somará ou quadrará, adicionará e, em seguida, sqrt todos os valores na matriz.

Eu acho - embora eu não tenha um Ruby 2.4.0 para testar - que isso também funcione, com 72 bytes:

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

O padrão da soma é 0 e, tanto quanto eu sei, funciona da mesma forma que injetar / reduzir.


A única razão pela qual ele não usou built-in foi porque esse idioma não tinha nenhum disponível para ele usar. Boa resposta e bem-vindo ao PPCG! :)
Conor O'Brien

Bem-vindo ao PPCG! O Portal TIO possui um Ruby 2.4.0 funcional que você pode usar para experimentar online. Experimente aqui
Value Ink

Aproveitando os requisitos flexíveis de E / S, você pode evitar a análise e a colocação, diminuindo o golfe para uma lambda de 35 bytes .
benj2240

1

Planilhas Google, 31 bytes

Função de planilha que recebe entrada do intervalo [A1:B1]e gera a diferença entre as distâncias Euclidiana e Taxicab

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

Excel, 32 bytes

O mesmo que acima, mas formatado para o MS Excel

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


0

Pip , 15 bytes

ABa+ABb-RT$+g*g

Recebe entrada dos argumentos da linha de comando. Experimente online!

Explicação

No pseudocódigo, é isso abs(a) + abs(b) - sqrt(fold+(g*g)). ae bsão os dois primeiros cmdline args e gé a lista de cmdline args (ou seja, argv). O *operador vetoriza, como muitos operadores de Pip, $+g*ga mesma coisa que a*a + b*b. O resto é bem direto.

Infelizmente, não consigo salvar bytes com $+ABg, porque a precedência de operadores com dobra ainda não funciona como deveria. $+deve ter precedência um pouco mais alta que a binária -, mas no momento ela analisa como $+(ABg-RT$+g*g), dando a resposta errada. Fazer ($+ABg)-RT$+g*gnão salva nenhum bytes sobre a versão menos ofuscada acima.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.