Một điều tuyệt vời


24

Giới thiệu

Mọi người đều nghe nói về sin (sin) , cosine (cos) , tiếp tuyến (tan) , cotangent (cot) , secant (sec)cosecant (csc) . Gần như mọi góc độ đều có chúng.

Ít được biết đến, hoặc được nhớ, là exsecant (exsec) , excosecant (excsc) , Versine (Versin) , và coverine (cvs) . Gần như mọi góc độ đều có những điều đó. Có một số thậm chí còn ít được biết đến, nhưng chúng ta sẽ chỉ sử dụng những thứ này.

Tôi đã tạo ra một hình dung của các góc này cho góc, là 45 °.


Các thách thức

Tạo một chương trình lấy đầu vào của một góc n, tính bằng độ và sẽ xuất ra:

  1. sin của góc n

  2. cosin của góc n

  3. tiếp tuyến của góc n

  4. góc của góc n

  5. ít nhất một trong những điều sau đây. Mỗi mục bổ sung từ danh sách này sẽ kiếm được tiền thưởng -5%, tối đa là -25%.

    • góc ngoài n

    • cosecant của góc n

    • kích thích của góc n

    • góc nhìn n

    • góc của góc n

    • góc của góc n

Nếu điểm của bạn là số thập phân sau khi áp dụng phần thưởng, hãy làm tròn đến số nguyên gần nhất.


Đầu vào

Bạn có thể chấp nhận đầu vào của mình thông qua STDIN hoặc thông qua một cuộc gọi chức năng. Một đối số duy nhất n, sẽ được thông qua.

n sẽ luôn là một số nguyên lớn hơn 0, nhưng nhỏ hơn hoặc bằng 90.


Đầu ra

Dưới đây là một ví dụ về đầu ra cho sin 45 °. Tất cả các mục đầu ra phải ở định dạng này. Thứ tự của các mặt hàng không quan trọng.

sine: 0.70710678118

Tất cả các mục phải có chính xác 4 số sau số thập phân (độ chính xác đến mười phần nghìn). Dưới đây là một vài ví dụ về làm tròn.

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

Mọi kết quả không tồn tại / không xác định sẽ được mặc định là 0.


Thí dụ

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

Bảng điểm

Để điểm số của bạn xuất hiện trên bảng, nó phải ở định dạng này:

# Language, Score

Hoặc nếu bạn kiếm được tiền thưởng:

# Language, Score (Bytes - Bonus%)

Strikethroughs không gây ra vấn đề.


Liệu thứ tự của đầu ra có vấn đề?
Jakube

12
Pedantry phía trước: "Mọi góc độ đều có chúng" - không đúng sự thật; bội số lẻ 90 độ không có tiếp tuyến, ví dụ. (Có vẻ rất kỳ lạ với tôi rằng bạn yêu cầu các giá trị chưa có để cung cấp đầu ra bằng 0. Bạn có thực sự sử dụng một chương trình cố tình đưa ra các câu trả lời sai lệch như vậy không?) Ngoài ra, tôi rất muốn biết lý do tại sao bạn coi cosecant và cotangent như bị che khuất hơn so với bí mật; trong các lớp toán cấp A của tôi, chúng tôi đã học về ba người đó cùng một lúc.
Hammerite

Là viết hoa cố định chữ thường? Tôi muốn đầu ra 'Sine, Cosine ...'
edc65

Khó hiểu Chương trình đầy đủ so với đầu vào thông qua một cuộc gọi chức năng
edc65

1
Là đầu vào góc thực sự greater than 0, vì vậy 0 không được phép?
edc65

Câu trả lời:


8

CJam, 94 89 85 81 80 byte

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

Mã này dài 84 byte và đủ điều kiện nhận thưởng 5% ( cotangentcosecant ).

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

"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

Julia, 162 - 10% = 144 byte

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

Ung dung:

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

Có phải tôi hoặc phiên bản "Mở ra" của bạn có một vòng lặp bổ sung không?
David Arenburg

Bạn sẽ tốt hơn nếu không có exececant và cotangent.
lirtosiast

@DavidArenburg Phiên bản dài hơn có cùng số vòng lặp, nó chỉ được viết khác với phiên bản ngắn.
Alex A.

@ThomasKwa Tôi biết, nhưng dù sao tôi cũng sẽ không chiến thắng. : P
Alex A.

5

Pyth, 66 - 10% = 59,4 byte

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

Tính toán sin, secant và tiếp tuyến. Sau đó, các hàm đồng được tính đơn giản thông qua công thức coF(x) = F(90 - x).


Điều này cho 0 cho không xác định?
lirtosiast

@ThomasKwa Đừng nghĩ vậy.
orlp

1
Sau đó, nó hiện không hợp lệ.
lirtosiast

5

Mathicala (Không hợp lệ tại thời điểm này), 134 121 104

