Найти опорный угол

17

Это довольно простой вопрос. В соответствии с этим случайным веб-сайтом, который я обнаружил - веб-архивом , эталонный угол - the acute angle formed by the terminal side of the given angle and the x-axis.вы должны написать программу, чтобы найти их.

Я ничего не помню из алгебры 2, что это значит?

Углы обычно задаются в стандартной форме , которая измеряется путем помещения одной стороны угла и измерения на другую сторону против часовой стрелки, например:

Стандартная форма

Это будет ваш вклад. Ваш вывод будет исходным углом этого. Вы можете думать об этом как о наименьшем расстоянии от стороны терминала до оси X. За исключением того, что это угол, а не расстояние. Вот некоторые примеры:

Quad 2 ref Quad 1 ref

Quad 3 ref Quad 4 ref

Разъяснения

  • Все значения по умолчанию на входах и представлениях.
  • Углы в градусах .
  • Отрицательные углы, нецелые углы и углы> 360 град будут разрешены.
  • Вывод в форму 60 deg.
  • Это , поэтому выигрывает самый короткий код в байтах!

Еще одна полезная ссылка .

Тестовые случаи

70      ->  70 deg
135     ->  45 deg
210     ->  30 deg
-60     ->  60 deg
91      ->  89 deg
610     ->  70 deg
-1000   ->  80 deg
Maltysen
источник
1
Что мы делаем на входе 90?
lirtosiast
2
@ThomasKwa это будет 90 с любого направления.
Maltysen
1
Короткое решение abs(arcsin(sin(input)))+" deg", хотя я не знаю, какой язык победит (он должен был бы поддерживать степени и строковые операции).
lirtosiast
Всегда ли ввод является целым числом?
lirtosiast
6
Поскольку нецелые углы разрешены, вы должны включить один в тестовых случаях.
Деннис

Ответы:

6

Pyth, 18 байт

+.a-%+QK90yKK" deg

Попробуйте онлайн.

grovesNL
источник
уменьшил до 19, используя ваш алгоритм, но с встроенным назначением, не стесняйтесь использовать: pyth.herokuapp.com/…
Maltysen
@Maltysen: Спасибо, нашел еще одно улучшение
grovesNL
5

Python 2, 34 байта

lambda x:`90-abs(x%180-90)`+' deg'

Использование "%d deg"форматирования строки будет длиннее из-за необходимых скобок.

Sp3000
источник
4

постоянный ток, 25

90?90+d*v180%-d*vn[ deg]p

Примечание dcиспользует _знак -ve вместо- .

Тестовый вывод:

$ for test in 70 135 210 _60 91 610 _1000; do dc -e'90?90+d*v180%-d*vn[ deg]p' <<< $test ; done
70 deg
45 deg
30 deg
60 deg
89 deg
70 deg
80 deg
$
Цифровая травма
источник
3

Математика, 22 31

ToString@Abs@Mod[#,180,-90]deg&
alephalpha
источник
1
@ LegionMammal978 Если я просто умножу его deg, 0 degстанет 0.
алефальфа
1
Поскольку вам не Row@{Abs@Mod[#,180,-90],deg}&
важен
3

Python 2, 35

lambda x:`min(x%180,-x%180)`+' deg'

Чем меньше угол и его отрицательное по модулю 180 . Эффективно преобразует угол в диапазон от 0 до 180 и определяет расстояние до ближайших конечных точек. Обратите внимание, что -x%180группы как (-x)%180.

Та же длина с форматированием строки для Python 3:

lambda x:'%d deg'%min(x%180,-x%180)
XNOR
источник
3

Pyth 25 30 байт

Уж больно не творческое решение, используя тригонометрические функции. Постоянная ссылка

+.R.t.a.t.t.tQ7Z3 6?%Q1Q0" deg

Любые предложения приветствуются.

Winny
источник
1
Получил до 28, принимая .tзвонки и складывая их:+.R.t.a.tF[Q7Z3)6?%Q1Q0" deg
Maltysen
Ухоженная. Я заметил , что это не представляется работа с входом с плавающей точкой: 90.5 => 90.0 degхотя.
Винни
Это потому , что ваш не как: pyth.herokuapp.com/...
Maltysen
Интересный улов. С входом, -60.5 => 60.5 degно с 60.5 => 60.0 deg. Похоже, проблема с Pyth - пример использования pyth / macros.py
Winny
1

JavaScript (ES6), 43 байта

Подобно ответу Sp3000 , хотя модуль довольно длинный из-за поведения в JavaScript .

f=x=>90-Math.abs((x%180+180)%180-90)+' deg'

демонстрация

Код переписан в ES5 для совместимости с браузером:

function f(x){return 90-Math.abs((x%180+180)%180-90)+' deg'}

// Snippet stuff
console.log = function(x){document.body.innerHTML += x + '<br>'};
[70,135,210,-60,91,610,-1000].map(function(v){console.log(f(v))});

CoffeeScript, 45 байт

f=(x)->90-Math.abs((x%180+180)%180-90)+' deg'
rink.attendant.6
источник
5
Я предполагаю, что это было дизайнерское решение инженера по оборудованию PDP, которое ответственно за тот факт, что несколько десятилетий спустя у нас все еще очень мало языков, которые %разумно реализуют .
Питер Тейлор
Замена первых 180 с (t=180)последующей заменой следующих 180 на t, вероятно, сэкономит несколько байтов
Downgoat
@ vihan1086 То же самое
rink.attendant.6
1

Матлаб, 44

Использование анонимной функции:

f=@(x)[num2str(min(mod([x -x],180))) ' deg']

Пример:

>> f=@(x)[num2str(min(mod([x -x],180))) ' deg']
f = 
    @(x)[num2str(min(mod([x,-x],180))),' deg']

>> f(70)
ans =
70 deg

>> f(210)
ans =
30 deg

>> f(-1000)
ans =
80 deg
Луис Мендо
источник
4
Это не добавляет 'deg' в конце, хотя. (Не понизить.)
Legendre
@ Legendre Упс. Благодарность! Исправлено
Луис Мендо
1

Scala, 40 35 персонажей

(a:Int)⇒s"${90-(a%180-90).abs} deg"
Гилад Хох
источник
-1

PHP, 44 байта

Принимает один параметр командной строки. Снова PHP страдает той же проблемой, что и JavaScript .

<?=90-abs(($argv[1]%180+180)%180-90)+' deg';

Для использования канонического решения требуется 53 байта (преобразование градусов и радианов занимает много символов):

<?=rad2deg(abs(asin(sin(deg2rad($argv[1])))))+' deg';
rink.attendant.6
источник
1
Не использует PHP . для объединения?
Вниз,
@ vihan1086 Да, PHP использует . . Понижено, пока это не исправлено
Исмаэль Мигель