Задний план
Бесчисленные поколения детей задавались вопросом, где бы они оказались, если бы вырыли яму прямо вниз. Оказывается, это, что неудивительно, было бы довольно опасно , но в любом случае ...
Антиподы - это точки, которые прямо противоположны друг другу на поверхности Земли. Это означает, что если бы была проведена линия между двумя точками, она прошла бы через центр Земли.
Вызов
Напишите программу или функцию, которая, учитывая точку, находит свой антипод.
В этом испытании точки представлены с использованием системы долгота-широта и градусов, минут дуги и секунд дуги. Чтобы найти антипод, поменяйте местами направления каждой ординаты ( N <-> S
и W <-> E
) и вычтите долготу из 180
градусов.
Пример:
взять точку N 50 26 23 W 4 18 29
. Поменяйте местами, чтобы дать S 50 26 23 E 4 18 29
. Вычтите координату долготы, 180 0 0
чтобы дать 175 41 31
, оставляя координаты антипода как S 50 26 23 E 175 41 31
.
правила
вход
Набор координат широты и долготы в любом приемлемом формате , где каждая ордината содержит направление, количество градусов, количество минут дуги и количество секунд дуги.
Выход
Широта-долгота координат антипода в любом приемлемом формате , где каждая ордината содержит направление, количество градусов, количество минут дуги и количество секунд дуги.
Разумно предположить, что каждая часть координаты может быть однозначно различена.
Спекуляции
- Направление для ординаты широты -
N
илиS
, а для ординаты долготы -W
илиE
. - Все значения координат являются целыми числами. Значение градуса будет между
0
и90
для широты, а также между0
и180
для долготы. Значения минуты дуги и секунды дуги для обеих ординат будут между0
и59
. - Если все значения для ординаты равны
0
, любое направление приемлемо. - Нет необходимости дополнять нулями любые значения.
- Ни одна ордината широты никогда не будет больше
90
градусов, и никакая ордината долготы никогда не будет больше180
градусов. - Применяются стандартные лазейки .
Контрольные примеры
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
,S
,E
илиW
в направлении, в то время как избыточные0
вводит неоднозначность относительно того , какое значение представляет , какой компонент ординат.Ответы:
05AB1E,
3734 байтаРазъяснения
Попробуйте онлайн
Редактировать: 3 байта сохранены благодаря Аднану .
источник
"NEWS"
до‘€Ã‘
или даже'€Ã
если разрешены строчные буквы.JavaScript (ES6), 88 байт
Принимает 8 параметров и возвращает массив в качестве результата. Ожидается,
a
что он будет одним изN
илиS
аналогичным образомe
будет одним изW
илиE
. Расчеты:f
Должен быть вычтен из 179, если одинg
илиh
ненулевой, но 180, если обаg
иh
равны нулю (потому что нет заимствования), таким образом!(g|h)
, добавляется к 179.g
должен быть равен нулю, если обаg
иh
равны нулю, таким образомg|h&&
, в противном случае его нужно вычесть из 59, если онh
равен нулю, но 60, если онh
равен нулю (потому что нет заимствования), таким образом!h
, добавляется к 59.h
должен быть равен нулю, если он уже был равен нулю, в противном случае он просто вычитается из 60.Другой способ смотреть на это заметить , что вычитание в двоичной системе достигается за счет добавления 1s дополнение плюс дополнительный 1. Перевод этой проблемы, мы принимаем
179-f
,59-g
и59-h
и добавить 159-h
+ 160-h
, но если это 60 , то он несет Таким образом, желаемый результат равен нулю, еслиh
изначально был равен нулю. Мы добавляем 1 к59-g
если есть перенос изh
, т.е. еслиh
изначально был ноль. Опять же, мы должны разрешить перенос, который на этот раз происходит, если обаg
иh
равны нулю, и мы добавляем 1179-f
в этом случае.источник
MATL , 51 байт
Формат ввода:
Выходной формат:
Попробуйте онлайн!
объяснение
источник
bnase
.Ракетка, 199 байт
Это ужасно долго. Вероятно, есть некоторые вещи, которые я мог бы сделать, чтобы сократить его дальше, но вздрагивает, я полностью закончил.
Принимает
cons
пару из двухlists
: один для широты и один для долготы. Каждый список имеет направление (в виде строчного символа ракетки) в качестве первого элемента и после него градусы, минуты дуги и секунды дуги. Выходы в том же форматеRacket будет интерпретировать эту пару из двух списков как один список с другим списком в качестве первого элемента. Это прекрасно, так как вы все равно можете получить доступ к широте и долготе, как если бы они были двумя списками в паре.
Использование:
Что может быть интерпретировано будущим кодом как
'((n 43 9 9) (w 179 59 55))
два списка.источник
Pyth,
41454335 байтИспользует преобразование base-60 для поворота градусов и минут в секунды.
Формат ввода / вывода:
Он печатает строку каждый раз, когда вы вводите строку, поэтому, чтобы иметь красивый формат, вы можете либо использовать CLI и передать ввод, либо, что более удобно, использовать онлайн-реализацию Pyth .
В псевдокоде:
источник
Python 2,
140122 байтаОбновлено:
При этом используется немного другой подход: установка значений для вычитания из долготы на основе минут и секунд. Если есть 0 минут и секунд, он вычитает 180 из градусов, а если есть> 0 минут и секунд, он вычитает 179, 59 и 60 из d, m, s соответственно.
Оригинал:
Принимает ввод в виде списка:,
f(['N', 0, 0, 0, 'E', 0, 0, 0])
преобразует долготу в десятичные градусы, вычитает из 180, затем преобразует обратно в градусы, минуты, секунды и восстанавливает список, переворачивая направления в процессе.Un-golfed:
Попытайся
источник
JavaScript,
138137129124112110Улучшение 2 байта, вдохновленное кодом @ Neil
ungolfed
тесты
источник
Python 3,
131130 байтФорматы: углы - это кортежи формы
(deg,min,sec)
, направления - формыN
. Выводит четверку из 2 углов, за которыми следует направление.Безголовая версия:
источник
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"]
Это работает, используя тот факт, чтоTrue
иFalse
может интерпретироваться как1
и0
, и, следовательноa if b else c
, эквивалентно[c, a][b]
. Кстати, я думаю, что ваш оригинальный код содержит опечатку; должноx=="W"
бытьz=="W"
?C #,
310269 байтВвод одной строки. Вы можете попробовать это на .NetFiddle .
Код
Если я не принимаю в
string
качестве входных данных, ноchar, float[], char, float[]
я могу сделать:C #,
167166165163152148147139 байтКод
Также я могу удалить
3600
и использоватьฐ
вместо этого для перемещения до 164 символов и 166 байтов. Должен ли я использовать это?C #, 150 байт
Код
Более. NET способ! Я делегировать всю логику в .NET ,
struct
TimeSpan
и яабыиспользовать строку логики форматирования. Вход естьchar, int, int, int, char, int, int, int
. Я делюсь этим, чтобы дать некоторые идеи. Может быть, кто-то улучшится лучше, чем я.источник
string.Join()
...return
, я должен был добавить это сам ... С помощью тестa('N', new float[] { 50, 26, 23 }, 'W', new float[] { 4, 18, 29 })
я получаюS 50 26 23 E 175.6919 41.51642 30.98511
- Вы бы это пропуск?Java,
199177 или 151 или 134 байта177 байтов решение, которое печатает результат
151 байтовое решение, которое возвращает результат в виде массива
134 байта, если мы использовали лямбда-нотацию
источник
С 188
Требуется 8 аргументов программы, в противном случае произойдет сбой. Передавайте аргументы как
N 50 26 23 W 4 18 29
. Указатели поворотаN
,S
,E
,W
, должны быть капитализированы.источник
PostGIS, 123 байта
Tool-For-The-Job разочаровывающе многословен, отчасти из-за многословности SQL, а отчасти из-за необходимости приведения к геометрии и обратно:
С другой стороны, эта единственная функция преобразует точки, наборы точек или более сложные формы (такие как вся береговая линия Австралии и Новой Зеландии).
источник
PHP, 148 байт
тот же подход, что и мой ответ JavaScript , посмотрите на разбивку
$
знакамforeach
потому что PHParray_map
имеет огромные накладные расходы(60-$v)%60
потому что$v&&60-$v
приводит к булеву в PHPchr
,ord
и некоторая арифметика на смену направлениятесты
заброшенные идеи
источник
Befunge,
122114111 Bytes (110 символов)Формат ввода:
Обратите внимание, что направление долготы и секунды дуги должны быть объединены
Вы можете проверить код здесь
источник