Синус величі


24

Вступ

Всі чули про синус (гріх) , косинус (соз) , дотичний (загар) , котангенс (ліжечко) , секант (сек) і косемант (csc) . Майже кожен кут має їх.

Набагато менш відомими або запам’ятовуються: exsecant (exsec) , excosecant (excsc) , versine (versin) та coverine (cvs) . Майже в кожному куті є і такі. Є деякі, які ще менш відомі, але ми просто дотримуємось цього.

Я створив візуалізацію для кута θ, який становить 45 °.


Змагання

Створіть програму, яка приймає введення кута n, в градусах, і виведе:

  1. синус кута n

  2. косинус кута n

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

  4. сеанс кута n

  5. принаймні одне з наступних. Кожен додатковий товар із цього списку заробить бонус -5%, максимум -25%.

    • коефіцієнт кута n

    • коефіцієнт кута n

    • excosecant of кут 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 градусів, наприклад, не мають дотичної. (Мені здається надзвичайно химерним, що вам потрібні неіснуючі значення, щоб дати нульовий результат. Чи дійсно ви використовували б програму, яка свідомо давала такі оманливі відповіді?) Також мені було б цікаво дізнатися, чому ви вважаєте козант і котангенс як бути більш незрозумілим, ніж секант; на моїх уроках математики A рівня ми дізналися про цих трьох одночасно.
Hammerite

Чи зафіксована велика літера з малої літери? Мені б хотілося вивести 'Sine,
Cosine

Важко зрозуміти Повна програма проти введення через функцію виклику
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% бонусу ( cotangent і cosecant ).

Спробуйте його в Інтернеті в інтерпретаторі 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

Безголівки:

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

Математика (недійсна на даний момент), 134 121 104

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

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

І він повинен мати 5% бонус (Cot і Csc), тому складати 99 символів

Приклад виводу:

Приклад Вихід


Чи не отримаєте ви кращий бал, додавши більше функцій?
гордий haskeller

@proud haskeller, я можу спробувати, але, ймовірно, втрачу більше, ніж
набуду

4
Це записує назви функцій повністю або використовується 0для sec(90)?
ліртосіаст

@Thomas Kwa це не повинно, я перевірю, коли у мене є шанс
WizardOfMenlo

Я дуже сумніваюся, що в цьому шоу показують фактичні назви функцій
David Arenburg

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`
`

Безголівки:

(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для неявного введення, $_як аргумент за замовчуванням для sinта cos, та баревор для рядків. Правило "undefined = 0" жорстко кодується при використанні потрійного оператора ?:(воно застосовується лише для 90 °).

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


Чомусь ваш рахунок розбирається навіть більш дивно.
Leif Willerts

Чи можете ви додати кому після "Perl", щоб ваш рахунок було правильно проаналізовано?
Зак Гейтс

3

Пітон 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 байт).

Безголівки:

# π/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

Оскільки він виконує чотири функції "co", я думаю, що він може бути бонусом 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 Code був 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)це просто число.

Скажіть, будь ласка, якщо ви хочете, щоб я доповнив ( mapM_ putStrLn) рядки.


Спасибі! Те саме для Алекса А. та @orlp. Останнє, можливо, може округнути чистий рахунок.
Leif Willerts
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.