Wenden Sie eine Welle auf ein Array an

24

Ihre Aufgabe heute ist es, eine Welle auf eine Reihe von Zahlen anzuwenden. Eine Welle sieht folgendermaßen aus: [1, 0, -1, 0, 1, 0, -1, 0, 1...]Wenn Sie sie auf ein bestimmtes Array anwenden, müssen Sie die ersten Elemente, die zweiten Elemente usw. addieren.

Etwas präziser:

Ihr Programm oder Ihre Funktion erhält eine Reihe von ganzen Zahlen. Es muss ein Array mit gleicher Größe gedruckt oder zurückgegeben werden 1, wobei das erste, fünfte, neunte usw. Element des ursprünglichen Arrays, -1das dritte, siebte, elfte usw. Element des ursprünglichen Arrays und die übrigen Elemente hinzugefügt werden sollte unberührt bleiben.

Es wird garantiert, dass das Eingabearray mindestens ein Element enthält.

Testfälle:

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]

Das ist , der kürzeste Code gewinnt!

Pavel
quelle
Etwas unerwartet verwenden viele Lösungen imaginäre Zahlenmagie ...
Pavel
2
Es ist sehr vernünftig, warum imaginäre Zahlen nützlich sind, dies ist ein Wellenproblem und die imaginären Zahlen haben eine gut dokumentierte Geschichte polarer Eigenschaften. Imaginäre Zahlen können eine ziemlich schwierige Methode zur Berechnung von Sinus und Cosinus sein, insbesondere für diese Arten von ganzzahligen Viertelumdrehungen. Mathe ist cool ...
Weizen-Assistent
3
@ WheatWizard Es ist ein ziemlich großer Anteil, da die meisten Sprachen keine Unterstützung für imaginäre Zahlen haben.
Pavel

Antworten:

8

Gelee , 5 Bytes

Jı*Ċ+

Probieren Sie es online!

Wie es funktioniert

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.
Dennis
quelle
Dasselbe
Pavel
1
Irgendeine Erklärung?
Pureferret
1
@ Pureferret den imaginären Teil der aufeinanderfolgenden Potenzen der imaginären Zahl i werden zu jedem Element hinzugefügt
Cœur
@Cœur ist das 1, 2, 3 ...oder 1, 0, -1, 0 ...?
Pureferret
1
@ Pureferret die gleiche Erklärung wie die Antwort in MATL oder Math.JS oder Mathematica oder R oder ...
Cœur
14

LOGO , 18 Bytes

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

Es gibt kein "Online ausprobieren!" Link, da alle Online-LOGO-Interpreter keine Vorlagenliste unterstützen.

Das ist eine Template-Liste (entspricht der Lambda-Funktion in anderen Sprachen).

Verwendung:

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

( invokeruft die Funktion auf, prdruckt das Ergebnis)

druckt [-3 3 -1 1 8 9 7 -2 12 -88].

Erklärung (schon ziemlich verständlich):

 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
user202729
quelle
Hah, ich wusste, dass jemand eine sinusbasierte Antwort finden würde.
ETHproductions
2
@ETHproductions Die allererste Antwort in Mathematica basierte auf Sine, bis es heruntergespielt wurde. Die zweite Antwort in R ist die Verwendung von Sinus.
Pavel
1
@Phoenix Ich bin schockiert, dass ich es nicht bemerkt habe ...
ETHproductions
@ETHproductions und .... Sine wurde auch aus der R-Antwort herausgolfen. Ich denke, es macht dasselbe wie die Mathematica-Antwort.
Pavel
13

Haskell , 26 Bytes

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

Probieren Sie es online! (führt alle Testfälle aus)

Erläuterung:

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
Mego
quelle
9

JavaScript (ES6), 28 Byte

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

Die Berechnung geht so:

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

Das letzte Bit, das die Tatsache ausnutzt, dass in JS eine negative Zahl, wenn sie moduliert wird, ihr negatives Vorzeichen behält (dh -5 % 3 -> -2anstatt 1wie in Python).

ETHproductions
quelle
9

Mathematica, 26 23 22 Bytes

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

Probieren Sie es online! (Mathematik)

