Синус величия


24

Введение

Все слышали о синусе (грех) , косинусе (cos) , касательной (tan) , котангенсе (cot) , секущей (sec) и cosecant (csc) . Почти у каждого угла есть они.

Гораздо менее известны или запомнились: exsecant (exsec) , excosecant (excsc) , versine (versin) и coverine (cvs) . Почти у каждого угла есть те также. Есть такие, которые еще менее известны, но мы будем придерживаться их.

Я создал их визуализацию для угла θ, который составляет 45 °.


Соревнование

Создайте программу, которая принимает ввод угла nв градусах и выводит:

  1. синус угла n

  2. косинус угла n

  3. тангенс угла n

  4. секущий угол n

  5. по крайней мере одно из следующего. Каждый дополнительный предмет из этого списка получит бонус -5%, максимум -25%.

    • вне угла n

    • косеканс угла n

    • исключительный угол n

    • вершина угла n

    • угол обзора n

    • котангенс угла n

Если после начисления бонуса ваш счет является десятичным, округлите до ближайшего целого числа.


вход

Вы можете принять свой ввод через STDIN или через вызов функции. Один аргумент n, будет передан.

n всегда будет целым числом, которое больше 0, но меньше или равно 90.


Выход

Вот пример вывода для синуса 45 °. Все выходные элементы должны быть в этом формате. Порядок пунктов не имеет значения.

sine: 0.70710678118

Все элементы должны иметь ровно 4 цифры после запятой (с точностью до десятитысячных). Ниже приведены несколько примеров округления.

0 -> 0.0000
1 -> 1.0000
0.2588190451 -> 0.2588
5.67128181962 -> 5.6713
10 -> 10.0000
12.4661204396 -> 12.4661

Любые несуществующие / неопределенные результаты должны по умолчанию равняться 0.


пример

myprogram(60)

sine: 0.8660
cosine: 0.5000
tangent: 1.7321
secant: 2.0000
exsecant: 1.0000
cosecant: 1.1547
excosecant: 0.1547
versine: 0.5000
coversine: 0.1340
cotangent: 0.5774

Табло

Чтобы ваш счет отображался на доске, он должен быть в следующем формате:

# Language, Score

Или, если вы заработали бонус:

# Language, Score (Bytes - Bonus%)

Зачеркивание не должно вызывать проблем.


Имеет ли значение порядок вывода?
Якуб

12
Впереди педантизм: «У каждого угла они есть» - неправда; например, нечетные кратные 90 градусов не имеют касательной. (Мне кажется очень странным, что вы требуете, чтобы несуществующие значения выдавали ноль. Вы действительно использовали бы программу, которая преднамеренно давала такие вводящие в заблуждение ответы?) Кроме того, мне было бы интересно узнать, почему вы рассматриваете косеканс и котангенс как быть более неясным, чем секущий; на моих уроках математики уровня А мы узнали об этих трех одновременно.
Hammerite

Фиксирована ли заглавная буква? Я хотел бы вывести 'Sine, Cosine ...'
edc65

Трудно понять, полная программа против ввода через вызов функции
edc65

1
Действительно ли введен угол greater than 0, поэтому 0 не допускается?
edc65

Ответы:


8

CJam, 94 89 85 81 80 байт

"sine tangent secant"S/{"co"1$+}%rd90/_i33Yb@[P*2/__ms\mc@mt]_Wf#W%+?.{d": %.4f"e%N}

Код имеет длину 84 байта и соответствует 5% -ному бонусу ( котангенс и косеканс ).

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

Как это работает

"sine tangent secant" e# Push that string.
S/                    e# Split it at spaces.
{"co"1$+}%            e# For each chunk, append a copy to the string "co", pushing
                      e# ["sine" "cosine" "tangent" "cotangent" "secant" "cosecant"].
