配列に波を適用する


24

今日のタスクは、数値の配列にウェーブを適用することです。波は次のようになります。[1, 0, -1, 0, 1, 0, -1, 0, 1...]特定の配列に適用することは、最初の要素、2番目の要素などを加算することを意味します。

より正確に:

プログラムまたは関数は整数の配列を受け取ります。元の配列1の1番目、5番目、9番目などの要素に-1追加され、元の配列の3番目、7番目、11番目などの要素に追加され、残りの要素を持つ等しいサイズの配列を出力または返す必要があります。そのままにしておく必要があります。

入力配列には、少なくとも1つの要素があることが保証されています。

テストケース:

Input                               | Output
[0]                                 | [1]
[-1]                                | [0]
[-4, 3, 0, 1, 7, 9, 8, -2, 11, -88] | [-3, 3, -1, 1, 8, 9, 7, -2, 12, -88]
[0, 0, 0, 0, 0]                     | [1 ,0 ,-1 ,0 ,1]
[1, 1]                              | [2, 1]

これは、最短のコードが勝ちます!


意外なことに、多くのソリューションが虚数マジックを使用しています...-
パベル

2
虚数がなぜ有用であるのかはかなり理にかなっています。これは波の問題であり、虚数には極特性の歴史が十分に文書化されています。虚数は、特にこれらのタイプの整数4分の1回転に対して、正弦および余弦を計算するかなりゴルフのような方法です。数学は...クールです
小麦ウィザード

3
@WheatWizardほとんどの言語が虚数をサポートしていないことを考えると、かなり大きな割合です。
パベル

回答:


8

ゼリー、5バイト

Jı*Ċ+

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

使い方

Jı*Ċ+  Main link. Argument: A (array)

J      Indices; yield [1, ..., len(A)].
 ı*    Elevate the imaginary unit to the power 1, ..., len(A), yielding
       [0+1i, -1+0i, 0-1i, 1+0i, ...].
   Ċ   Take the imaginary part of each result.
    +  Add the results to the corresponding elements of A.

:漏洩修道女が得たものと同じchat.stackexchange.com/transcript/message/38868472#38868472
パベル

1
説明はありますか?
-Pureferret

1
虚数の連続電力の虚数部@Pureferret iは各要素に追加されている
・クール

・クール@ということです1, 2, 3 ...1, 0, -1, 0 ...
-Pureferret

1
同じで答えとして説明@Pureferret MATLまたはMath.JSまたはMathematicaのか、Rまたは...
・クール

14

ロゴ、18バイト

