配列は始まります


10

あなたの仕事は、数値の配列と実数を取り、配列のその点の値を返すことです。配列はから始まり、間隔でカウントされます。実際のところ、「インデックス」が指定された要素間を実際に補間します。例として:ππ

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

それだから、我々は次の式を用いてコサイン補間を使用することがありますので、必須の三角法を実行する必要があります。π

cosモッドπ+12αβ+β

どこ:

  • は入力「インデックス」です
  • αは「インデックス」の直前の要素の値です
  • βは「インデックス」の直後の要素の値です
  • cosはラジアンで角度をとります

[1.3、3.7、6.9]、5.3の場合:

インデックス5.3は1π2πにあるため、1.3はに使用されbefore、3.7はに使用されafterます。それを公式に入れると、次のようになります。

cos5.3モッドπ+121.33.7+3.7

3.165になります

ノート

  • 入力と出力は任意の便利な形式にすることができます
  • 入力数はπより大きく、array length* \ piより小さいと想定できます。π
  • 入力配列は少なくとも2要素の長さであると想定することができます。
  • 結果は、少なくとも小数点以下2桁の精度を持ち、0.05以内の精度であり、この精度/精度で100までの数値をサポートする必要があります。(単精度のフロートはこの要件を満たすのに十分以上です)

幸せなゴルフ!


8
ゴルファーの参考までに、書き換えをとして半角式を使用して記述する方が短い場合があります。cosバツ+1/2cosバツ/22cos
xnor

doubleをキーとして持つ辞書を取り込むことはできますか?もちろん、ダブルスは整数です。
無視の

@EmbodimentofIgnorance、確かに。私はそれがあなたを助けることになるとは思いませんが、それはLuaがそれをする方法なので、配列の完全に合理的な表現です。
Beefster

@KevinCruijssenなぜそれが問題になるのかわかりません。3.7はpiと2piの間です。
Beefster

回答:


5

R59 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バイト
ジュゼッペ


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良い点。私はそれを間違って使用していることを知っていました
senox13

1
p=匿名関数は問題ないので、ドロップできます
Quintec

1
:)更新:バイトに忘れた
Quintec

3

ゼリー、17 バイト

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

と、補間された値を出力する配列を受け入れる完全なプログラム。

オンラインでお試しください!

どうやって?

使用して、すべてのネイバー間を補間cosモッドπ+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が私を打ち負かした。もう一度パイソンを倒した!

オンラインでお試しください!


1
明るい面を見てください。ゼリーに対して私たちのどちらにもチャンスはありませんでした
senox13

@ senox13たぶんスタックスを除いて
無知の実施形態


1

スタックス、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

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

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)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.