배열은 에서 시작


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 입력 "인덱스"입니다
  • α 는 "index"바로 앞에있는 요소의 값입니다.
  • β 는 "index"바로 다음에 나오는 요소의 값입니다.
  • cos 는 각도를 라디안으로 가져옵니다

주어진 [1.3, 3.7, 6.9], 5.3 :

인덱스 5.3은 1π2π 사이 이므로 1.3이 사용 before되며 3.7이 사용됩니다 after. 그것을 공식에 ​​넣으면 다음과 같이됩니다.

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

3.165에 나오는

노트

  • 입력 및 출력은 편리한 형식 일 수 있습니다.
  • 입력 번호가 π 보다 크고 array length* \ pi 보다 작다고 가정 할 수 있습니다.π
  • 입력 배열의 길이가 최소 2 요소라고 가정 할 수 있습니다.
  • 결과는 소수점 이하 두 자리 이상의 정밀도를 가져야하며 0.05 이내의 정확도를 가지며이 정밀도 / 정확도를 위해 최대 100을 지원해야합니다. (단일 정밀도 플로트는이 요구 사항을 충족시키기에 충분합니다)

행복한 골프!


8
FYI 골퍼 그것이 쓰기 짧을 수도 재 로서 은 USING 반각 공식을 위한 . (cos(x)+1)/2cos(x/2)2cos
xnor

복식을 키로 사용하여 사전을 가져올 수 있습니까? 복식은 물론 정수입니다.
무지의 실시

@ 무지의 구현입니다. 그것이 당신에게 도움이 될지 의심 스럽지만 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에게 감사하고 또 다른 2 개를 위해 @Giueseppe와 간접적으로 @xnor에게 감사하고, 3을 더 저장 한 @RobinRyder에게 감사드립니다.


나는 당신이 바이트를 떨어 뜨릴 수 있다고 생각합니다...*(cos(i%%pi)+1)/2
MickyT

@MickyT 덕분에 원래 괄호 안에 +1을 넣었지만 중복 된 괄호 쌍을 추가하여 60 바이트로 끝났습니다.
Nick Kennedy

반각 공식에 대한 xnor의 의견 다음 56 바이트 .
Giuseppe


4

Python 3.8 (시험판) , 85 74 바이트

@xnor 덕분에 -8 바이트 @Quintec 덕분에
-2 바이트

이것은 Python 3.8 시험판의 새로운 :=할당 연산자를 활용합니다. 그 외에도, 이것은 실제로 파이썬으로 작성된 방정식입니다.

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
다른 바이트 저장 : trig ID를 사용 (cos(i%pi)+1)/2 하여cos(i%pi/2)**2
xnor

@xnor 좋은 지적. 나는 내가 그 잘못 사용하는 것을 알고 있었다
senox13

1
p=익명의 기능은 괜찮
으므로

1
바이트 수를 업데이트하는 것을 잊었다 :)
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)



1

Stax , 17 바이트

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

실행 및 디버깅

포장을 풀고 포장을 풀고 다음과 같이 댓글을 달았습니다.

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 바이트

Adám 덕분에 2 바이트 절약

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

온라인으로 사용해보십시오!

설명:

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.