rd90/                 e# Read a Double from STDIN and divide it by 90.
_i                    e# Push a copy and cast it to integer.
33Yb                  e# Push 33 in base 2, i.e., [1 0 0 0 0 1].
@                     e# Rotate the Double on top of the stack.
[                     e#
  P*2/                e# Multiply by Pi and divide by 2.
  __                  e# Push two copies of the result.
  ms                  e# Compute the sine of the topmost copy.
  \mc                 e# Swap and compute the cosine of the next copy.
  @mt                 e# Rotate and compute the tangent of the original.
 ]                    e#
 _Wf#                 e# Copy the array and raise all Doubles to the power -1.
                      e# This computes cosecant, secant and cotangent.
 W%                   e# Reverse their order.
 +                    e# Append to the original array.
 ?                    e# Select 33Yb if the integer part of the input divided by 90 is
                      e# (i.e., if the input is 90), the constructed array otherwise.
 .{                   e# For each function name and result:
   d                  e# Cast to Double (needed for 33Yb).
   ": %.4f"           e# Push a format string containing ": " and a 4-decimal float.
   e%                 e# Apply the formatting to the Double on the stack.
   N                  e# Push a linefeed.
 }                    e#

6

Юлия, 162 - 10% = 144 байта

n->for z=zip(split("sine cosine tangent secant exsecant cosecant cotangent"),[sind,cosd,tand,secd,i->secd(i)-1,cscd,cotd]) @printf("%s: %.4f\n",z[1],z[2](n))end

Ungolfed:

function f(n)
    # Construct a vector of names
    s = split("sine cosine tangent secant exsecant cosecant cotangent")

    # Construct a vector of functions
    o = [sind, cosd, tand, secd, i -> secd(i) - 1, cscd, cotd]

    # Print each in a loop
    for z = zip(s, o)
        @printf("%s: %.4f\n", z[1], z[2](n))
    end
end

Это у меня или у вашей "развернутой" версии есть дополнительный цикл?
Дэвид Аренбург

Тебе было бы лучше без излишеств и котангенс.
lirtosiast

@DavidArenburg Более длинная версия имеет такое же количество циклов, она написана иначе, чем короткая версия.
Алекс А.

@ThomasKwa Я знаю, но я все равно не выиграю. : P
Алекс А.

5

Pyth, 66 - 10% = 59,4 байта

j+V+Jc"sine secant tangent")+L"co"Jsmm%": %.4f"^.t.td7k^_1k3,Q-90Q

Рассчитывает синус, секущий и касательный. Тогда ко-функции просто вычисляются по формуле coF(x) = F(90 - x).


Это дает 0 для неопределенных?
lirtosiast

@ThomasKwa Не думай так.
orlp

1
Тогда это в настоящее время недействительно.
Lirtosiast

5

Mathematica (недействительный в данный момент), 134 121 104

Просто для удовольствия, конечно, можно много играть в гольф

