อาร์เรย์เริ่มต้นที่


10

งานของคุณคือการใช้อาร์เรย์ของตัวเลขและจำนวนจริงและส่งกลับค่าที่จุดนั้นในอาร์เรย์ อาร์เรย์เริ่มต้นที่π และถูกนับเข้า πช่วงเวลา สิ่งที่เรากำลังจะแก้ไขระหว่างองค์ประกอบที่ได้รับ "ดัชนี" ตัวอย่างเช่น:

Index:    1π   2π   3π   4π   5π   6π
Array: [ 1.1, 1.3, 6.9, 4.2, 1.3, 3.7 ]

เพราะมัน πเราต้องทำตรีโกณมิติบังคับดังนั้นเราจะใช้การแก้ไขโคไซน์โดยใช้สูตรต่อไปนี้:

cos(imodπ)+12(αβ)+β

ที่อยู่:

  • iคืออินพุต "ดัชนี"
  • αคือค่าขององค์ประกอบทันทีก่อน "ดัชนี"
  • βคือค่าขององค์ประกอบทันทีหลังจาก "ดัชนี"
  • cosรับมุมเป็นเรเดียน

ตัวอย่าง

ได้รับ [1.3, 3.7, 6.9], 5.3:

ดัชนี 5.3 อยู่ระหว่างและดังนั้น 1.3 จะใช้สำหรับการและ 3.7 จะใช้สำหรับ ใส่ลงในสูตรเราจะได้รับ:1π2πbeforeafter

cos(5.3modπ)+12(1.33.7)+3.7

ซึ่งออกมาเป็น 3.165

หมายเหตุ

  • อินพุตและเอาต์พุตอาจอยู่ในรูปแบบที่สะดวก
  • คุณอาจคิดว่าหมายเลขอินพุตมากกว่าและน้อยกว่า*πarray lengthπ
  • คุณอาจสันนิษฐานว่าอาร์เรย์อินพุตจะมีความยาวอย่างน้อย 2 องค์ประกอบ
  • ผลลัพธ์ของคุณจะต้องมีทศนิยมอย่างน้อยสองตำแหน่งแม่นยำภายใน 0.05 และสนับสนุนตัวเลขสูงสุด 100 สำหรับความแม่นยำ / ความแม่นยำนี้ (โฟลทรีมีความแม่นยำเดียวมีมากเกินพอที่จะตอบสนองความต้องการนี้

มีความสุขในการเล่นกอล์ฟ!


8
FYI นักกอล์ฟก็อาจจะสั้นกว่าที่จะเขียนเขียนเป็นโดยใช้สูตรครึ่งมุมสำหรับ\(cos(x)+1)/2cos(x/2)2cos
xnor

ฉันสามารถใช้พจนานุกรมที่มีปุ่มเป็นสองเท่าได้หรือไม่ คู่จะเป็นจำนวนเต็มแน่นอน
ศูนย์รวมแห่งความไม่รู้

@EmbodimentofIgnorance แน่นอน ฉันสงสัยว่ามันจะช่วยคุณได้ แต่มันเป็นตัวแทนที่เหมาะสมของอาร์เรย์เพราะนั่นเป็นวิธีที่ Lua ทำ
Beefster

@KevinCruijssen ฉันไม่เห็นว่าทำไมถึงมีความสำคัญ 3.7 อยู่ระหว่าง pi ถึง 2pi
Beefster

คำตอบ:


5

R , 59 53 ไบต์

function(x,i)x[0:1+i%/%pi]%*%c(a<-cos(i%%pi/2)^2,1-a)

ลองออนไลน์!

ไม่มีอะไรที่ฉลาดเกินไปที่นี่ - แค่สูตร R เวอร์ชั่นในคำถาม ขอบคุณ @MickyT สำหรับการบันทึกไบต์และ @Gi Portugueseppe และ @xnor ทางอ้อมสำหรับอีกสองรายการและขอบคุณ @RobinRyder สำหรับการบันทึกอีก 3 รายการ


ฉันคิดว่าคุณสามารถวางไบต์ด้วย...*(cos(i%%pi)+1)/2
MickyT

@MickyT ขอบคุณฉันใส่ +1 ไว้ในวงเล็บ แต่ได้เพิ่มวงเล็บคู่ที่ซ้ำซ้อนดังนั้นลงท้ายด้วย 60 bytes
Nick Kennedy

56 ไบต์ติดตามความคิดเห็นของ xnor เกี่ยวกับสูตรครึ่งมุม
Giuseppe


4

Python 3.8 (เผยแพร่ล่วงหน้า) , 85 74 ไบต์

-8 ไบต์ขอบคุณ @xnor
-2 ไบต์ขอบคุณ @Quintec

สิ่งนี้จะได้ประโยชน์จากตัว:=ดำเนินการกำหนดค่าใหม่ของ Python 3.8 ก่อนวางจำหน่าย นอกจากนี้นี่เป็นเพียงสมการที่เขียนใน Python

import math
lambda l,i:cos(i%math.pi/2)**2*(l[(j:=int(i/pi))-1]-l[j])+l[j]

การใช้งาน:

>>> p=lambda l,i:cos(i%math.pi/2)**2*(l[(j:=int(i/pi))-1]-l[j])+l[j]
>>> print(p([1.3, 3.7, 6.9],5.3))
3.165249203414993

ลองออนไลน์!


1
คุณสามารถกำหนดjสถานที่แรกที่กล่าวถึง - ส่วนหนึ่งของพลังของการแสดงออกการมอบหมายคือพวกเขาประเมินค่าเช่นเดียวกับการกำหนด
xnor

1
บันทึกไบต์อื่น: ใช้รหัสประจำตัวเพื่อแปลง(cos(i%pi)+1)/2 เป็นcos(i%pi/2)**2
xnor

@ xnor เป็นจุดที่ดี ฉันรู้ว่าฉันกำลังใช้ผิดนั้น
senox13

1
คุณสามารถเลื่อนp=ฟังก์ชั่นไม่ระบุชื่อได้
Quintec

1
ลืมอัปเดต bytecount :)
Quintec