[map[?+sin 90*#]?]

「オンラインで試す」はありません。すべてのオンラインLOGOインタープリターがテンプレートリストをサポートしていないため、リンクします。

これはテンプレートリストです(他の言語のラムダ関数に相当)。

使用法:

pr invoke [map[?+sin 90*#]?] [-4 3 0 1 7 9 8 -2 11 -88]

invoke関数を呼び出し、pr結果を出力します)

印刷し[-3 3 -1 1 8 9 7 -2 12 -88]ます。

説明(すでにかなり理解可能):

 map[?+sin 90*#]?       map a function over all the items of the input
              #         the 1-based index of the element in the input
       sin 90*#         equal to the required wave
     ?                  looping variable
     ?+sin 90*#         add the wave to the input

ああ、誰かがサインに基づいた答えを思い付くことを知っていました。
-ETHproductions

2
@ETHproductions Mathematicaでの最初の答えは、Sineに基づいたものでした。Rの2番目の答えは、サインを使用することです。
パベル

1
@Phoenix気づかなかったことにショックを受けました
...-ETHproductions

@ETHproductions and ....サインもR回答から除外されました。Mathematicaの答えと同じことをしていると思います。
パベル

13

Haskell、26バイト

zipWith(+)$cycle[1,0,-1,0]

オンラインでお試しください!(すべてのテストケースを実行)

説明:

zipWith(+)$cycle[1,0,-1,0]  -- anonymous tacit function
zipWith(+)                  -- pairwise addition between input list
          $cycle[1,0,-1,0]  -- and an infinitely-cycling "wave" list

9

JavaScript(ES6)、28バイト

a=>a.map((x,i)=>x-(i%4-1)%2)

計算は次のようになります。

i%4  -1  %2
0    -1  -1
1     0   0
2     1   1
3     2   0

JSでは、変調時に負の数が負の符号を保持するという事実を利用する最後のビット(つまり-5 % 3 -> -21Pythonの場合の代わりに)。


9

Mathematica、26 23 22バイト

Im[I^Range@Tr[1^#]]+#&

オンラインでお試しください!(数学)

注:TIOリンクは23バイトバージョン用であり、22バイトバージョンはMathics互換ではありません。


以下に19バイトのMathematicaソリューションがあります(4バイトの初期化)
user202729


8

MATL11 8バイト

Jyn:^Yj+

MATL Online試しください

説明

J     % Push 1j (imaginary unit)
      % STACK; 1j
y     % Implicit input. Duplicate from below
      % STACK: [-4 3 0 1 7 9 8 -2 11 -88], 1j, [-4 3 0 1 7 9 8 -2 11 -88]
n     % Number of elements
      % STACK: [-4 3 0 1 7 9 8 -2 11 -88], 1j, 10
:     % Range
      % STACK: [-4 3 0 1 7 9 8 -2 11 -88], 1j, [1 2 3 4 5 6 7 8 9 10]
^     % Power, element-wise
      % STACK: [-4 3 0 1 7 9 8 -2 11 -88], [1j -1 -1j 1 1j -1 -1j 1 1j -1]
Yj    % Imaginary part
      % STACK: [-4 3 0 1 7 9 8 -2 11 -88], [1 0 -1 0 1 0 -1 0 1 0]
+     % Add, element-wise. Implicit display
      % STACK: [-3 3 -1 1 8 9 7 -2 12 -88]

ええと、あなた+は説明に追加するのを忘れていました
ケアニアン共犯

@cairdcoinheringaahingありがとう、編集
ルイスメンドー

3

ゼリー、16バイト

-1Jm2$$¦+2Jm4$$¦

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

これは長すぎると思う

編集

5バイトのソリューションが可能であることは知っていますが、私のwifiは私を切断し始めているようですので、明日はこれをゴルフします。私がこれをゴルフする前に誰かが短いゼリーのソリューションを投稿した場合、それは私と一緒です。私はこれをJellyでどれだけ悪いかについての参考のためにここに保管しますlolそれを行う別の方法です。私は、意味可能性がちょうどフェニックスはコメントで掲示リンクを見て、私はまだ学んでいることから、私は自分自身をそれを考え出したまで溶液を見たくありません。これは私に評判を損なうかもしれませんが、学習は私がここにいるものです:)))


LeakyNunは5チャットでそれをやった:ネタバレ
パベル

5
ああ 。__________。
-HyperNeutrino

デニスはそれを得た:codegolf.stackexchange.com/a/135145/60042
パベル


3

Python 2 50の 42バイト

@Sisyphusのおかげで8バイト節約できました!

lambda l:map(sum,zip(l,[1,0,-1,0]*len(l)))

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

53バイト

lambda l:[int(x+(1j**i).real)for i,x in enumerate(l)]

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


lambda l:map(sum,zip(l,[1,0,-1,0]*len(l)))Python 2
Sisyphus

Python 3では5バイト、Python 2ではさらに3バイト節約できます。ありがとうございます。
musicman523

3

Haskell、26バイト

@Megoはこのソリューションに私を打ち負かしました

zipWith(+)$cycle[1,0,-1,0]

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

これがHaskellの長所です。これにより、入力を無限リストで圧縮するポイントフリー関数が宣言されます。

Haskell、56バイト

複素数を使用するソリューションを次に示します。インポートのためにそれほど競争力はありませんが、それほどクールではありません。

import Data.Complex
zipWith((+).realPart.((0:+1)^))[0..]

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


2
ほら!あなたは私を20秒で忍者しました!
Mego

2つの同一のソリューションを使用しても意味がありません。帰属なしで私の改善を行い、回答を同一にしたので、あなたはあなたの回答を削除しますか?
Mego

3

Mathematica、19バイト

i=1;#+Im[i*=I]&/@#&

説明

i=1;#+Im[i*=I]&/@#&
i=1;                 (* set variable i to 1 *)
               /@#   (* iterate through the input: *)
    #+Im[i   ]&      (* add the imaginary component of i... *)
          *=I        (* multiplying i by the imaginary unit each iteration *)

注:i=1関数の外側に表示されますが、このメタコンセンサスでは問題ありません


ただし、関数は必ずしも再利用可能ではありません(関数の1回の呼び出しが1とi異なる値を持っている場合)
-user202729

@ user202729私がリンクしたメタコンセンサスは、特にその問題を扱っています。関数の外でグローバル変数を宣言しても構いません。
ジョンファンミン

3

J、12バイト

+1 0 _1 0$~#

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

Jの形状演算子$は周期的に埋められるため#、入力の長さに合わせて整形すると、まさに必要な処理が行われ、入力に追加することができます。]


最初の]をドロップすることでバイトを保存できます(つまり、フックを使用します)
Tikkanz

@Tikkanzすてきなキャッチ。投稿を更新しました。
ジョナ

3

C ++、93 85 83 63バイト

auto w=[](auto&i){for(int j=0;j<i.size();j+=2)i[j]+=j%4?-1:1;};

-8バイト、この答えのおかげで、ラムダパラメータが可能でautoあり、正しいパラメータで渡すことができることを発見しました、それは動作します

-2バイトのおかげでNevay

ザカリーのおかげで-2バイト

vectorインクルードを削除しました。次の条件を尊重するwaコンテナに引数として渡す必要があります。

  • というメソッドがあります size引数なしで
  • 添字演算子をオーバーロードしました

以下の条件を尊重STLコンテナはarrayvectorstringmapunordered_map、そしておそらく他の人

引数を変更して出力することができない場合、引数は許可されません。

C ++、112 110バイト

#include<vector>
std::vector<int>w(std::vector<int>i){for(int j=0;j<i.size();j+=2)i[j]+=(j%4)?-1:1;return i;}

1
最初のもの有効なI / Oです。
パベル

1
を使用j%4して2バイトを節約できます。
ネヴァイ

1
私はあなたの周りに括弧が必要だとは思わないj%4
ザカリー



2

Perl 6、28バイト

{((1+0i,*×i...*)Z+$_)».re}

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

1+0i, * × i ... *1, i, -1, -iサイクルで繰り返される数の無限リストを生成します。これらの数値はZ+、入力リスト($_)とともに加算()されて圧縮され、その後、結果の複素数の実コンポーネントが抽出されます(».re)。



2

ジャプト11 10バイト

Japtのインデックスラッピングを利用します。

Ë+[1TJT]gE

試して


説明

arrayの暗黙的な入力U

Ë

配列にマップします。

+

現在の要素に追加...

gE

現在のインデックスの要素(E)...

[1TJT]

配列内[1,0,-1,0]





1

Math.JS、34バイト

f(k)=k.map(j(x,y,z)=x+im(i^y[1]))

説明した

f(k)=k.map(j(x,y,z)=x+im(i^y[1]))
f(k)=                               # Define a function f, which takes argument k.
     k.map(                     )   # Map k to a function
           j(x,y,z)=                # Function j. Takes arguments x, y, and z. Where x is the item, y is the index in the form [i], and z is the original list.
                      im(      )    # The imaginary component of...
                         i^y[1]     # i to the power of the index.
                    x+              # x +, which gives our wave.

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


1

8番目96 63バイト

コード

a:new swap ( swap 90 * deg>rad n:cos int + a:push ) a:each drop

このコードは、結果の配列をTOSに残します

使用法と例

ok> [0,0,0,0,0] a:new swap ( swap 90 n:* deg>rad n:cos n:int n:+ a:push ) a:each drop .
[1,0,-1,0,1]

ok> [-4,3,0,1,7,9,8,-2,11,-88] a:new swap ( swap 90 * deg>rad n:cos int + a:push ) a:each drop .
[-3,3,-1,1,8,9,7,-2,12,-88]

説明

cos(x)を使用して正しいシーケンス[1,0、-1,0]を取得します。各配列要素のインデックスは90度で乗算され、次にcos()関数に渡されて、対応するアイテムに追加される目的の「波の要因」を取得します。

: f \ a -- a
  a:new    \ create output array
  swap     \ put input array on TOS
  \ array element's index is passed to cos in order to compute
  \ the "wave factor" to add to each item
  ( swap 90 n:* deg>rad n:cos n:int n:+ 
  a:push ) \ push new item into output array 
  a:each
  drop     \ get rid of input array and leave ouput array on TOS
;



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