Hintergrund
Unzählige Generationen von Kindern haben sich gefragt, wo sie landen würden, wenn sie ein Loch direkt nach unten gruben. Es stellt sich heraus, dass dies nicht überraschend ziemlich gefährlich wäre , aber trotzdem ...
Antipoden sind Punkte, die sich auf der Erdoberfläche direkt gegenüberliegen. Das bedeutet, wenn eine Linie zwischen den beiden Punkten gezogen würde, würde sie durch den Erdmittelpunkt verlaufen.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die bei gegebenem Punkt ihren Antipode findet.
Bei dieser Herausforderung werden Punkte mit dem Längen- und Breitengradsystem sowie Grad, Bogenminuten und Bogensekunden dargestellt. Um den Antipoden zu finden, tauschen Sie die Richtungen der einzelnen Ordinaten ( N <-> S
und W <-> E
) und subtrahieren Sie die Längengrad-Ordinate von den 180
Gradangaben.
Beispiel:
Nehmen Sie den Punkt N 50 26 23 W 4 18 29
. Tauschen Sie die Richtungen, um zu geben S 50 26 23 E 4 18 29
. Subtrahieren Sie die Längengrad-Ordinate von, 180 0 0
um anzugeben 175 41 31
, und lassen Sie die Antipoden-Koordinaten wie folgt S 50 26 23 E 175 41 31
.
Regeln
Eingang
Ein Satz von Breiten- und Längenkoordinaten in einem beliebigen vernünftigen Format , wobei jede Ordinate eine Richtung, eine Anzahl von Graden, eine Anzahl von Bogenminuten und eine Anzahl von Bogensekunden enthält.
Ausgabe
Die Breitengrad-Längengrad-Koordinaten des Antipodes in einem beliebigen vernünftigen Format , wobei jede Ordinate eine Richtung, eine Anzahl von Grad, eine Anzahl von Bogenminuten und eine Anzahl von Bogensekunden enthält.
Nehmen wir an, dass jeder Teil der Koordinate eindeutig unterschieden werden kann.
Technische Daten
- Die Richtung für die Breitengrad-Ordinate ist
N
oderS
, und die für die Längengrad-Ordinate istW
oderE
. - Alle Koordinatenwerte sind Ganzzahlen. Der Gradwert liegt zwischen
0
und90
für den Breitengrad sowie zwischen0
und180
für den Längengrad. Die Bogenminuten- und Bogensekundenwerte für beide Ordinaten liegen zwischen0
und59
. - Wenn alle Werte für eine Ordinate sind
0
, ist jede Richtung akzeptabel. - Es ist nicht erforderlich, Werte auf Null zu setzen.
- Keine Breitengrad-Ordinate wird jemals größer als
90
Grad sein, und keine Längengrad-Ordinate wird jemals größer als180
Grad sein. - Es gelten Standardlücken .
Testfälle
N 50 26 23 W 4 18 29 -> S 50 26 23 E 175 41 31
S 43 9 9 E 0 0 5 -> N 43 9 9 W 179 59 55
N 0 0 0 E 0 0 0 -> S/N 0 0 0 W/E 180 0 0 (either direction fine in each case)
S 1 2 3 W 4 5 6 -> N 1 2 3 E 175 54 54
S 9 21 43 W 150 7 59 -> N 9 21 43 E 29 52 1
S 27 40 2 W 23 0 0 -> N 27 40 2 E 157 0 0
N 0 58 37 W 37 0 0 -> S 0 58 37 E 143 0 0
Nützliche Links
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes!
N
,S
,E
, oderW
als eine Richtung, während die redundanten0
einleitet Unklarheit über den Wert darstellt, den Bestandteil der Ordinate.Antworten:
05AB1E,
3734 BytesErklärt
Probieren Sie es online aus
Bearbeiten: 3 Bytes dank Adnan gespeichert .
quelle
"NEWS"
zu‘€Ã‘
oder auch'€Ã
wenn Klein erlaubt ist.JavaScript (ES6), 88 Byte
Nimmt 8 Parameter und gibt als Ergebnis ein Array zurück. Erwartet
a
, einer vonN
oder zu seinS
und in ähnlichere
Weise einer vonW
oder zu seinE
. Berechnungen:f
muss von 179 subtrahiert werden, wenn einer von beideng
oderh
ungleich Null ist, aber von 180, wenn beideg
undh
Null sind (da kein Kredit vorhanden ist), wird also!(g|h)
zu 179 addiert.g
muss null sein, wenn beideg
undh
null sindg|h&&
, andernfalls muss es von 59 subtrahiert werden, wennh
ungleich null ist, aber 60, wennh
null ist (da kein Kredit vorhanden ist), wird also!h
zu 59 addiert.h
muss Null sein, wenn es bereits Null war, sonst wird es einfach von 60 subtrahiert.Eine weitere Möglichkeit zu sehen , das ist zu bemerken , dass in binärer Subtraktion durch Addition des 1s - Komplements erreicht wird , plus ein zusätzliches 1. für dieses Problem übersetzt, wir nehmen
179-f
,59-g
und ,59-h
und fügen Sie 159-h
+ 1 ist60-h
, aber wenn diese 60 ist dann trägt Das gewünschte Ergebnis ist also Null, wennh
es ursprünglich Null war. Wir addieren 1 zu,59-g
wenn es einen Übertrag von gibth
, dh wennh
ursprünglich Null war. Wieder müssen wir einen Übertrag berücksichtigen, der diesmal passiert, wenn beideg
undh
Null sind, und wir addieren179-f
in diesem Fall 1 dazu .quelle
MATL , 51 Bytes
Eingabeformat:
Ausgabeformat:
Probieren Sie es online!
Erläuterung
quelle
bnase
.Schläger, 199 Bytes
Das ist schrecklich lang. Wahrscheinlich gibt es einige Dinge , die ich tun könnte , um es weiter zu verkürzen, aber graut ich völlig fertig bin.
Nimmt ein
cons
Paar von zweilists
: eine für den Breitengrad und eine für den Längengrad. Jede Liste hat die Richtung (als kleines Racket-Symbol) als erstes Element und folgt ihr in Grad, Bogenminuten und Bogensekunden. Ausgaben im selben FormatRacket interpretiert dieses Paar von zwei Listen als einzelne Liste mit einer anderen Liste als erstem Element. Dies ist vollkommen in Ordnung, da Sie immer noch auf Längen- und Breitengrade zugreifen können, als wären es zwei Listen in einem Paar.
Verwendung:
Was durch zukünftigen Code als
'((n 43 9 9) (w 179 59 55))
zwei Listen interpretiert werden kann .quelle
Pyth,
41454335 BytesVerwendet die Basis-60-Konvertierung, um Grad und Minuten in Sekunden umzuwandeln.
E / A-Format:
Jedes Mal, wenn Sie eine Zeile eingeben, wird eine Zeile gedruckt . Um ein ansprechendes Format zu erhalten, können Sie entweder die CLI verwenden und die Eingabe per Pipe weiterleiten oder die Online-Pyth-Implementierung verwenden .
Im Pseudocode:
quelle
Python 2,
140122 BytesAktualisiert:
Hierbei wird ein etwas anderer Ansatz verwendet: Festlegen der Werte zum Subtrahieren von der Länge basierend auf den Minuten und Sekunden. Wenn es 0 Minuten und Sekunden gibt, subtrahiert es 180 von den Graden, und wenn es> 0 Minuten und Sekunden gibt, subtrahiert es 179, 59 und 60 von den d, m, s.
Original:
Nimmt die Eingabe als Liste
f(['N', 0, 0, 0, 'E', 0, 0, 0])
:, konvertiert den Längengrad in Dezimalgrad, subtrahiert von 180, konvertiert dann zurück in Grad, Minuten, Sekunden und erstellt die Liste neu, wobei die Richtungen umgekehrt werden.Nicht golfen:
Versuch es
quelle
JavaScript,
1381371291241121102-Byte-Verbesserung, inspiriert von Neils Code
ungolfed
Tests
quelle
Python 3,
131130 BytesFormate: Winkel sind Tupel der Form
(deg,min,sec)
, Richtungen sind der FormN
. Gibt ein Vierfaches von 2 Winkeln aus, denen jeweils die Richtung folgt.Ungolfed-Version:
quelle
def f(w,x,y,z):S=60;d=divmod;a,b,c=y;l,m=d(648e3-c-S*b-S*S*a,S);return w,["S","N"][x=="S"],d(l,S)+(m,),["W","E"][z=="W"]
Dies funktioniert, indem Sie die Tatsache verwenden, dassTrue
undFalse
als1
und interpretiert werden0
kann und dahera if b else c
äquivalent zu ist[c, a][b]
. Nebenbei denke ich, dass Ihr ursprünglicher Code ein Tippfehler ist; solltex=="W"
seinz=="W"
?C #,
310269 BytesDie Eingabe ist eine Zeichenfolge. Sie können es auf .NetFiddle ausprobieren .
Code
Wenn ich nicht a
string
als Eingabe, sondern a nehmechar, float[], char, float[]
, kann ich Folgendes tun:C #,
167166165163152148147139 BytesCode
Außerdem kann ich das entfernen
3600
undฐ
stattdessen verwenden, um zu 164 Zeichen und 166 Bytes zu wechseln. Soll ich es benutzen?C #, 150 Bytes
Code
Mehr .NET! Ich delegieren alle die Logik auf die .NET
struct
TimeSpan
und ichabverwenden , um die Zeichenfolge Formatierung Logik. Eingabe istchar, int, int, int, char, int, int, int
. Ich teile dieses, um einige Ideen zu geben. Vielleicht verbessert sich jemand besser als ich.quelle
string.Join()
...return
, ich habe es selbst hinzufügen ... Ihren Testa('N', new float[] { 50, 26, 23 }, 'W', new float[] { 4, 18, 29 })
ichS 50 26 23 E 175.6919 41.51642 30.98511
- würden Sie dies bitte ein Pass?Java,
199177 oder 151 oder 134 Bytes177 Bytes Lösung, die das Ergebnis druckt
151-Byte-Lösung, die das Ergebnis als Array zurückgibt
134 Bytes, wenn wir die Lambda-Notation verwenden
quelle
C 188
Benötigt 8 Programmargumente, schlägt sonst fehl. Übergeben Sie Argumente wie
N 50 26 23 W 4 18 29
. FahrtrichtungsanzeigerN
,S
,E
,W
müssen, aktiviert.quelle
PostGIS, 123 Bytes
Das Tool-For-The-Job ist enttäuschend ausführlich, teils aufgrund von SQL-Wordiness und teils aufgrund der Notwendigkeit, auf Geometrie und zurück zu setzen:
Andererseits transformiert diese einzelne Funktion Punkte, Punktsammlungen oder komplexere Formen (wie die gesamte Küste Australiens und Neuseelands).
quelle
PHP, 148 Bytes
Gleicher Ansatz wie meine JavaScript-Antwort , schau dort nach einer Aufschlüsselung
$
Zeichenforeach
weil PHParray_map
einen riesigen Overhead hat(60-$v)%60
weil$v&&60-$v
in PHP nach boolesch umgewandelt wirdchr
,ord
und einige Arithmetik auf den RichtungswechselTests
aufgegebene Ideen
quelle
Befunge,
122114111 Bytes (110 Zeichen)Eingabeformat:
Beachten Sie, dass die Längengradrichtung und die Bogensekunden zusammengedrängt sein müssen
Sie können den Code testen hier
quelle