3

เยลลี่ขนาด 17 ไบต์

d©ØPṪÆẠ‘H×I_@Ḋ}®ị

โปรแกรมเต็มรูปแบบที่ยอมรับและอาร์เรย์ที่พิมพ์ค่าการประมาณค่าi

ลองออนไลน์!

อย่างไร?

สอดแทรกระหว่างเพื่อนบ้านทั้งหมดโดยใช้จากนั้นเลือกค่าที่เกี่ยวข้องcos(imodπ)+12

d©ØPṪÆẠ‘H×I_@Ḋ}®ị - Link: number, i; list of numbers, A
  ØP              - pi (ish) = 3.141592653589793
d                 - divmod = [i//pi, i%pi]
 ©                - (copy to register for later)
    Ṫ             - tail (gets i%pi leaving register copy as [i//pi])  
     ÆẠ           - cosine = cos(i%pi)
       ‘          - increment
        H         - halve
         ×        - multiply by A (vectorises)
          I       - increments -- i.e. (cos(i%pi)+1)(r-l)/2 for neighbours [l,r]
             Ḋ}   - dequeue A
           _@     - swapped arg subtract (vectorises) -- i.e. r-(cos(i%pi)+1)(r-l)/2
                  -                                         = r+(cos(i%pi)+1)(l-r)/2
               ®  - recall value from the register
                ị - index into (vectorises) -- i.e. [β+(cos(i%pi)+1)(α-β)/2]
                  - implicit print of Jelly representation (only 1 entry so [] wont appear)

2

C # (Visual C # Interactive Compiler) , 69 ไบต์

n=>m=>(Math.Cos(m%Math.PI)+1)/2*(n[m=(int)(m/Math.PI)-1]-n[++m])+n[m]

ฉันเอาชนะ Python ได้! หลามแล้ว Python ก็ชนะข้า ฉันชนะ Python อีกครั้ง!

ลองออนไลน์!


1
มองด้านสว่าง เราสองคนไม่มีโอกาสได้เจอกับ Jelly
senox13

@ senox13 ยกเว้นบางที Stax
ศูนย์รวมแห่งความไม่รู้


1

Stax , 17 ไบต์

≈ëBü☺ÆssÅ¢â)KjjïΔ

เรียกใช้และแก้ไขข้อบกพร่อง

คลายกล่อง ungolfed และแสดงความคิดเห็นว่ามีลักษณะเช่นนี้

VP|%    divmod with pi;  push div and mod results separately
|7^h    do (cos(modpart) + 1) / 2
sX      swap the original div result to top of stack, store it in the x register
v       decrement
;:-     pairwise differences of array
@       get element at index
N*      negate and multiply
;x@     get element from the original array at the x index, where x is the register
+       add

เรียกใช้อันนี้



1

APL + WIN, 39 37 ไบต์

บันทึก 2 ไบต์ด้วยAdám

2⊃m+(-/m←⎕[0 1+⌊n÷○1])÷2÷1+2○(○1)|n←⎕

ลองออนไลน์! Dyalog Classic

คำอธิบาย:

n←⎕ prompt for input of integer

2÷1+2○(○1)|n evaluate first term of formula

[0 1+⌊n÷○1] identify indices of alpha and beta

m←⎕[...] prompt for input of vector and select alpha and beta

-/m alpha-beta

2⊃m+ take result of adding beta to complete the equation 



0

เยลลี่ , 23 20 18 ไบต์

³%ØPÆẠ×_++H
÷ØPịÇ/

ลองออนไลน์!

÷ØPịṁؽµ³%ØPÆẠ×I_@SH    Dyadic link, arguments x (index) and Z (array):
֯P                     x/pi
   ị                    Index (into Z).
                        When x/pi is an integer, returns that elt of Z.
                        Otherwise returns 2 elements at floor and ceiling.
     ؽ                   [1,2] (generic 2 element array)
    ṁؽ                 Mold; shape like [1,2] to ensure we have 2 elements.
       µ                Start a new, monadic chain with the result [a,b]
        ³%ØPÆẠ×I_@SH    Monadic chain
        ³               x
         %ØP            x mod pi
            ÆẠ          Unarccosine; cos(x mod pi).
               I          Increment; b-a.
              ×I        (b-a) cos(x mod pi)
                  S       a+b
                _@S     a + b - (b-a) cos(x mod pi)
                   H    Halve; this is equivalent to our desired result.

0

ทูต 54 ไบต์

${Cos[y%PI/2]^2*&`-@(j:=x[1'-1*Floor[y'-y/PI]-1])+j@1}

ลองออนไลน์!

คำอธิบาย

${Cos[y%PI/2]^2*&`-@(j:=x[1'-1*Floor[y'-y/PI]-1])+j@1}
${                                                   }  parameters: x, y
  Cos[y%PI/2]^2                                         the scaling function factor
               *                                        times
                     j:=                                set j to
                        x[                     ]        the element in x at
                          1'-1*Floor[y'-y/PI]-1         the closest indices scaled by PI
                &`-@(                           )       spread subtraction over bounds
                                                 +j@1   add the upper bound

0

C (GCC) 99 79 ไบต์

-20 ไบต์บนเพดาน

float P=3.141593;b;
#define f(i,a)(cos(fmod(i,P))+1)/2*(a[b=i/P-1]-a[++b])+a[b]

ลองออนไลน์!

รหัสการโทร

int main() {
  float a[3] = {1.3,3.7,6.9};
  printf("%f\n", f(5.3,a));
}

โปรดทราบว่ามันจำเป็นต้องใช้ธงคอมไพเลอร์-lmเพื่อเชื่อมโยงกับห้องสมุดคณิตศาสตร์ดังนั้น 3 ไบต์ถ้าคุณนับว่า


0

05AB1E , 22 21 20 19 ไบต์

žq‰`ž>;UÝèÐÁ-θX*-θ

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบบางมากขึ้น

