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:
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! :)
10,10
precisa ser 5,86, já que ele sai5.85786...
e você arredondou o abaixo.Respostas:
Táxi ,
73943773 bytesExperimente 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:
fonte
-1 is waiting at Starchild Numerology.
Javascript (ES6), 36 bytes
-1 byte graças a @dtkaias
Exemplo de trecho de código:
fonte
**
.(x,y,s=Math.sqrt)=>s(x*=x)+s(y*=y)-s(x+y)
.a=>b=>a+b-Math.hypot(a,b)
?(x,y,s=Math.hypot)=>s(x)+s(y)-s(x,y)
, por 36 bytes, ES6 compatíveis tambémJulia, 20 bytes
Toma
a
eb
como uma lista.O
norm
segundo argumento de Julia assume como padrão 2 - portanto, isso seria equivalente anorm(x, 1) - norm(x, 2)
.fonte
Java 8, 47 bytes
Golfe:
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
double
pode conter, com precisão de mais de duas casas decimais e que satisfaz o requisito de precisão da pergunta.Ungolfed:
Saída:
fonte
a->b->
.Mathematica, 32 bytes
ou
Mathematica, 31 bytes
ou @Não é uma sugestão de árvore
Mathematica, 26 bytes
ou sugestão de @ alephalpha
Mathematica, 19 bytes
fonte
N[Tr@Abs@{##}-Abs[#+I#2]]&
N[#~Norm~1-Norm@#]&
.#~Norm~1-N@Norm@#&
talvez?Dyalog APL, 13 bytes
Experimente online!
Explicação (entrada X):
fonte
R , 30 bytes
Toma
v
como uma matriz de 1 coluna.norm
calcula uma norma específica de uma matriz, com o padrão L1 (taxicab) ef
L2 ('f'
para Frobenius / Euclidiano).Experimente online!
fonte
Python 2 ,
4038 bytes-2 bytes graças a vaultah.
Curiosamente, 11 bytes deste código foram copiados da pergunta e jogados no golfe.
Experimente online!
fonte
abs(a+b*1j)
deve funcionar em vez de(a*a+b*b)**.5
Japonês ,
119 bytes-2 bytes graças a @ETHproductions
Experimente online!
Explicado
fonte
Mh
usado. Eu acredito que você pode encurtarUa +Va
aNxa
(soma de entradas, correndoa
em cada)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,rw
irá devolver o maior inteiro em uma matriz).Esquema - 58 bytes.
fonte
define
e o(
e outro entre o)
e o(
.Error: sqrt: too many arguments (at most: 1 got: 2) [f, sqrt]
(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.Pitão, 8 bytes
Experimente online. Suíte de teste.
Explicação
fonte
APL (Dyalog) , 14 bytes
Recebe argumento na forma
xJy
, por exemplo3J4
Experimente online!
|
a magnitude do Doc|
magnitude do argumento-
menos2+/
a soma aos pares∘
do|
as magnitudes de9 11.○⊢
as partes reais e imaginárias do argumento. DocUm 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○⊢)
fonte
J, 13 bytes
Esta é uma função que assume as coordenadas como uma matriz, por exemplo:
Explicação:
fonte
&.:
- eu não estava ciente:
do Under.05AB1E , 7 bytes
Experimente online!
Explicação
fonte
TI-Basic (TI-84 Plus CE), 10 bytes
Programe essa entrada como uma lista de dois números inteiros
Ans
, por exemplo, chame com{3,4}:prgmCROW
(substituindo3,4
pela entrada eCROW
pelo nome do programa).Explicação:
fonte
√
e $ Ans ^ 2 $ são codificados. 10 digitações , talvez, mas não é a mesma coisa.MATL ,
87 bytesExperimente online!
Explicação
fonte
Lisp comum, 57 bytes
Experimente online!
fonte
GNU APL 1.2, 24 bytes
∇f P
declara uma funçãof
que pega um vetor queP
contém as distâncias como argumento (por exemplo[3, 4]
)O APL opera em vetores, então
+/|P
aplica o|
operador (abs
funçã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*2
produz um vetor que é o mesmo queP
mas com cada elemento ao quadrado.+/P*2
para adicioná-los e depois (com parênteses para precedência porque a APL é da direita para a esquerda)*.5
para 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.fonte
{(+/|⍵)-(+/⍵*2)*.5}
?J ,
98 bytes-1 obrigado ao meu colega Marshall.
Experimente online!
Toma A como argumento da esquerda e B como argumento da direita.
+
a soma&
do|
as magnitudes-
menos|
a magnitude@
doj.
A + B iTruque 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.
fonte
Adicionar ++ ,
5957 bytesExperimente 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
-3
e-4
(ACC
é o valor do acumulador)fonte
PHP> = 7.1, 54 bytes
Sandbox do PHP Online
PHP , 55 bytes
Experimente online!
PHP , 60 bytes
com uma função em vez de um programa completo
Experimente online!
fonte
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.fonte
=ABS(A1)+ABS(B1)-SQRT(A1^2+B1^2)
Pari / GP , 26 bytes
Experimente online!
fonte
Geléia , 7 bytes
Experimente online!
Formato é uma lista de dois números.
fonte
,,,, 18 bytes
Essencialmente uma porta da minha resposta Python.
fonte
Ruby , 31 bytes
Cria um número complexo para calcular a distância.
Experimente online!
fonte
Ruby (2.0.0 - 2.3.0), 57 bytes
Isso pressupõe receber informações do ARGV, por exemplo
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
.map
vez de.each
salvar um byte e, em seguida, usar a&:symbol
notação para passar no mapa um processo que executamosto_i
em cada item da matriz e usar várias atribuições para atribuir valores a x e y.Uma versão mais longa seria:
(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
O objetivo aqui foi a de não repetir-me, por exemplo, ter que escrever
x
ouabs
duas 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.
inject
ereduce
são sinônimos, injetar tem uma assinatura deNo 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:
O padrão da soma é 0 e, tanto quanto eu sei, funciona da mesma forma que injetar / reduzir.
fonte
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 TaxicabExcel, 32 bytes
O mesmo que acima, mas formatado para o MS Excel
fonte
Pitão , 7 bytes
Experimente aqui
Pitão ,
2523 bytesEsta é a solução inicial, minha primeira solução não-trivial de Pyth e você pode ver o quão ruim eu costumava jogar golfe em Pyth :)
Experimente online!
fonte
Pip , 15 bytes
Recebe entrada dos argumentos da linha de comando. Experimente online!
Explicação
No pseudocódigo, é isso
abs(a) + abs(b) - sqrt(fold+(g*g))
.a
eb
são os dois primeiros cmdline args eg
é a lista de cmdline args (ou seja, argv). O*
operador vetoriza, como muitos operadores de Pip,$+g*g
a mesma coisa quea*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*g
não salva nenhum bytes sobre a versão menos ofuscada acima.fonte