introduction
Aujourd'hui je suis allé pêcher seul avec mon canoë, malheureusement je me suis endormi et le ruisseau m'a emporté, j'ai perdu mes rames, maintenant il fait nuit et je suis perdu dans l'océan! Je ne peux pas voir la côte donc je dois être loin!
J'ai mon téléphone portable mais est défectueux car il a été mouillé par l'eau salée, je ne peux pas parler ou entendre quoi que ce soit car le micro et le haut-parleur du téléphone sont cassés, mais je peux envoyer des SMS à mon ami qui est sur la plage de la côte!
Mon ami a une torche très puissante et il l'a soulevée au-dessus des cannes de bambou pour me montrer la bonne direction, mais je ne peux pas ramer parce que je n'ai pas de rames, donc je dois lui dire à quelle distance je suis pour qu'il puisse envoyer quelqu'un à attrapez-moi!
Mon ami m'a dit qu'il maintenait la torche à 11,50 mètres au niveau de la mer, et je peux voir la lumière juste à l'horizon. Maintenant, je me souviens seulement de l'école que le rayon de la Terre devrait être de 6371 km au niveau de la mer, et je suis assis dans mon canot afin que vous puissiez supposer que mes yeux sont également au niveau de la mer.
Tâche
Comme les courants me déplacent de moment en moment, mon ami lève la torche de temps en temps (maintenant il est à 12,30 mètres), veuillez écrire un programme ou une fonction complète qui m'aidera à calculer la distance de la position de mon ami!
Voici un schéma (pas à l'échelle):
Le point orange marqué M
est moi, le point rouge marqué T
est la torche. La ligne verte est la distance linéaire entre M
etT
Contribution
Prenez à partir de l'entrée standard la hauteur de la torche h
en mètres au niveau de la mer, que je vois juste au-dessus de l'horizon, sous la forme d'un nombre à virgule flottante avec une précision de deux décimales (avec une précision de 1 centimètre ou 0,01 mètre), dans le gamme de 0 à 100 inclus.
Production
Vous devez renvoyer la longueur euclidienne de la ligne verte avec une précision de 1 cm. Par exemple, si vous produisez en mètres, cela devrait être avec deux décimales (au moins). La sortie peut être en mètres ou en kilomètres, mais en respectant la précision.
Cas de test:
Toutes les valeurs en mètres.
11.5 > 12105.08
13.8 > 13260.45
Règles
Le code le plus court gagne.
Réponses:
05AB1E ,
131210 octetsEnregistré 2 octets grâce à Emigna.
Puisqu'il n'y a pas de fonctions trigonométriques à appeler en utilisant l'hypothèse d'OP que la terre est localement un plan, il devient possible de faire une solution 05AB1E.
Essayez-le en ligne!
la source
12742000
peut être écrit comme•1#oC•
•1#oC•+*t
en 2sable•
représente un ... nombre 214 de base? 05AB1E souffre parfois d'un manque de documentation sur ces fonctions spéciales. Belle réponse 2sable aussi. Je l'ai découvert il y a quelques jours mais je n'ai pas pensé à l'utiliser pour cette question.Python,
3426 octets:( -8 octets grâce à Osable! )
Une fonction lambda anonyme. Prend les entrées en kilomètres et les sorties en kilomètres. Invoquer en tant que
print(<Function Name>(<Input>))
.la source
lambda i:(i*(i+12742))**.5
serait encore plus court.i
et 12742, l'expression peut être raccourcie ainsi:(i*12742)**.5
PHP, 34 octets
panne
jusqu'à présent, c'est identique à l'ancienne réponse Mathematica
il ne reste plus qu'à ajouter des entrées
=$argv[1]
et des sorties<?=
- c'est faitla source
dc,
1611 octets:Demande l'entrée via la ligne de commande en kilomètres, puis affiche la distance en kilomètres.
Explication
Cela profite des avantages suivants:
la source
jq, 18 caractères
Encore une autre copie de la même formule.
Exemple d'exécution:
Test en ligne
la source
Haskell, 22 octets
Usage:
Sans point: (23 octets)
la source
R, 29 octets
Prend l'entrée de stdin
la source
(h=scan())*(1+12742e3/h)^.5
.Mathematica, 16 octets
L'un ou l'autre de ces travaux pour l'entrée et la sortie en kilomètres:
Il s'agit d'une simple application de Pythagore au problème:
la source
Jelly, 9 octets dans la page de codes de Jelly
J'ai décidé d'essayer d'écrire le programme dans une langue de golf. J'ai en fait trouvé un algorithme plus efficace que celui que les autres utilisent (au moins sur de courtes distances comme celui de la question), mais il nécessite des nombres à virgule flottante littéraux que Jelly ne semble pas être capable de compresser, donc Pythagoras c'est.
Explication:
Le besoin de
µ
séparateur me contrarie, mais je pense que c'est inévitable; Jelly a déjà enregistré un octet sur 05AB1E en pouvant deviner de quels arguments de nombreuses commandes ont besoin, mais dans ce cas, il ne peut pas deviner correctement jusqu'à la fin, j'ai donc dû lui donner un indice.Jelly, 7 octets dans la page de codes de Jelly
Comme je l'ai expliqué dans mon autre réponse , l'approximation en série de l'approximation de Pythagore produit en fait de meilleurs résultats sur les longueurs incluses dans la question (au moins, elles sont plus proches des sorties d'exemple), et a également une formule plus courte. Pendant que je l'écrivais, j'ai réalisé qu'au lieu de calculer la racine carrée de 12742000 à l'avance, je pouvais d'abord multiplier le nombre par 12742000, puis la racine carrée les deux en même temps. Ceci est fondamentalement équivalent à l'autre formule sans l'addition, et en tant que tel, il peut être produit à partir du programme précédent en supprimant l'addition de celui-ci. Cela économise deux octets, car il analyse désormais sans ambiguïté et nous n'avons donc plus besoin d'un
µ
.la source
Rubis, 23
23 octets, en Km
25 octets, en m
la source
Tcl, 49 octets:
Eh bien, je suis tout nouveau à Tcl, donc tous les conseils pour jouer au golf sont très appréciés. Comme mes autres réponses, invite à entrer la ligne de commande en kilomètres et les sorties en kilomètres. Essentiellement une adaptation Tcl de mes existants
dc
etpython
réponses.la source
x86_64 + code machine SSE, 16 octets
Les octets du programme sont à gauche (en hexadécimal), il y a un démontage à droite pour le rendre un peu plus facile à lire. Il s'agit d'une fonction qui suit la convention x86_64 normale pour les fonctions prenant et retournant un nombre à virgule flottante simple précision (elle prend l'argument en% xmm0 et renvoie sa réponse dans le même registre, et utilise% xmm1 et% eax comme temporaires; ces sont les mêmes conventions d'appel qu'un programme C utilisera, et en tant que tel, vous pouvez appeler la fonction directement à partir d'un programme C, c'est ainsi que je l'ai testée).
Même avec un démontage, cependant, cela nécessite toujours une explication. Tout d'abord, il vaut la peine de discuter de la formule. La plupart des gens ignorent la courbure de la terre et utilisent la formule de Pythagore pour mesurer la distance. Je le fais aussi, mais j'utilise une approximation d'extension en série; Je ne prends que le terme relatif à la première puissance de l'entrée et j'ignore les troisième, cinquième, septième, etc. pouvoirs, qui n'ont tous qu'une très petite influence à cette courte distance. (En outre, l'approximation de Pythagore donne une valeur faible, tandis que les termes ultérieurs de l'expansion en série servent à réduire la valeur; en tant que tel, en ignorant un facteur mineur qui servirait à pousser l'approximation dans la mauvaise direction, il se trouve que j'obtiens un résultat plus précis en utilisant une formule moins précise.) La formule s'avère être √12742000 × √h;
0x455f1980
.La prochaine chose qui pourrait dérouter les gens est pourquoi j'utilise des instructions vectorielles pour la racine carrée et la multiplication;
%xmm0
et%xmm1
peut contenir quatre nombres à virgule flottante simple précision chacun, et je travaille sur les quatre. Le raisonnement ici est vraiment simple: leur codage est un octet plus court que celui des instructions scalaires correspondantes. Je peux donc faire en sorte que le FPU fasse un tas de travail supplémentaire de racine carrée et de multiplication des zéros afin de me sauver deux octets, dans une méthode qui rappelle très bien l'algorithme typique du langage de golf. (J'ai appelé l'assembleur x86 le langage du golf des assembleurs dans le chat il y a quelque temps, et je n'ai toujours pas changé d'avis à ce sujet.)À partir de là, l'algorithme est très simple: charger
%xmm1
avec √12742000 via%eax
(qui est plus court en termes d'octets que le charger depuis la mémoire), racine carrée de l'argument (et trois zéros), multiplier les éléments correspondants de%xmm1
et%xmm0
(nous ne nous soucions que sur le premier élément), puis revenez.la source
Minkolang v0.15, 22 octets
Essayez-le en ligne!
la source
JavaScript (ES6),
3125 octetsAffiche la valeur en mètres
la source