Chỉ để cho vui, chắc chắn nó có thể được đánh xuống rất nhiều

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

Và nó nên có phần thưởng 5% (Cot và Csc), do đó lên tới 99 ký tự

Ví dụ đầu ra:

Ví dụ đầu ra


Bạn sẽ không có được điểm cao hơn bằng cách thêm nhiều chức năng chứ?
tự hào

@proud haskeller, tôi có thể thử, nhưng có lẽ tôi sẽ mất nhiều hơn số nhân vật
WizardOfMenlo

4
Điều này có viết tên của các chức năng đầy đủ, hoặc sử dụng 0cho sec(90)?
lirtosiast

@Thomas Kwa không nên, tôi sẽ kiểm tra nó khi tôi có cơ hội
WizardOfMenlo

Tôi thực sự nghi ngờ điều này hiển thị tên chức năng thực tế
David Arenburg

4

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

Chỉnh sửa sửa đổi sau khi làm rõ, bây giờ tiền thưởng là 5%

Chỉnh sửa nhận ra rằng góc không thể là 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`
`

Ung dung:

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

Bạn có thể thêm dấu phẩy sau "Javascript ES6" trong tiêu đề của mình để điểm của bạn sẽ phân tích chính xác không?
Zach Gates

3

R, 122 136 134 byte

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))),"")

Ví dụ sử dụng

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

Chạy với -n (1 byte được thêm vào điểm số không quan tâm).

$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

Không có gì lạ mắt. Nó lợi dụng -ncho đầu vào ngầm định, $_làm đối số mặc định chosincosvà barewords cho chuỗi. Quy tắc không xác định của người dùng không xác định = 0 được mã hóa cứng khi sử dụng toán tử ternary ?:(nó chỉ áp dụng cho 90 °).

Một điều tôi learend là rõ ràng, bạn không thể có (hoặc không thể gọi ) một chương trình con được đặt tên s(hoặc m, y, tr): sub s {print 1}; ssản lượng Substitution pattern not terminated at -e line 1.


Vì một số lý do, điểm số của bạn được phân tích cú pháp thậm chí kỳ lạ hơn.
Leif Willerts

Bạn có thể thêm dấu phẩy sau "Perl" để điểm của bạn được phân tích cú pháp chính xác không?
Zach Gates

3

Trăn 3, 282 (375 - 25%)

Xử lý lỗi hóa ra hơi phức tạp do lỗi dấu phẩy động; cụ thể làcos(90) đi ra một con số rất nhỏ thay vì số không.

Nó sẽ không bao giờ là câu trả lời hàng đầu, nhưng tôi muốn nghĩ rằng nó có thểcâu trả lời tất cả các hàm hợp lệ ngắn nhất trong một ngôn ngữ không phải là golf mà không có các hàm trig trong không gian tên mặc định . ;-)

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

Đầu ra mẫu:

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

sẽ không '.4f'%(r)ngắn hơn?
xebtl

@xebtl: Cảm ơn. Tôi có xu hướng quên rằng định dạng% vẫn tồn tại!
Tim Pederick

3

Perl, 165 (193 - 15%)

Tôi đang gửi câu trả lời mới này vì ý tưởng này khá khác so với khác . Xin vui lòng cho tôi biết nếu nó phù hợp hơn để thay thế nỗ lực đầu tiên của tôi.

$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

Chạy với -n(thêm 1 byte).

Ung dung:

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

Vì nó thực hiện bốn chức năng liên kết trên mạng, tôi nghĩ rằng nó đủ điều kiện nhận phần thưởng 3 * 5% = 15%.


3

Perl, 100 95 94 byte

Whoa, lotta perl câu trả lời.

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

Vâng, và bạn đang làm khá tốt với cách tiếp cận đơn giản này :-). Bạn có thể tắt một số byte bằng cách sử dụng -n(đếm cho 1 byte) thay vì $_=<>. Tuy nhiên, bạn phải chuyển đổi từ độ sang radian và bạn không xử lý trường hợp 90 ° theo quy định. (Với câu hỏi sau, có vẻ như bạn hầu như không đơn độc trong số các câu trả lời ở đây.)
xebtl

Ngoài ra, hãy nhớ rằng tổ tiên của Code Golf là Perl Golf :-)
xebtl

Tôi có một chút bối rối ở đây ... điều này sử dụng radian. Tôi có nên sử dụng độ?
một spaghetto

2

Haskell, 159 = 186 - 15% byte

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

Không có điều gì cũ để giữ kế hoạch đặt tên thông minh của tôi và vì tôi không biết cách rút ngắn (\x->x-1).(-1)chỉ là một con số

Vui lòng khiếu nại nếu bạn muốn tôi làm đẹp ( mapM_ putStrLn) các dòng.


Cảm ơn! Tương tự cho Alex A. và @orlp. Sau này có thể làm tròn số điểm net.
Leif Willerts
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.