fundo
Inúmeras gerações de crianças se perguntam onde iriam parar se cavassem um buraco diretamente para baixo. Acontece que isso seria, sem surpresa, bastante perigoso , mas de qualquer maneira ...
Antípodas são pontos diretamente opostos um ao outro na superfície da Terra. Isso significa que se uma linha fosse traçada entre os dois pontos, ela passaria pelo centro da Terra.
Desafio
Escreva um programa ou função que, dado um ponto, encontre seu antípoda.
Neste desafio, os pontos são representados usando o sistema longitude-latitude e graus, minutos de arco e segundos de arco. Para encontrar o antípoda, troque as direções de cada ordenada ( N <-> S
e W <-> E
) e subtraia a ordenada da longitude de 180
graus.
Exemplo:
Entenda N 50 26 23 W 4 18 29
. Troque as instruções para dar S 50 26 23 E 4 18 29
. Subtraia a ordenada de longitude de 180 0 0
para dar 175 41 31
, deixando as coordenadas do antípoda como S 50 26 23 E 175 41 31
.
Regras
Entrada
Um conjunto de coordenadas de latitude-longitude, em qualquer formato razoável , em que cada ordenada contém uma direção, um número de graus, um número de minutos de arco e um número de segundos de arco.
Saída
As coordenadas de latitude e longitude do antípoda, em qualquer formato razoável , em que cada ordenada contém uma direção, um número de graus, um número de minutos do arco e um número de segundos do arco.
Por razoável, significa que cada parte da coordenada pode ser distinguida sem ambiguidade.
Especificações
- A direção da ordenada da latitude é
N
ouS
, e a da ordenada da longitude éW
ouE
. - Todos os valores de coordenadas são inteiros. O valor do grau será entre
0
e90
para latitude e entre0
e180
para longitude. Os valores de minuto do arco e segundo do arco para as duas ordenadas estarão entre0
e59
. - Se todos os valores de uma ordenada forem
0
, qualquer direção é aceitável. - Não é necessário zerar nenhum valor.
- Nenhuma ordenada de latitude será maior que
90
graus, e nenhuma ordenada de longitude será maior que180
graus. - Aplicam-se brechas padrão .
Casos de teste
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
Links Úteis
Isso é código-golfe , então a resposta mais curta em bytes vence!
N
,S
,E
, ouW
como uma direção, enquanto o redundantes0
introduz ambiguidade quanto ao que valor representa qual componente da ordenada.Respostas:
05AB1E,
3734 bytesExplicado
Experimente online
Editar: salvou 3 bytes graças a Adnan .
fonte
"NEWS"
para‘€Ã‘
ou mesmo'€Ã
se letras minúsculas forem permitidas.JavaScript (ES6), 88 bytes
Toma 8 parâmetros e retorna uma matriz como resultado. Espera
a
ser um deN
ouS
e da mesma formae
ser um deW
ouE
. Cálculos:f
precisa ser subtraído de 179 se ég
ouh
não é zero, mas 180 se ambosg
eh
são zero (porque não há empréstimos), assim!(g|h)
é adicionado ao 179.g
precisa ser zero se ambosg
eh
são zero, portantog|h&&
, caso contrário, precisa ser subtraído de 59 seh
for diferente de zero, mas 60 seh
for zero (porque não há empréstimos), portanto!h
será adicionado ao 59.h
precisa ser zero se já era zero, caso contrário, é simplesmente subtraído de 60.Outra maneira de olhar para isso é aviso de que subtraindo em binário é conseguido através da adição do complemento 1s mais uma 1. adicional Traduzido para este problema, tomamos
179-f
,59-g
e59-h
e adicionar 1.59-h
+ 1 é60-h
, mas se este é de 60, em seguida, ele carrega , portanto, o resultado desejado é zero seh
era originalmente zero. Nós adicionamos 1 a59-g
se houver um carry deh
, ou seja, seh
era originalmente zero. Novamente, temos que permitir um carry, que desta vez acontece se ambosg
eh
são zero, e adicionamos 1179-f
nesse caso.fonte
MATL , 51 bytes
Formato de entrada:
Formato de saída:
Experimente online!
Explicação
fonte
bnase
.Raquete, 199 bytes
Isso é terrivelmente longo. Provavelmente, há algumas coisas que eu poderia fazer para reduzi-lo ainda mais, mas tremo completamente.
Toma um
cons
par de doislists
: um para a latitude e outro para a longitude. Cada lista tem a direção (como um símbolo de raquete em minúsculas) como seu primeiro item e segue os graus, minutos de arco e segundos de arco. Saídas no mesmo formatoRacket interpretará esse par de duas listas como uma única lista com outra lista como seu primeiro elemento. Isso é perfeitamente correto, pois você ainda pode acessar a latitude e a longitude como se fossem duas listas em um par.
Uso:
Que pode ser interpretado pelo código futuro como
'((n 43 9 9) (w 179 59 55))
duas listas.fonte
Pitão,
41454335 bytesUsa a conversão de base 60 para transformar graus e minutos em segundos.
Formato de E / S:
Ele imprime uma linha toda vez que você insere uma linha, para ter um formato bonito, você pode usar a CLI e canalizar a entrada ou, mais conveniente, usar a implementação Pyth online .
No pseudocódigo:
fonte
Python 2,
140122 bytesAtualizada:
Isso usa uma abordagem um pouco diferente: definir os valores para subtrair da longitude com base nos minutos e segundos. Se houver 0 minutos e segundos, subtrai 180 dos graus e, se houver> 0 minutos e segundos, subtrai 179, 59 e 60 dos d, m, s, respectivamente.
Original:
Pega a entrada como uma lista
f(['N', 0, 0, 0, 'E', 0, 0, 0])
:, converte a longitude em graus decimais, subtrai de 180, depois converte de volta para graus, minutos, segundos e reconstrói a lista, invertendo as direções no processo.Sem golfe:
Tente
fonte
JavaScript,
138137129124112110Melhoria de 2 bytes inspirada no código de @ Neil
destroçado
testes
fonte
Python 3,
131130 bytesFormatos: ângulos são tuplas da forma
(deg,min,sec)
, direções são da formaN
. Emite um quadruplo de 2 ângulos, cada um seguido por sua direção.Versão não destruída:
fonte
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"]
Isso funciona usando o fato de queTrue
eFalse
pode ser interpretado como1
e0
, portanto,a if b else c
é equivalente a[c, a][b]
. Em uma nota lateral, acho que seu código original possui um erro de digitação; deveriax=="W"
serz=="W"
?C #,
310269 bytesA entrada é uma sequência. Você pode experimentá-lo no .NetFiddle .
Código
Se eu não pegar a
string
como entrada, mas achar, float[], char, float[]
, posso:C #,
167166165163152148147139 bytesCódigo
Também posso remover
3600
e usarฐ
para mover para 164 caracteres e 166 bytes. Devo usá-lo?C #, 150 bytes
Código
Uma maneira mais .NET! I delegar toda a lógica para o .NET
struct
TimeSpan
e euabutilizar a cadeia de formatação lógica. Entrada échar, int, int, int, char, int, int, int
. Eu compartilho este para dar algumas idéias. Talvez alguém melhore de uma maneira melhor do que eu.fonte
string.Join()
...return
, tive que adicioná-lo eu mesmo ... Usando o testea('N', new float[] { 50, 26, 23 }, 'W', new float[] { 4, 18, 29 })
que receboS 50 26 23 E 175.6919 41.51642 30.98511
- você consideraria isso um passe?Java,
199177 ou 151 ou 134 bytesSolução de 177 bytes que imprime o resultado
Solução de 151 bytes que retorna o resultado como matriz
134 bytes se usamos a notação lambda
fonte
C, 188
Requer 8 argumentos do programa; caso contrário, falhará. Passe argumentos como
N 50 26 23 W 4 18 29
. Indicadores de direçãoN
,S
,E
,W
, deve ser capitalizado.fonte
PostGIS, 123 bytes
A Ferramenta para o trabalho é decepcionantemente detalhada, em parte devido ao detalhamento do SQL e em parte devido à necessidade de converter para geometria e vice-versa:
Por outro lado, essa função única transformará pontos, coleções de pontos ou formas mais complexas (como toda a costa da Austrália e Nova Zelândia).
fonte
PHP, 148 bytes
mesma abordagem da minha resposta JavaScript , procure um detalhamento
$
sinaisforeach
causa do PHParray_map
tem uma enorme sobrecarga(60-$v)%60
porque$v&&60-$v
lança para booleano em PHPchr
,ord
e algumas aritméticas na troca de direçãotestes
idéias abandonadas
fonte
Befunge,
122114111 Bytes (110 caracteres)Formato de entrada:
Observe que a direção da longitude e os segundos do arco devem ser agrupados
Você pode testar o código aqui
fonte