偉大さのサイン


24

前書き

誰もがサイン(sin)コサイン(cos)タンジェント(tan)コタンジェント(cot)セカント(sec)コセカント(csc)について聞いたことがあります。ほぼすべての角度にそれらがあります。

あまり知られていない、または記憶されていないのは、exsecant(exsec)excosecant(excsc)versine(versin)、およびcoverine(cvs)です。ほぼすべての角度にもこれらがあります。あまり知られていないものもありますが、これらに固執します。

45°の角度θについて、これらの視覚化を作成しました。


チャレンジ

n度単位で角度を入力し、出力するプログラムを作成します。

  1. 角度のサイン n

  2. 角度の余弦 n

  3. 角度のタンジェント n

  4. 角度の割線 n

  5. 以下の少なくとも 1つ。このリストの追加アイテムはすべて、-5%、最大-25%のボーナスを獲得します。

    • 角度の割線 n

    • 角度の余割 n

    • 角度の余割 n

    • 角度の逆 n

    • 角度のカバー n

    • 角度の余接 n

ボーナスを適用した後、スコアが小数の場合、最も近い整数に切り上げます。


入力

STDINまたは関数呼び出しを介して入力を受け入れることができます。単一の引数nが渡されます。

n 常に0より大きく、90以下の整数全体になります。


出力

45°のサインの出力の例を次に示します。すべての出力項目はこの形式である必要があります。アイテムの順序は関係ありません。

sine: 0.70710678118

すべてのアイテムには、小数部の後に正確に4つの数字が必要です(精度は1万分の1)。以下に丸めの例をいくつか示します。

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レベルの数学の授業では、これら3つについて同時に学びました。
ハンマーライト

大文字は小文字に固定されていますか?私は「...サイン、コサイン」出力たい
edc65

ハードを理解するために全プログラム VS 関数呼び出しを介して入力を
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

私ですか、それとも「展開」バージョンに追加のループがありますか?
デビッドアレンバーグ

余談や余接がなければ良いでしょう。
リルトシアスト

@DavidArenburg長いバージョンは同じ数のループを持ち、短いバージョンとは異なって記述されています。
アレックスA.

@ThomasKwa私は知っているが、とにかく勝つつもりはない。:P
アレックス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を与えますか?
リルトシアスト

@ThomasKwaそうは思わない。
orlp

1
その後、現在無効です。
リスト管理者

5

Mathematica(現時点では無効)、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、私は試すことができますが、おそらく私はキャラクターを得るよりも多くを失うでしょう
-WizardOfMenlo

4
これは関数の名前を完全に書き出すのですか、それとも0forに使用しsec(90)ますか?
リスト管理者

@Thomas Kwaするべきではない、機会があればテストする
-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

ジャバスクリプト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
リルトシアスト

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°にのみ適用されます)。

一つのIのlearendどうやら、あなたが持つことができない(あるいはできないことです呼び出す)という名前のサブルーチンs(またはmytr):sub s {print 1}; s収穫Substitution pattern not terminated at -e line 1


何らかの理由で、スコアはさらに奇妙に解析されます。
レイフウィラーツ

「Perl」の後にカンマを追加して、スコアを正しく解析できますか?
ザック・ゲイツ

3

Python 3、282(375-25%)

エラー処理は、浮動小数点エラーによってやや複雑になることが判明しました。つまり、cos(90)ゼロではなく非常に小さな数になりました。

トップの答えになるだろうことはありませんですが、私はそれは考えるのが好きかもしれないこと、デフォルトの名前空間に三角関数を持たない非golfy言語で最短の有効なすべての関数の答え。;-)

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:ありがとう。%-formattingがまだ存在することを忘れがちです!
ティムペデリック

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

4つの「共同」機能を実行するので、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

また、コードゴルフの祖先はPerlゴルフであったことを覚えておいてください:
xebtl

ここで少し混乱しています...これはラジアンを使用しています。私は学位を使うことになっていたのですか?
spaghetto

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についても同じです。後者は正味スコアを切り上げる必要があります。
レイフウィラーツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.