Introdução
Hoje fui pescar sozinho com minha canoa, infelizmente adormeci e o riacho me levou embora, perdi meus remos, agora é noite e estou perdido no oceano! Não posso ver a costa, então devo estar longe!
Eu tenho meu telefone celular, mas está com defeito porque ficou molhado pela água salgada, não consigo falar ou ouvir nada porque o alto-falante do microfone e do telefone está quebrado, mas posso enviar SMS para meu amigo que está na praia!
Meu amigo tem uma lanterna muito poderosa e a ergueu em cima dos bastões de bambu para me mostrar a direção certa, mas não consigo remar porque não tenho remos, então devo dizer a ele a que distância estou para que ele possa enviar alguém para pegue-me!
Meu amigo me disse que ele mantinha a tocha a 11,50 metros no nível do mar, e eu posso ver a luz bem no horizonte. Agora só lembro da escola que o raio da Terra deveria estar a 6371 km ao nível do mar e estou sentado na minha canoa para que você possa assumir que meus olhos também estão no nível do mar.
Tarefa
Como as correntes estão me movendo momento a momento, meu amigo está levantando a tocha de tempos em tempos (agora a 12,30 metros), por favor, escreva um programa completo ou função que me ajudará a calcular a distância da posição do meu amigo!
Aqui está um diagrama (sem escala):
O ponto laranja rotulado M
sou eu, o ponto vermelho rotulado T
é a tocha. A linha verde é a distância linear entre M
eT
Entrada
Pegue na entrada padrão a altura da tocha h
em metros ao nível do mar, que vejo no topo do horizonte, na forma de um número de ponto flutuante com precisão de duas casas decimais (com a precisão de 1 centímetro ou 0,01 metros), no variam de 0 a 100 incluídos.
Resultado
Você deve retornar o comprimento euclidiano da linha verde com a precisão de 1 cm. Por exemplo, se você produzir em metros, deve ter duas casas decimais (pelo menos). A saída pode ser metros ou quilômetros, mas respeitando a precisão.
Casos de teste:
Todos os valores em metros.
11.5 > 12105.08
13.8 > 13260.45
Regras
O menor código vence.
fonte
Respostas:
05AB1E ,
131210 bytesEconomizou 2 bytes graças a Emigna.
Como não há funções trigonométricas a serem chamadas usando a suposição de OP de que a Terra é localmente um plano, torna-se possível fazer uma solução 05AB1E.
Experimente online!
fonte
12742000
pode ser escrito como•1#oC•
•1#oC•+*t
em 2sable•
representa um ... número 214 base? 05AB1E às vezes sofre de falta de documentação sobre essas funções especiais. Resposta 2sable agradável também. Eu descobri isso há alguns dias atrás, mas não pensei em usá-lo para esta pergunta.Python,
3426 bytes:( -8 bytes graças a Osable! )
Uma função lambda anônima. Toma entradas em quilômetros e saídas em quilômetros. Invocar como
print(<Function Name>(<Input>))
.fonte
lambda i:(i*(i+12742))**.5
seria ainda mais curto.i
e 12742, a expressão pode ser abreviada para:(i*12742)**.5
PHP, 34 bytes
demolir
até agora, isso é idêntico à antiga resposta do Mathematica
agora tudo o que precisamos fazer é adicionar entrada
=$argv[1]
e saída<?=
- prontofonte
dc,
1611 bytes:Solicita a entrada pela linha de comando em quilômetros e, em seguida, gera a distância em quilômetros.
Explicação
Isso tira proveito do seguinte:
fonte
jq, 18 caracteres
Mais uma cópia da mesma fórmula.
Exemplo de execução:
Teste on-line
fonte
Haskell, 22 bytes
Uso:
Sem ponto: (23 bytes)
fonte
R, 29 bytes
Recebe entrada de stdin
fonte
(h=scan())*(1+12742e3/h)^.5
.Mathematica, 16 bytes
Qualquer um destes trabalhos para entrada e saída em quilômetros:
Esta é uma aplicação simples de Pitágoras ao problema:
fonte
Jelly, 9 bytes na página de código de Jelly
Eu decidi escrever o programa em um idioma de golfe. Na verdade, encontrei um algoritmo mais eficiente do que o usado por outras pessoas (pelo menos em distâncias curtas como a da questão), mas requer números literais de ponto flutuante que Jelly não parece capaz de comprimir, então Pitágoras isto é.
Explicação:
A necessidade do
µ
separador me incomoda, mas acho inevitável; O Jelly já salvou um byte acima de 05AB1E, pois consegue adivinhar quais argumentos muitos dos comandos precisam, mas, neste caso, não consegue adivinhar corretamente até o final, então eu precisava dar uma dica.Jelly, 7 bytes na página de código de Jelly
Como expliquei em minha outra resposta , a aproximação em série à aproximação de Pitágoras realmente produz melhores resultados ao longo dos comprimentos incluídos na pergunta (pelo menos, eles estão mais próximos das saídas de exemplo) e também possui uma fórmula mais curta. Enquanto escrevia, percebi que, em vez de calcular a raiz quadrada de 12742000 com antecedência, eu podia multiplicar o número por 12742000 primeiro e depois raiz quadrada, ao mesmo tempo. Isso é basicamente equivalente à outra fórmula sem a adição e, como tal, pode ser produzido a partir do programa anterior através da remoção da adição. Isso economiza dois bytes, pois agora analisa sem ambiguidade e, portanto, não precisamos
µ
mais disso.fonte
Ruby, 23
23 bytes, em Km
25 bytes, em m
fonte
Tcl, 49 bytes:
Bem, eu sou novo no Tcl, então qualquer dica para jogar golfe é muito apreciada. Como minhas outras respostas, solicita a entrada da linha de comando em quilômetros e a saída em quilômetros. Essencialmente, uma adaptação Tcl dos meus existentes
dc
epython
respostas.fonte
x86_64 + código da máquina SSE, 16 bytes
Os bytes do programa estão à esquerda (em hexadecimal); há uma desmontagem à direita para facilitar a leitura. Essa é uma função que segue a convenção x86_64 normal para funções que recebem e retornam um número de ponto flutuante de precisão única (pega o argumento em% xmm0 e retorna sua resposta no mesmo registro e usa% xmm1 e% eax como temporários; esses são as mesmas convenções de chamada que um programa C usará e, como tal, você pode chamar a função diretamente de um programa C, que foi como eu a testei.
Mesmo com uma desmontagem, no entanto, isso ainda precisa de uma explicação. Primeiro, vale a pena discutir a fórmula. A maioria das pessoas ignora a curvatura da terra e usa a fórmula de Pitágoras para medir a distância. Também estou fazendo isso, mas estou usando uma aproximação de expansão em série; Estou apenas adotando o termo relativo à primeira potência da entrada e ignorando as terceira, quinta, sétima etc. potências, que todas têm apenas uma influência muito pequena a essa curta distância. (Além disso, a aproximação de Pitágoras fornece um valor baixo, enquanto os termos posteriores na expansão em série servem para reduzir o valor; como tal, ignorando um fator menor que serviria para empurrar a aproximação na direção errada, na verdade um resultado mais preciso usando uma fórmula menos precisa.) A fórmula acaba sendo √12742000 × √h;
0x455f1980
.A próxima coisa que pode confundir as pessoas é por que estou usando instruções vetoriais para a raiz quadrada e a multiplicação;
%xmm0
e%xmm1
pode conter quatro números de ponto flutuante de precisão única cada, e eu estou operando nos quatro. O raciocínio aqui é realmente simples: sua codificação é um byte menor que a das instruções escalares correspondentes. Para que eu possa fazer com que a FPU faça um trabalho extra de raiz quadrada e multiplicação de zeros para economizar dois bytes, em um método que lembra muito o algoritmo típico da linguagem do golfe. (Chamei x86 assembler a linguagem de golfe dos assemblers no chat há um tempo, e ainda não mudei de idéia sobre isso.)A partir daí, o algoritmo é muito simples: carregar
%xmm1
com √12742000 via%eax
(que é mais curto em termos de bytes do que carregá-lo da memória), raiz quadrada do argumento (e três zeros), multiplicar os elementos correspondentes de%xmm1
e%xmm0
(apenas nos importamos sobre o primeiro elemento) e, em seguida, retorne.fonte
Minkolang v0.15, 22 bytes
Experimente online!
fonte
JavaScript (ES6),
3125 bytesExibe o valor em metros
fonte