ไซน์แห่งความยิ่งใหญ่


24

บทนำ

ทุกคนได้ยินไซน์ (บาป) , โคไซน์ (cos) , สัมผัส (สีน้ำตาล) , โคแทนเจนต์ (เปล) , ซีแคนต์ ( ก.ล.ต. )และโคเซแคนต์ (CSC) เกือบทุกมุมมีพวกมัน

ห่างไกลไม่รู้จักหรือจำได้ว่าเป็นexsecant (exsec) , excosecant (excsc) , versine (versin)และcoversine (CVS) เกือบทุกมุมมีสิ่งเหล่านั้นเช่นกัน มีบางอย่างที่เป็นที่รู้จักน้อยกว่าแต่เราจะทำตามสิ่งเหล่านี้

ฉันสร้างภาพเหล่านี้สำหรับมุมθซึ่งก็คือ 45 °


ความท้าทาย

สร้างโปรแกรมที่รับอินพุตเป็นมุมเป็นnองศาและจะแสดงผล:

  1. ไซน์ของมุม n

  2. โคไซน์ของมุม n

  3. แทนเจนต์ของมุม n

  4. ซีแคนต์ของมุม n

  5. อย่างน้อยหนึ่งอย่างต่อไปนี้ ทุกรายการเพิ่มเติมจากรายการนี้จะได้รับโบนัส -5% สูงสุด -25%

    • exsecant ของมุม 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%)

ขีดทับไม่ควรทำให้เกิดปัญหา


ลำดับของเอาต์พุตมีความสำคัญหรือไม่?
Jakube

12
อวดรู้ล่วงหน้า: "ทุก ๆ มุมมีพวกเขา" - ไม่จริง; ตัวอย่างทวีคูณของ 90 องศาไม่มีแทนเจนต์ตัวอย่างเช่น (ดูเหมือนแปลกประหลาดอย่างยิ่งสำหรับฉันที่คุณต้องการค่าที่ไม่มีอยู่เพื่อให้ผลลัพธ์เป็นศูนย์คุณจะใช้โปรแกรมที่จงใจให้คำตอบที่ทำให้เข้าใจผิดเช่นนั้นจริง ๆ หรือไม่) นอกจากนี้ฉันสนใจที่จะรู้ว่าทำไมคุณจึงพิจารณาโคคอสต์และโคแทนเจนต์ มีความชัดเจนมากขึ้นกว่าเส้นตัด; ในวิชาคณิตศาสตร์ระดับ A ของฉันเราเรียนรู้เกี่ยวกับสามสิ่งนี้ในเวลาเดียวกัน
Hammerite

การใช้อักษรตัวพิมพ์เล็กคงที่หรือไม่ ฉันต้องการเอาท์พุท 'ไซน์โคไซน์ ... '
edc65

ยากที่จะเข้าใจโปรแกรมเต็มกับการ ป้อนข้อมูลผ่านการเรียกใช้ฟังก์ชั่น
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

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

Ungolfed:

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

ฉันหรือเวอร์ชั่น "Unfolded" ของคุณมีการวนซ้ำเพิ่มเติมหรือไม่
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

คำนวณไซน์เส้นตัดขวางและแทนเจนต์ coF(x) = F(90 - x)จากนั้นฟังก์ชั่นร่วมคำนวณเพียงผ่านสูตร


สิ่งนี้มีค่า 0 สำหรับการไม่ได้กำหนดหรือไม่?
lirtosiast

@ThomasKwa อย่าคิดอย่างนั้น
orlp

1
จากนั้นมันไม่ถูกต้องในปัจจุบัน
lirtosiast

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 and Csc) ดังนั้นจำนวน 99 ตัว

ตัวอย่างผลลัพธ์:

ตัวอย่างผลลัพธ์


คุณจะไม่ได้คะแนนที่ดีขึ้นโดยการเพิ่มฟังก์ชั่นเพิ่มเติมหรือไม่
ภูมิใจ haskeller

@proud มีเคลเลอร์ฉันสามารถลองได้ แต่บางทีฉันอาจจะสูญเสียมากกว่าได้รับตัวละคร
WizardOfMenlo

4
สิ่งนี้เขียนชื่อของฟังก์ชันเต็มหรือใช้0เพื่อsec(90)?
lirtosiast

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

Ungolfed:

(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 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และ barewords สำหรับสตริง กฎ“ undefined = 0” ถูกฮาร์ดโค้ดในการใช้ตัวดำเนินการที่ประกอบไปด้วยสามส่วน?: (มันใช้สำหรับ 90 °เท่านั้น)

สิ่งหนึ่งที่ผม learend เป็นที่เห็นได้ชัดว่าคุณไม่สามารถมี (หรือไม่สามารถเรียกบริการ) subroutine ชื่อs(หรือm, y, tr): อัตราผลตอบแทนsub s {print 1}; sSubstitution pattern not terminated at -e line 1


ด้วยเหตุผลบางอย่างคะแนนของคุณจะถูกแยกวิเคราะห์แม้กระทั่ง Weirder
Leif Willerts

คุณสามารถเพิ่มเครื่องหมายจุลภาคหลัง "Perl" เพื่อให้คะแนนของคุณถูกวิเคราะห์อย่างถูกต้องหรือไม่?
Zach Gates

3

Python 3, 282 (375 - 25%)

การจัดการข้อผิดพลาดกลายเป็นเรื่องที่ค่อนข้างซับซ้อนจากข้อผิดพลาดจุดลอยตัว; กล่าวคือcos(90)ออกมาเป็นจำนวนน้อยมากแทนที่จะเป็นศูนย์

มันไม่เคยจะเป็นคำตอบด้านบน แต่ผมชอบที่จะคิดว่ามันอาจจะเป็นที่สั้นที่สุดที่ถูกต้องทั้งหมดฟังก์ชั่นตอบในภาษาที่ไม่ใช่ golfy ที่ไม่ได้มีฟังก์ชั่นหนุนใน namespace ;-)

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: ขอบคุณ ฉันมักจะลืมว่าการจัดรูปแบบ% ยังคงมีอยู่!
ทิม Pederick

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 ไบต์)

Ungolfed:

# π/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 ไบต์

โอ้โหตอบ perl

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

ใช่แล้วคุณทำได้ดีมากด้วยวิธีนี้ :-) คุณสามารถโกนไบต์บางอย่างโดยใช้-n(นับ 1 ไบต์) $_=<>แทน อย่างไรก็ตามคุณต้องแปลงจากองศาเป็นเรเดียนและคุณไม่ได้จัดการคดี 90 °ตามที่กำหนด (ด้วยวิธีหลังดูเหมือนว่าคุณจะอยู่คนเดียวในหมู่คำตอบที่นี่)
xebtl

นอกจากนี้โปรดจำไว้ว่าบรรพบุรุษของ 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)thingies-เพื่อให้โครงการตั้งชื่อของฉันฉลาดและตั้งแต่ผมไม่ทราบวิธีที่จะลดลง (-1)เป็นเพียงตัวเลข

โปรดบ่นถ้าคุณต้องการให้ฉัน prettify ( mapM_ putStrLn) บรรทัด


ขอบคุณ! เหมือนกันสำหรับ Alex A. และ @orlp หลังควรจะปัดเศษคะแนนสุทธิ
Leif Willerts
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.