f[n_]:=(a={Sin,Cos,Tan,Sec,Cot,Csc};TableForm[N[#@n,4]&/@a,TableHeadings->{ToString[#]<>":"&/@a,None}])

И он должен иметь бонус 5% (Детская кроватка и Csc), следовательно, на 99 символов

Пример вывода:

Пример вывода


Разве вы не получили бы лучший результат, добавив больше функций?
гордый haskeller

@proud haskeller, я могу попробовать, но, вероятно, я потеряю больше, чем
наберу

4
Это записывает имена функций полностью или использует 0для sec(90)?
lirtosiast

@ Томас Ква, это не должно, я проверю это, когда у меня будет шанс
WizardOfMenlo

Я действительно сомневаюсь, что это шоу реальных имен функций
Дэвид Аренбург

4

JavaScript (ES6), 173 (182 - 5%)

Редактировать исправлено после уточнения, теперь бонус 5%

Редактировать понял, что угол не может быть 0

// TEST - redefine alert
alert=x=>O.innerHTML=x

r=(a=prompt(i=0))*(M=Math).PI/180,V=_=>[s=M.sin(r),c=M.cos(r),(f=a-90)&&s/c,c/s,f&&1/c,1/s][i++].toFixed(4);
alert(`sine
tangent
secant`.replace(/.+/g,h=>h+`: ${V()}
co${h}: ${V()}`))

/* More bonus, but too longer 
r=(a=prompt(i=0))*(M=Math).PI/180,V=_=>[s=M.sin(r),c=M.cos(r),1-c,1-s,(f=a-90)&&s/c,c/s,f&&1/c,1/s][i++].toFixed(4);
alert(`sine
versine
tangent
secant`.replace(/.+/g,h=>h+`: ${V()}
co${h}: ${V()}`))
*/
<pre id=O></pre>


4

Javascript ES6, 154 148 (198 - 25%)

(n=0)=>[S='sine',(O='co')+S,T='tangent',C='secant',X=O+C,O+T,V='ver'+S,O+V,'ex'+C,'ex'+X].map((q,i)=>q+': '+[s=Math.sin(n),c=Math.cos(n),t=s/c,e=1/c,o=1/s,1/t,1-c,1-s,e-1,o-1][i].toFixed(4)).join`
`

Ungolfed:

(n=0)=>          // function declaration, accepts number, defaults to 0
  [              // create array of trig function names
    S='sine',    // sine
    (O='co')+S,  // cosine
    T='tangent', // tangent
    C='secant',  // secant
    X=O+C,       // cosecant
    O+T,         // cotangent
    V='ver'+S,   // versine
    O+V,         // coversine
    'ex'+C,      // exsecant
    'ex'+X       // excosecant
  ].map((q,i)=>  // map over names
                 // append ": <value rounded to 4 decimals>" to function name:
    q+': '+[s=Math.sin(n),c=Math.cos(n),t=s/c,e=1/c,o=1/s,1/t,1-c,1-s,e-1,o-1][i].toFixed(4)
  ).join`        // add newline between each function
`

Не могли бы вы добавить запятую после «Javascript ES6» в заголовок, чтобы ваш счет был правильно проанализирован?
Зак Гейтс

3

R 122 136 134 байта

n=scan()*pi/180;write(paste0(c("sine","cosine","tangent","secant","versine"),sprintf(": %.4f",c(sin(n),r<-cos(n),tan(n),1/r,1-r))),"")

Пример использования

> n=scan()*pi/180;write(paste0(c("sine","cosine","tangent","secant","versine"),sprintf(": %.4f",c(sin(n),r<-cos(n),tan(n),1/r,1-r))),"")
1: 60
2: 
Read 1 item
sine: 0.8660
cosine: 0.5000
tangent: 1.7321
secant: 2.0000
versine: 0.5000

2
scan()/(180/pi)-> scan()*pi/180?
Lirtosiast

3

Perl, 182 177 (236 - 25%)

Запустить с -n(1 байт добавлен к некорректному счету).

$b=$_==90;$_/=57.296;$c=cos;$s=sin;sub f{printf"%s: %.4f\n",@_}$T=tangent;f$T,$b?0:$s/$c;f co.$T,$c/$s;$S=sine;f $S,$s;f co.$S,$c;$C=secant;f$C,$b?0:1/$c;f co.$C,1/$s;f ex.$C,$b?0:1-1/$c;f exco.$C,1/$s-1;$V=ver.$S;f$V,1-$c;f co.$V,1-$s

Ничего фантастического. Он использует преимущества -nдля неявного ввода, $_в качестве аргумента по умолчанию для sinand cosи голых слов для строк. Правило «undefined = 0» жестко закодировано при использовании троичного оператора ?:(оно применяется только для 90 °).

Одна вещь , которую я learend, что , по- видимому, вы не можете иметь (или не может назвать ) подпрограмма по имени s(или m, y, tr): sub s {print 1}; sурожайность Substitution pattern not terminated at -e line 1.


По какой-то причине ваш счет анализируется еще более странно.
Лейф Виллертс

Не могли бы вы добавить запятую после «Perl», чтобы ваш счет анализировался правильно?
Зак Гейтс

3

Python 3, 282 (375 - 25%)

Обработка ошибок оказалась несколько сложной из-за ошибок с плавающей точкой; а именно, cos(90)вышло очень маленькое число вместо нуля.

Это никогда не будет лучшим ответом, но мне нравится думать, что это может быть самый короткий действительный ответ для всех функций на языке, не относящемся к гольфу, который не имеет тригонометрических функций в пространстве имен по умолчанию . ;-)

import math as m
def p(q,r):print(q+':','%.4f'%r)
def a(n):
 n=n*m.pi/180
 C,S=round(m.cos(n),8),m.sin(n)
 A=S,1,0,C,1,S,C,0,C,S,1,C,0,1,S,1,C,-1,1,S,C,1,1,S,1
 def t():
  nonlocal A;u,v,w,x,y,*A=A;z=-1 if w>0 else 1
  try:return z*u/v+w,z*x/y+w
  except:return 0,0
 def q(y,x=''):J,K=t();p(x+y,J);p(x+'co'+y,K)
 q('sine');q('tangent');s='secant';q(s);q(s,'ex');q('versine')

Образец вывода:

>>> a(60)
sine: 0.8660
cosine: 0.5000
tangent: 1.7321
cotangent: 0.5774
secant: 2.0000
cosecant: 1.1547
exsecant: 1.0000
excosecant: 0.1547
versine: 0.5000
coversine: 0.1340

не '.4f'%(r)будет короче?
xebtl

@ xebtl: Спасибо. Я склонен забывать, что% -форматирование все еще существует!
Тим Педерик

3

Perl 165 (193 - 15%)

Я представляю это как новый ответ, потому что идея сильно отличается от другой . Пожалуйста, дайте мне знать, если это более уместно, чтобы заменить мою первую попытку.

$p=atan2 1,0;$b=$_-90;%h=qw(sine $s tangent $b?$s/$c:0 secant $b?1/$c:0 versine 1-$c);$_/=90/$p;sub e{$c=cos;$s=sin}e;sub f{eval"printf'$x$_: %.4f
',$h{$_}"for keys%h}f;$b=1;$_=$p-$_;e;$x=co;f

Запустить с -n(добавлено 1 байт).

Ungolfed:

# π/2
$p=atan2 1,0;

# trouble?
$b=$_-90;

# Construct a hash whose keys are the “base” function names,
# and whose values are the corresponding expressions in terms of sin and cos
%h=qw(sine $s tangent $b?$s/$c:0 secant $b?1/$c:0 versine 1-$c);

# Thanks to ‘-n’, input is in $_; convert to radians
$_/=90/$p;

# Compute sin and cos in a reusable way
sub e{$c=cos;$s=sin}
e;

sub f {
   eval "printf '$x$_: %.4f
', $h{$_}" 
      for keys %h
}

f;

# Now the “co” functions
# No trouble here
$b=1;

# x ← π/2 - x
$_=$p-$_;

e;
$x=co;
f

Поскольку он выполняет четыре «со» -функции, я думаю, что он имеет право на бонус 3 * 5% = 15%.


3

Perl, 100 95 94 байта

Ой, Лотта Перл отвечает.

$_=<>;printf"sine: %.4f\ncosine: %.4f\ntangent: %.4f\nsecant: %.4f\n",sin,cos,(sin)/cos,1/cos

Да, и у вас все хорошо с этим простым подходом :-). Вы можете сбрить некоторые байты, используя -n(считается за 1 байт) вместо $_=<>. Тем не менее, вам нужно преобразовать градусы в радианы, и вы не будете обрабатывать случай 90 °, как предписано. (С последним кажется, что вы вряд ли одиноки среди ответов здесь.)
xebtl

Кроме того, помните, что предком Code Golf был Perl Golf :-)
xebtl

Я немного запутался здесь ... это использует радианы. Я должен был использовать степени?
спагетто

2

Haskell, 159 = 186 - 15% байт

s x=zipWith(\a b->a++": "++show b)(concatMap(\n->[n,"co"++n])$words"sine tangent versine secant")$map($(x*pi/180))[sin,cos,t,(1/).t,(1-).cos,(1-).sin,e.t,e.(1/).t]
e=sqrt.(+1).(^2)
t=tan

Никаких бывших штуковин, чтобы сохранить мою умную схему именования, и так как я не знал, как сократить (\x->x-1).(-1)это просто число.

Пожалуйста, подайте жалобу, если вы хотите, чтобы я prettify ( mapM_ putStrLn) строк.


Благодарность! То же самое для Алекса А. и @orlp. Последний должен, возможно, округлить чистый счет.
Лейф Виллертс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.