伟大的正弦


24

介绍

每个人都听说过正弦(sin)余弦(cos)正切(tan)余切(cot)割线(sec)割线(csc)。几乎每个角度都有它们。

远不如已知的,或记住的,是exsecant(exsec) excosecant(excsc) 正矢(正矢量),和coversine(CVS) 。几乎每个角度都具有这些角度。有些甚至鲜为人知,但我们会坚持下去。

我为这些角度为45°的角度创建了可视化效果。


挑战

创建一个程序,该程序接受一个angle 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%)

删除线不会引起问题。


输出顺序重要吗?
2015年

12
前进的脚踏车:“每个角度都有它们”-不正确;例如,90度的奇数倍没有切线。(对我来说,您要求不存在的值以使输出为零似乎非常奇怪。您是否真的要使用故意给出此类误导性答案的程序?)另外,我想知道为什么您将余割和余切视为比割线更晦涩;在我的A级数学课程中,我们同时了解了这三个方面。
Hammerite 2015年

大小写固定为小写吗?我想输出“正弦,余弦...”
edc65

难以理解完整程序通过函数调用的输入
edc65

1
角度输入是真的greater than 0吗,所以不允许0?
edc65

Answers:


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

取消高尔夫:

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

是我还是您的“展开”版本有附加循环?
David Arenburg

如果没有多余和切切的关系,您会更好。
lirtosiast 2015年

@DavidArenburg较长的版本具有相同的循环数,只是编写方式与短版本不同。
Alex A.

我知道@ThomasKwa,但我还是不会赢。:P
Alex A.

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 2015年

@ThomasKwa不要这样。
orlp 2015年

1
那么它目前无效。
lirtosiast 2015年

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个字符

输出示例:

Example Output


通过添加更多功能,您会不会获得更好的成绩?
自豪的haskeller

@proud haskeller,我可以尝试,但我可能会失去获得更多的角色
WizardOfMenlo 2015年

4
这是否将功能名称全部写完整或0用于sec(90)
lirtosiast 2015年

@Thomas Kwa不应该,有机会我会对其进行测试
WizardOfMenlo 2015年

我真的怀疑这显示了实际的函数名称
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”之后添加逗号,以便您的分数正确解析吗?
Zach Gates

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 2015年

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了隐式输入(和和$_的默认参数)sincos字符串的裸字作为隐式输入。使用三进制运算符将“ undefined = 0”规则硬编码?:(仅适用于90°)。

有一个件事我learend是,显然,你不能(或不能调用)子程序命名s(或者mytr):sub s {print 1}; s收益率Substitution pattern not terminated at -e line 1


出于某种原因,您的分数甚至被解析得更加奇怪。
Leif Willerts 2015年

您能否在“ Perl”之后添加逗号,以便正确解析您的分数?
扎克·盖茨2015年

3

Python 3,282(375-25%)

浮点错误导致错误处理变得有些复杂。即cos(90)得出的数字非常小,而不是零。

它永远不会是最好的答案,但是我想认为它可能在默认名称空间中没有trig函数的非古怪语言中最短的有效全功能答案。;-)

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

由于它具有四个“协同”功能,因此我认为它有资格获得3 * 5%= 15%的奖金。


3

Perl,100 95 94字节

哇,lotta perl回答。

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

是的,使用这种简单的方法您做得很好:-)。您可以使用-n(计数1个字节)而不是来删除一些字节$_=<>。但是,您必须将度数转换为弧度,并且不能按规定处理90°情况。(对于后者,似乎您并不孤单。)
xebtl 2015年

另外,请记住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)只是一个数字。

如果您要我修饰(mapM_ putStrLn)行,请投诉。


谢谢!Alex A.和@orlp也是一样。后者也许应该将净分数取整。
Leif Willerts 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.