Einführung
Heute bin ich alleine mit meinem Kanu angeln gegangen, leider bin ich eingeschlafen und der Bach hat mich weggebracht, ich habe meine Ruder verloren, jetzt ist es Nacht und ich bin im Meer verloren! Ich kann die Küste nicht sehen, also muss ich weit weg sein!
Ich habe mein Handy, aber es funktioniert nicht, weil es durch das salzige Wasser nass geworden ist. Ich kann nichts sprechen oder hören, weil das Mikrofon und der Telefonlautsprecher kaputt sind, aber ich kann meinem Freund am Strand der Küste eine SMS senden!
Mein Freund hat eine sehr starke Fackel und er hat sie auf Bambusstangen gehoben, um mir die richtige Richtung zu zeigen, aber ich kann nicht rudern, weil ich keine Ruder habe, also muss ich ihm sagen, wie weit ich bin, damit er jemanden schicken kann Fang mich!
Mein Freund sagte mir, dass er die Fackel auf 11,50 Metern über dem Meeresspiegel hält und ich das Licht direkt über dem Horizont sehen kann. Jetzt erinnere ich mich nur noch an die Schule, dass der Erdradius 6371 km auf Meereshöhe betragen sollte, und ich sitze in meinem Kanu, sodass Sie davon ausgehen können, dass meine Augen auch auf Meereshöhe sind.
Aufgabe
Da mich die Strömungen von Moment zu Moment bewegen, hebt mein Freund von Zeit zu Zeit die Fackel an (jetzt sind es 12,30 Meter). Bitte schreiben Sie ein vollständiges Programm oder eine Funktion, mit deren Hilfe ich die Entfernung von der Position meines Freundes berechnen kann!
Hier ist ein Diagramm (nicht maßstabsgetreu):
Der orangefarbene Punkt M
ist ich, der rote Punkt T
ist die Fackel. Die grüne Linie ist der lineare Abstand zwischen M
undT
Eingang
Nehmen Sie von der Standardeingabe die Brennerhöhe h
in Metern auf Meereshöhe, die ich direkt über dem Horizont sehe, in Form einer Gleitkommazahl mit einer Genauigkeit von zwei Dezimalstellen (mit einer Genauigkeit von 1 Zentimeter oder 0,01 Metern) in der Bereich von 0 bis 100 enthalten.
Ausgabe
Sie sollten die euklidische Länge der grünen Linie mit einer Genauigkeit von 1 cm zurückgeben. Wenn Sie beispielsweise in Metern ausgeben, sollte dies (mindestens) zwei Dezimalstellen sein. Die Ausgabe kann entweder Meter oder Kilometer sein, wobei die Genauigkeit zu beachten ist.
Testfälle:
Alle Werte in Metern.
11.5 > 12105.08
13.8 > 13260.45
Regeln
Der kürzeste Code gewinnt.
quelle
Antworten:
05AB1E ,
131210 Bytes2 Bytes dank Emigna gespeichert.
Da unter Verwendung der Annahme von OP, dass die Erde lokal eine Ebene ist, keine trigonometrischen Funktionen aufgerufen werden können, wird es möglich, eine 05AB1E-Lösung zu erstellen.
Probieren Sie es online aus!
quelle
12742000
kann geschrieben werden als•1#oC•
•1#oC•+*t
in 2sable•
eine ... Basis 214-Zahl dar? 05AB1E leidet manchmal an einer Dokumentation zu solchen Sonderfunktionen. Schöne 2sable Antwort auch. Ich habe es vor ein paar Tagen herausgefunden, aber ich habe nicht darüber nachgedacht, es für diese Frage zu verwenden.Python,
3426 Bytes:( -8 Bytes dank Osable! )
Eine anonyme Lambda-Funktion. Nimmt Eingaben in Kilometern und Ausgaben in Kilometern vor. Rufen Sie als auf
print(<Function Name>(<Input>))
.quelle
lambda i:(i*(i+12742))**.5
wäre noch kürzer.i
gibt, kann der Ausdruck angesichts der Diskrepanz zwischen und 12742 so verkürzt werden:(i*12742)**.5
PHP, 34 Bytes
Nervenzusammenbruch
Bisher ist dies identisch mit der alten Mathematica-Antwort
Jetzt müssen Sie nur noch Input
=$argv[1]
und Output hinzufügen<?=
- fertigquelle
Gleichstrom,
1611 Bytes:Fordert zur Eingabe über die Befehlszeile in Kilometern auf und gibt dann die Entfernung in Kilometern aus.
Erläuterung
Dies nutzt Folgendes:
quelle
jq, 18 Zeichen
Noch eine Kopie derselben Formel.
Probelauf:
Online-Test
quelle
Haskell, 22 Bytes
Verwendung:
Punktfrei: (23 Bytes)
quelle
R, 29 Bytes
Nimmt Eingaben von stdin entgegen
quelle
(h=scan())*(1+12742e3/h)^.5
.Mathematica, 16 Bytes
Beides funktioniert sowohl für die Eingabe als auch für die Ausgabe in Kilometern:
Dies ist eine einfache Anwendung von Pythagoras auf das Problem:
quelle
Jelly, 9 Bytes in Jellys Codepage
Ich beschloss, das Programm in einer Golfsprache zu schreiben. Ich habe tatsächlich einen effizienteren Algorithmus gefunden als den, den andere Leute verwenden (zumindest über kurze Entfernungen wie den in der Frage), aber er erfordert wörtliche Gleitkommazahlen, die Jelly nicht zu komprimieren scheint, also Pythagoras es ist.
Erläuterung:
Die Notwendigkeit des
µ
Trennzeichens ärgert mich, aber ich denke, es ist unvermeidlich; Jelly hat bereits ein Byte über 05AB1E gespeichert, indem es erraten konnte, welche Argumente viele der Befehle benötigen, aber in diesem Fall kann es nicht bis zum Ende richtig erraten, daher musste ich ihm einen Hinweis geben.Jelly, 7 Bytes in Jellys Codepage
Wie ich in meiner anderen Antwort erklärt habe , liefert die Seriennäherung an die Pythagoras-Näherung tatsächlich bessere Ergebnisse über die in der Frage enthaltenen Längen (zumindest sind sie näher an den Beispielausgaben) und hat auch eine kürzere Formel. Während ich es schrieb, wurde mir klar, dass ich, anstatt die Quadratwurzel von 12742000 im Voraus zu berechnen, zuerst die Zahl mit 12742000 und dann beide gleichzeitig mit der Quadratwurzel multiplizieren konnte. Dies entspricht im Wesentlichen der anderen Formel ohne den Zusatz und kann als solcher aus dem vorherigen Programm erzeugt werden, indem der Zusatz daraus entfernt wird. Dies spart zwei Bytes, da es jetzt eindeutig analysiert wird und wir keine mehr benötigen
µ
.quelle
Ruby, 23
23 Bytes in km
25 Bytes in m
quelle
Tcl, 49 Bytes:
Nun, ich bin brandneu bei Tcl, daher sind alle Tipps zum Golfen sehr willkommen. Fordert wie meine anderen Antworten zur Eingabe der Befehlszeile in Kilometern und der Ausgabe in Kilometern auf. Im Wesentlichen eine Tcl-Anpassung meiner bestehenden
dc
undpython
Antworten.quelle
x86_64 + SSE-Maschinencode, 16 Byte
Die Bytes des Programms befinden sich links (hexadezimal). Rechts befindet sich eine Demontage, um das Lesen zu erleichtern. Dies ist eine Funktion, die der normalen x86_64-Konvention für Funktionen folgt, die eine Gleitkommazahl mit einfacher Genauigkeit annehmen und zurückgeben (sie nimmt das Argument in% xmm0 und gibt seine Antwort im selben Register zurück und verwendet% xmm1 und% eax als temporäre Werte; diese sind die gleichen Aufrufkonventionen, die ein C-Programm verwendet, und als solche können Sie die Funktion direkt von einem C-Programm aus aufrufen (so habe ich sie getestet).
Auch bei einer Demontage bedarf dies noch einer Erklärung. Zunächst lohnt es sich, die Formel zu diskutieren. Die meisten Menschen ignorieren die Krümmung der Erde und verwenden die Pythagoras-Formel, um die Entfernung zu messen. Ich mache es auch, aber ich benutze eine Serienerweiterungsnäherung; Ich nehme nur den Begriff, der sich auf die erste Potenz des Eingangs bezieht, und ignoriere die dritte, fünfte, siebte Potenz usw., die alle auf dieser kurzen Distanz nur einen sehr geringen Einfluss haben. (Außerdem ergibt die Pythagoras-Näherung einen niedrigen Wert, während die späteren Terme in der Reihenerweiterung dazu dienen, den Wert zu verringern. Wenn ich also einen kleinen Faktor ignoriere, der dazu dienen würde, die Näherung in die falsche Richtung zu verschieben, bekomme ich tatsächlich ein genaueres Ergebnis durch Verwendung einer weniger genauen Formel.) Die Formel lautet √12742000 × √h;
0x455f1980
.Das nächste, was die Leute verwirren könnte, ist, warum ich Vektoranweisungen für die Quadratwurzel und die Multiplikation verwende.
%xmm0
und%xmm1
kann jeweils vier Gleitkommazahlen mit einfacher Genauigkeit enthalten, und ich arbeite mit allen vier. Die Argumentation hier ist wirklich einfach: Ihre Codierung ist ein Byte kürzer als die der entsprechenden skalaren Anweisungen. So kann ich die FPU dazu bringen, eine Menge zusätzlicher Arbeit mit Quadratwurzeln und Multiplizieren von Nullen zu erledigen, um mir zwei Bytes zu ersparen, eine Methode, die sehr an den typischen Algorithmus der Golfsprache erinnert. (Ich habe x86 Assembler vor einiger Zeit die Golfsprache von Assemblern im Chat genannt, und ich habe meine Meinung dazu noch nicht geändert.)Von dort aus ist der Algorithmus sehr einfach: Laden
%xmm1
mit √12742000 via%eax
(was in Bezug auf Bytes kürzer ist als das Laden aus dem Speicher), Quadratwurzel des Arguments (und drei Nullen), Multiplizieren der entsprechenden Elemente von%xmm1
und%xmm0
(wir kümmern uns nur darum über das erste Element), dann zurück.quelle
Minkolang v0.15, 22 Bytes
Probieren Sie es online aus!
quelle
JavaScript (ES6),
3125 ByteZeigt den Wert in Metern an
quelle