위대함


24

소개

사인 (sin) , 코사인 (cos) , 탄젠트 (tan) , 코탄젠트 (cot) , 시컨트 (sec)코시컨트 (csc)에 대한 모든 사람들의 의견을 들어 보십시오 . 거의 모든 각도가 있습니다.

외계인 (exsec) , excosecant (excsc) , versine ( versin)coversine (cvs) 은 훨씬 덜 알려져 있거나 기억 됩니다. 거의 모든 각도에도 그 각도가 있습니다. 있습니다 그 일부 라도 덜 알려져 있지만 우리는 단지 이들에 충실하겠습니다.

45 도인 각도 θ에 대한 시각화를 만들었습니다.


도전

angle의 각도를 입력 n하고 다음을 출력 하는 프로그램을 작성하십시오 .

  1. 각도의 사인 n

  2. 각도의 코사인 n

  3. 각도의 접선 n

  4. 각도의 종 n

  5. 다음 중 하나 이상 이 목록의 모든 추가 항목은 최대 -25 %의 보너스 -5 %를받습니다.

    • 각도의 절충 n

    • 각도의 코시컨트 n

    • 각도의 excosecant n

    • 각도의 정점 n

    • 각도의 coversine n

    • 각도의 코탄젠트 n

보너스를 적용한 후 점수가 10 진수이면 가장 가까운 정수로 반올림하십시오.


입력

STDIN 또는 함수 호출을 통해 입력을 승인 할 수 있습니다. 단일 인수 인가 n전달됩니다.

n 항상 0보다 크지 만 90보다 작은 정수입니다.


산출

다음은 사인 출력이 45 ° 인 예입니다. 모든 출력 항목은이 형식이어야합니다. 항목의 순서는 중요하지 않습니다.

sine: 0.70710678118

모든 항목은 소수점 이하 정확히 4 자리 여야합니다 (10/1000까지의 정밀도). 다음은 반올림의 몇 가지 예입니다.

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%)

취소 선이 문제를 일으키지 않아야합니다.


출력 순서가 중요합니까?
Jakube

12
앞선 페두 트리 : "모든 각도가있다"-사실이 아니다. 예를 들어 90 도의 홀수 배수에는 탄젠트가 없습니다. (당신은 존재하지 않는 값이 0을 출력하도록 요구하는 것이 매우 기괴한 것 같습니다. 실제로 그러한 오도 된 답변을 의도적으로 제공 한 프로그램을 사용 하시겠습니까?) 또한 왜 당신이 코시컨트와 코탄젠트를 종파보다 더 모호한; 내 A- 레벨 수학 수업에서 우리는 그 세 가지에 대해 동시에 배웠습니다.
Hammerite

대문자는 소문자로 고정되어 있습니까? 나는 'Sine, Cosine ...'출력을 원합니다
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 % 보너스 ( 코탄젠트코시컨트) )를받을 수 있습니다.

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

@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

사인, secant 및 탄젠트를 계산합니다. 그런 다음 공식은 함수를 통해 간단히 계산됩니다 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, 나는 시도 할 수 있습니다, 그러나 아마 내가 이득 문자보다 더 잃게됩니다
WizardOfMenlo

4
전체, 또는 사용에서이 기록을 함수의 이름을 하는가 0에 대한 sec(90)?
lirtosiast

나는 기회가있을 때 콰 @Thomas는, 나는 그것을 테스트거야 안
WizardOfMenlo

난 정말이 쇼 실제 함수 이름 의심
데이비드 Arenburg

4

자바 스크립트 (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"뒤에 쉼표를 추가하여 점수가 올바르게 구문 분석 될 수 있습니까?
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

3

(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문자열 의 기본 단어 로 암시 적 입력을 활용 합니다. "정의되지 않은 = 0"규칙은 삼항 연산자를 사용하여 하드 코딩 ?:됩니다 (90 °에만 적용됨).

한 가지의 I의 learend 분명히, 당신이 가질 수 없습니다 (또는 할 수 없다는 것입니다 전화 ) 서브 루틴의 이름 s(또는 m, y, tr) : sub s {print 1}; s수익률 Substitution pattern not terminated at -e line 1.


어떤 이유로 든 점수가 더 이상 파싱됩니다.
Leif Willerts

"Perl"다음에 쉼표를 추가하여 점수가 올바르게 구문 분석 될 수 있습니까?
Zach Gates

3

파이썬 3, 282 (375-25 %)

부동 소수점 오류로 인해 오류 처리가 다소 복잡해졌습니다. 즉, cos(90)0이 아닌 매우 작은 숫자로 나왔습니다.

절대 대답 될 수 는 없지만 기본 네임 스페이스에 삼각 함수가없는 골피가 아닌 언어로 가장 짧은 유효한 모든 함수 답변 이라고 생각합니다 . ;-)

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 : 감사합니다. % 포맷팅이 여전히 존재한다는 것을 잊는 경향이 있습니다!
Tim Pederick

3

펄, 165 (193 ~ 15 %)

나는 아이디어는 상당히 다르기 때문에이 ASA는 새로운 답을 제출 나는 다른 하나. 첫 번째 시도를 교체하는 것이 더 적절한 지 알려주십시오.

$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

펄, 100 95 94 바이트

우와, 로타 펄이 대답합니다.

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

네, 그리고 당신은이 간단한 접근 방식으로 꽤 잘하고 있습니다 :-). -n대신 (1 바이트 카운트)를 사용하여 일부 바이트를 제거 할 수 있습니다 $_=<>. 그러나도에서 라디안으로 변환해야하며 규정 된대로 90 °의 경우를 처리하지 마십시오. (후자는, 당신이 여기에 답 중 거의 혼자 인 것처럼 보이지 않습니다.)
xebtl

또한, 코드 골프의 조상이 펄 골프 :-) 것을 기억
xebtl

여기에 약간 혼란 스럽습니다 ...이 라디안을 사용합니다. 학위를 사용해야합니까?
스파게티

2

하스켈, 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.