Hinweis: Der TIO-Link gilt für die 23-Byte-Version, die 22-Byte-Version ist nicht Mathics-kompatibel.

user202729
quelle
Es gibt eine 19-Byte-Mathematica-Lösung unten (mit 4 Byte Initialisierung)
user202729
8

MATL , 11 8 Bytes

Jyn:^Yj+

Probieren Sie es bei MATL Online!

Erläuterung

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]
Luis Mendo
quelle
Ähm, Sie haben vergessen, das +in der Erklärung hinzuzufügen
Caird Coinheringaahing
@cairdcoinheringaahing Danke, bearbeitet
Luis Mendo
3

Gelee , 16 Bytes

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

Probieren Sie es online!

heh ich bin sicher das ist zu lang

Bearbeiten

Ich weiß, dass eine 5-Byte-Lösung möglich ist, aber mein WLAN scheint mich abzuschneiden, so dass ich morgen Golf spielen werde. Wenn jemand die kurze Jelly-Lösung veröffentlicht, bevor ich Golf spielen kann, ist das in Ordnung für mich. Ich behalte das hier nur als Hinweis darauf, wie schlimm ich bei Jelly bin. Ein anderer Weg, es zu tun. Ich meine, ich könnte nur auf den Link schauen, den Phoenix in den Kommentaren gepostet hat, aber da ich noch lerne, möchte ich nicht auf die Lösung schauen, bis ich es selbst herausgefunden habe. Das könnte mich den Ruf kosten, aber das Lernen ist das, wofür ich hier bin :)))

HyperNeutrino
quelle
LeakyNun hat es in 5 im Chat geschafft: Spoiler
Pavel
5
Oh .__________.
HyperNeutrino
Dennis hat es verstanden: codegolf.stackexchange.com/a/135145/60042
Pavel
3

Python 2 , 50 42 Bytes

8 Bytes gespart dank @Sisyphus!

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

Probieren Sie es online!

53 Bytes

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

Probieren Sie es online!

musicman523
quelle
lambda l:map(sum,zip(l,[1,0,-1,0]*len(l)))für Python 2
Sisyphus
Schön, dass in Python 3 5 Bytes und in Python 2 3 Bytes mehr gespart werden. Danke!
musicman523
3

Haskell , 26 Bytes

@Mego hat mich zu dieser Lösung geschlagen

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

Probieren Sie es online!

Darin ist Haskell großartig. Dies deklariert eine punktfreie Funktion, die die Eingabe mit einer unendlichen Liste komprimiert.

Haskell , 56 Bytes

Hier ist eine Lösung, die komplexe Zahlen verwendet. Aufgrund des Imports nicht sehr wettbewerbsfähig, aber trotzdem ziemlich cool.

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

Probieren Sie es online!

Weizen-Assistent
quelle
2
Eek! Du hast mich um 20 Sekunden erledigt!
Mego
Es hat keinen Sinn, zwei identische Lösungen zu haben. Da Sie meine Verbesserung ohne Zuschreibung übernommen und unsere Antworten identisch gemacht haben, würden Sie Ihre löschen?
Mego
3

Mathematica, 19 Bytes

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

Erläuterung

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 *)

Hinweis: i=1Erscheint außerhalb der Funktion, was gemäß diesem Metakonsens in Ordnung ist .

JungHwan min
quelle
Aber dann ist die Funktion nicht unbedingt wiederverwendbar (wenn nach einem Aufruf der Funktion ein ianderer Wert als 1
vorliegt
@ user202729 Der von mir verlinkte Metakonsens befasst sich speziell mit diesem Thema. Es ist in Ordnung, eine globale Variable außerhalb einer Funktion zu deklarieren.
JungHwan Min
3

J, 12 Bytes

+1 0 _1 0$~#

Probieren Sie es online!

Da der Formoperator von J $zyklisch ausgefüllt wird und wir ihn an die Länge #der Eingabe anpassen, wird genau das getan, was wir wollen, und wir können ihn einfach zur Eingabe hinzufügen]

Jona
quelle
Sie können ein Byte speichern, indem Sie das erste]
löschen
@Tikkanz schöner Fang. Ich habe den Beitrag aktualisiert.
Jonah
3

C ++, 93 85 83 63 Bytes

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

