Fondo
Innumerables generaciones de niños se han preguntado dónde terminarían si cavaran un agujero directamente hacia abajo. Resulta que esto, como era de esperar, sería bastante peligroso , pero de todos modos ...
Las antípodas son puntos que están directamente opuestos entre sí en la superficie de la Tierra. Esto significa que si se dibujara una línea entre los dos puntos, pasaría por el centro de la Tierra.
Reto
Escriba un programa o función que, dado un punto, encuentre su antípoda.
En este desafío, los puntos se representan utilizando el sistema de longitud-latitud y grados, minutos de arco y segundos de arco. Para encontrar la antípoda, intercambie las direcciones de cada ordenada ( N <-> S
y W <-> E
) y reste la ordenada de longitud de los 180
grados.
Ejemplo:
toma el punto N 50 26 23 W 4 18 29
. Cambia las instrucciones para dar S 50 26 23 E 4 18 29
. Resta la ordenada de longitud de 180 0 0
para dar 175 41 31
, dejando las coordenadas de antípoda como S 50 26 23 E 175 41 31
.
Reglas
Entrada
Un conjunto de coordenadas de latitud y longitud, en cualquier formato razonable , donde cada ordenada contiene una dirección, una cantidad de grados, una cantidad de minutos de arco y una cantidad de segundos de arco.
Salida
Las coordenadas de latitud-longitud de la antípoda, en cualquier formato razonable , donde cada ordenada contiene una dirección, una cantidad de grados, una cantidad de minutos de arco y una cantidad de segundos de arco.
Considere razonable que cada parte de la coordenada se puede distinguir sin ambigüedades.
Especificaciones
- La dirección para la ordenada de latitud es
N
oS
, y la de la ordenada de longitud esW
oE
. - Todos los valores de coordenadas son enteros. El valor del grado será entre
0
y90
para la latitud, y entre0
y180
para la longitud. Los valores de minuto de arco y segundo de arco para ambas ordenadas estarán entre0
y59
. - Si todos los valores para una ordenada son
0
, cualquier dirección es aceptable. - No es necesario poner a cero ningún valor.
- Ninguna ordenada de latitud será más grande que los
90
grados, y ninguna ordenada de longitud será más grande que los180
grados. - Se aplican lagunas estándar .
Casos de prueba
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
Enlaces útiles
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
N
,S
,E
, oW
como una dirección, mientras que el redundantes0
ambigüedad introduce en cuanto a qué valor representa qué componente de la ordenada.Respuestas:
05AB1E,
3734 bytesExplicado
Pruébalo en línea
Editar: Guardado 3 bytes gracias a Adnan .
fuente
"NEWS"
a‘€Ã‘
, o incluso'€Ã
si se permite minúsculas.JavaScript (ES6), 88 bytes
Toma 8 parámetros y devuelve una matriz como resultado. Espera
a
ser uno deN
oS
y de manera similare
ser uno deW
oE
. Cálculos:f
necesita restarse de 179 si esg
oh
no es cero, pero 180 si ambosg
yh
son cero (porque no hay préstamo), por lo tanto,!(g|h)
se agrega al 179.g
necesita ser cero si ambosg
yh
son cero, por lo tantog|h&&
, debe restarse de 59 sih
no es cero pero 60 sih
es cero (porque no hay préstamo), por lo tanto,!h
se agrega al 59.h
necesita ser cero si ya era cero, de lo contrario, simplemente se resta de 60.Otra forma de ver esto es darse cuenta de que resta en binario se consigue añadiendo el complemento 1s más un adicional 1. Traducido a este problema, tomamos
179-f
,59-g
y59-h
y añadir 1.59-h
+ 1 es60-h
, pero si esto es 60 entonces se lleva , por lo que el resultado deseado es cero sih
originalmente era cero. Agregamos 1 a59-g
si hay un carry fromh
, es decir, sih
originalmente era cero. Nuevamente tenemos que permitir un acarreo, que esta vez sucede si ambosg
yh
son cero, y agregamos 1 a179-f
en este caso.fuente
MATL , 51 bytes
Formato de entrada:
Formato de salida:
Pruébalo en línea!
Explicación
fuente
bnase
.Raqueta, 199 bytes
Eso es terriblemente largo. Probablemente hay algunas cosas que podría hacer para acortarlo aún más, pero se estremece por haber terminado.
Toma un
cons
par de doslists
: uno para la latitud y otro para la longitud. Cada lista tiene la dirección (como un símbolo de Raqueta en minúscula) como su primer elemento y, a continuación, los grados, minutos de arco y segundos de arco. Salidas en el mismo formatoRacket interpretará este par de dos listas como una sola lista con otra lista como su primer elemento. Esto está perfectamente bien, ya que aún puede acceder a la latitud y la longitud como si fueran dos listas en un par.
Uso:
Que puede ser interpretado por código futuro como
'((n 43 9 9) (w 179 59 55))
dos listas.fuente
Pyth,
41454335 bytesUtiliza la conversión de base 60 para convertir grados y minutos en segundos.
Formato de E / S:
Imprime una línea cada vez que ingresa una línea, por lo que para tener un formato atractivo, puede usar la CLI y canalizar la entrada, o más convenientemente, usar la implementación de Pyth en línea .
En pseudocódigo:
fuente
Python 2,
140122 bytesActualizado:
Esto utiliza un enfoque ligeramente diferente: establecer los valores para restar de la longitud en función de los minutos y segundos. Si hay 0 minutos y segundos, resta 180 de los grados, y si hay> 0 minutos y segundos, resta 179, 59 y 60 de d, m, s respectivamente.
Original:
Toma la entrada como una lista:
f(['N', 0, 0, 0, 'E', 0, 0, 0])
convierte la longitud a grados decimales, resta de 180, luego vuelve a convertir a grados, minutos, segundos y reconstruye la lista, volteando las direcciones en el proceso.Sin golf:
Intentalo
fuente
JavaScript,
138137129124112110Mejora de 2 bytes inspirada en el código de @ Neil
sin golf
pruebas
fuente
Python 3,
131130 bytesFormatos: los ángulos son tuplas de la forma
(deg,min,sec)
, las direcciones son de la formaN
. Emite un cuádruple de 2 ángulos, cada uno seguido de su dirección.Versión sin golf:
fuente
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"]
Esto funciona usando el hecho de queTrue
yFalse
puede interpretarse como1
y0
, y pora if b else c
lo tanto es equivalente a[c, a][b]
. En una nota al margen, creo que su código original tiene un error tipográfico; deberíax=="W"
serz=="W"
?C #,
310269 bytesLa entrada es una cadena. Puedes probarlo en .NetFiddle .
Código
Si no tomo una
string
entrada sino unachar, float[], char, float[]
, puedo hacer:C #,
167166165163152148147139 bytesCódigo
También puedo eliminar
3600
y usarฐ
en su lugar para mover a 164 caracteres y 166 bytes. ¿Debo usarlo?C #, 150 bytes
Código
¡Una forma más .NET! Delego toda la lógica a .NET
struct
TimeSpan
y yoabuso el formato de cadenas de lógica. Entrada eschar, int, int, int, char, int, int, int
. Comparto este para dar algunas ideas. Tal vez alguien mejorará de una mejor manera que yo.fuente
string.Join()
...return
, tuve que agregarlo yo mismo ... Usando su pruebaa('N', new float[] { 50, 26, 23 }, 'W', new float[] { 4, 18, 29 })
que obtengoS 50 26 23 E 175.6919 41.51642 30.98511
, ¿consideraría esto un pase?Java,
199177o 151 o 134 bytesSolución de 177 bytes que imprime el resultado
Solución de 151 bytes que devuelve el resultado como matriz
134 Bytes si usamos la notación lambda
fuente
C, 188
Requiere 8 argumentos de programa, de lo contrario fallará. Pase argumentos como
N 50 26 23 W 4 18 29
. Indicadores de direcciónN
,S
,E
,W
, deben ser capitalizada.fuente
PostGIS, 123 bytes
Tool-For-The-Job es decepcionantemente detallado, en parte debido a la palabrería SQL y en parte debido a la necesidad de convertir a la geometría y viceversa:
Por otro lado, esta función única transformará puntos, colecciones de puntos o formas más complejas (como toda la costa de Australia y Nueva Zelanda).
fuente
PHP, 148 bytes
mismo enfoque que mi respuesta de JavaScript , busque un desglose
$
señalesforeach
porque PHParray_map
tiene una gran sobrecarga(60-$v)%60
porque se$v&&60-$v
convierte en booleano en PHPchr
,ord
y algunas aritméticas en el cambio de direcciónpruebas
ideas abandonadas
fuente
Befunge,
122114111 Bytes (110 caracteres)Formato de entrada:
Observe la dirección de longitud y los segundos de arco deben estar agrupados
Puedes probar el código aquí
fuente