คำอธิบาย:

žq        # Take the divmod PI of the (implicit) input-decimal
           # (part = input integer-divided by PI, remainder = input modulo-PI)
           #  i.e. 5.3 → [1, 2.158...]
   `       # Push both values separately to the stack
    ž     # Take the cosine of the remainder
           #  i.e. 2.158... → -0.554...
      >    # Increase it by 1
           #  i.e. -0.554... → 0.554...
       ;   # Halve it
           #  i.e. 0.554... → 0.222...
        U  # Pop and store it in variable `X`
    Ý      # Pop the part, and push a list in the range [0, part]
           #  i.e. 1 → [0, 1]
     è     # (0-based) index all of them into the (implicit) input-list
           #   i.e. [1.3, 3.7, 6.9] and [0, 1] → [1.3, 3.7]
Ð          # Triplicate this list
 Á         # Rotate the last copy once towards the right
           #  i.e. [1.3, 3.7] → [3.7, 1.3]
  -        # Subtract the values in the top two lists from one another
           #  i.e. [1.3, 3.7] and [3.7, 1.3] → [-2.4, 2.4]
   θ       # Pop and only leave the last value of this list
           #  i.e. [-2.4, 2.4] → 2.4
    X*     # Multiply it by `X`
           #  i.e. 2.4 * `X`=0.222... → 0.534...
     -     # Subtract it from each of the values in the list we triplicated
           #  i.e. [1.3, 3.7] - 0.534... → [0.765..., 3.165...]
      θ    # And only leave the last value of this list
           #  i.e. [0.765..., 3.165...] → 3.165...
           # (which is output implicitly as result)

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