-8 Bytes, danke an dieser Antwort entdeckte ich, dass Lambda-Parameter sein können autound Sie mit dem richtigen Parameter übergeben können, wird es funktionieren

-2 Bytes dank Nevay

-2 Bytes dank Zacharý

Ich habe das vectorInclude entfernt. Sie müssen als Argument einen Container übergeben, der die folgenden Bedingungen erfüllt:

  • Habe eine Methode aufgerufen size ohne Argumente
  • Habe den Indexoperator überladen

STL - Container, die die folgenden Bedingungen erfüllen sind array, vector, string, map, unordered_map, und vielleicht andere

Wenn die Ausgabe durch Ändern von Argumenten nicht zulässig ist, gilt Folgendes:

C ++ 112 110 Bytes

#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;}
HatsuPointerKun
quelle
1
Ihre erste ist gültig I / O.
Pavel
1
Sie können j%42 Bytes speichern.
Nevay
1
Ich glaube nicht, dass du Parens brauchst j%4.
Zacharý
2

Dyalog APL, 13 Bytes

⊢+1 0 ¯1 0⍴⍨≢

Probieren Sie es online!

Wie?

1 0 ¯1 0 - das Array [1, 0, -1, 0]

⍴⍨≢ - Umformen auf die Länge der Eingabe, zyklisch

⊢+ - vektorisierte Summe mit der Eingabe

Uriel
quelle
2

Perl 6 , 28 Bytes

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

Probieren Sie es online!

1+0i, * × i ... *erzeugt eine unendliche Liste der 1, i, -1, -iin einem Zyklus wiederholten Zahlen . Diese Zahlen werden Z+mit der Eingabeliste ( $_) durch Addition ( ) gezippt , und dann werden die realen Komponenten der resultierenden komplexen Zahlen extrahiert ( ».re).

Sean
quelle
2

Japt , 11 10 Bytes

Nutzt Japts Index-Wrapping.

Ë+[1TJT]gE

Probier es aus


Erläuterung

Implizite Eingabe eines Arrays U.

Ë

Karte über das Array.

+

Zum aktuellen Element hinzufügen ...

gE

Das Element am aktuellen Index ( E) ...

[1TJT]

In der Reihe [1,0,-1,0].

Zottelig
quelle
1

Eigentlich 11 Bytes

;r⌠╦½*C≈⌡M¥

Probieren Sie es online! (führt alle Testfälle aus)

Erläuterung:

;r⌠╦½*C≈⌡M¥
;r           range(len(input))
  ⌠╦½*C≈⌡M   for each value in range:
   ˫*C      cos(pi/2*value)
       ≈     floor to integer
          ¥  pairwise addition of the input and the new list
Mego
quelle
1

Pyth , 11 Bytes

.e+bss^.j)k

Probieren Sie es online!

deltaepsilon3
quelle
Kam mit einer anderen Lösung mit der gleichen Byteanzahl auf:.e+b@[1Z_1Z
Klatschen
Ersetzen Sie ssmit efür -1.
Erik der Outgolfer
Funktioniert es? .e+be^.j)kschien nicht zu funktionieren, als ich es versuchte.
Deltaepsilon3
1

Math.JS , 34 Bytes

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

Erklärt

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.

Probieren Sie es online!

Ein Taco
quelle
1

8. , 96 63 Bytes

Code

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

Dieser Code belässt das resultierende Array unter TOS

Verwendung und Beispiele

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]

Erläuterung

Wir verwenden cos (x), um die richtige Reihenfolge zu erhalten [1,0, -1,0]. Der Index jedes Array-Elements wird mit 90 Grad multipliziert und dann an die cos () -Funktion übergeben, um den gewünschten "Wellenfaktor" zu erhalten, der dem entsprechenden Element hinzugefügt wird.

: 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
;
Chaos Manor
quelle
1

C # (.NET Core) , 50 Byte

n=>{for(int i=0;i<n.Length;i+=2)n[i]+=i%4<1?1:-1;}

Probieren Sie es online!

Verwendet ein einfaches Lambda. Ändert das ursprüngliche Array und gibt die Ausgabe über die Referenz zurück.

jkelm
quelle