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 <-> Sy W <-> E) y reste la ordenada de longitud de los 180grados.
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 0para 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
NoS, y la de la ordenada de longitud esWoE. - Todos los valores de coordenadas son enteros. El valor del grado será entre
0y90para la latitud, y entre0y180para la longitud. Los valores de minuto de arco y segundo de arco para ambas ordenadas estarán entre0y59. - 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
90grados, y ninguna ordenada de longitud será más grande que los180grados. - 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, oWcomo una dirección, mientras que el redundantes0ambigü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
aser uno deNoSy de manera similareser uno deWoE. Cálculos:fnecesita restarse de 179 si esgohno es cero, pero 180 si ambosgyhson cero (porque no hay préstamo), por lo tanto,!(g|h)se agrega al 179.gnecesita ser cero si ambosgyhson cero, por lo tantog|h&&, debe restarse de 59 sihno es cero pero 60 sihes cero (porque no hay préstamo), por lo tanto,!hse agrega al 59.hnecesita 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-gy59-hy añadir 1.59-h+ 1 es60-h, pero si esto es 60 entonces se lleva , por lo que el resultado deseado es cero sihoriginalmente era cero. Agregamos 1 a59-gsi hay un carry fromh, es decir, sihoriginalmente era cero. Nuevamente tenemos que permitir un acarreo, que esta vez sucede si ambosgyhson cero, y agregamos 1 a179-fen 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
conspar 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 queTrueyFalsepuede interpretarse como1y0, y pora if b else clo 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
stringentrada sino unachar, float[], char, float[], puedo hacer:C #,
167166165163152148147139 bytesCódigo
También puedo eliminar
3600y 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
structTimeSpany 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ñalesforeachporque PHParray_maptiene una gran sobrecarga(60-$v)%60porque se$v&&60-$vconvierte en booleano en PHPchr,ordy 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