数组开始于


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π)+1个21.3-3.7+3.7

得出3.165

笔记

  • 输入和输出可以采用任何方便的格式
  • 您可以假设输入数字大于且小于*πarray lengthπ
  • 您可以假设输入数组的长度至少为2个元素。
  • 您的结果必须至少有两个小数点精度,精度必须在0.05以内,并且为此精度/精度支持的数字最多为100。(单精度浮子足以满足此要求)

高尔夫快乐!


8
仅供参考的高尔夫球手,重写可能会更短 (cos(x)+1)/2cos(x/2)2使用半角公式cos
xnor19

我可以带双打字典作为键吗?当然,双打将是整数。
无知的体现,

@EmbodimentofIgnorance,当然。我怀疑这是否会对您有所帮助,但这是数组的一种非常合理的表示形式,因为Lua就是这样做的。
Beefster

@KevinCruijssen我不明白为什么这么重要。3.7在pi和2pi之间。
Beefster

Answers:


5

R59 53字节

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

在线尝试!

这里没有什么太聪明了,只是问题中公式的R版本。感谢@MickyT保存一个字节,感谢@Giueseppe和间接@xnor另外两个,感谢@RobinRyder再保存3个。


我认为您可以与...*(cos(i%%pi)+1)/2
MickyT '19

@MickyT谢谢,我原本将+1放在括号中,但是添加了一对多余的括号,所以最终以60个字节结尾
Nick Kennedy

xnor对半角公式的注释后有56个字节
朱塞佩


4

Python 3.8(预发布)85 74字节

@xnor提供-8个字节@@ Quintec提供
-2个字节

这利用了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它提到的第一个位置 -赋值表达式的部分功能是它们可以求值并赋值。
xnor19年

1
节省另一个字节:使用触发身份转换(cos(i%pi)+1)/2cos(i%pi/2)**2
xnor

@xnor好点。我知道我使用的是错误的
-senox13

1
您可以删除,p=因为匿名功能还可以
-Quintec

1
忘了更新字节数:)
Quintec

3

果冻,17 个字节

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

完整的程序接受 一世 以及打印插值的数组。

在线尝试!

怎么样?

在所有邻居之间使用进行插值 cos一世π+1个2 然后选择相关值。

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

在线试用!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 


1

Haskell,65个字节

v!i|(c,r)<-properFraction$i/pi=cos(r*pi/2)^2*(v!!(c-1)-v!!c)+v!!c

在线尝试!

注意:数组表示为列表。

感谢@xnor的半角技巧。


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字节ceilingcat

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

05AB1E22 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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.