Appliquer une onde à un tableau

24

Votre tâche consiste aujourd'hui à appliquer une onde à un tableau de nombres. Une onde ressemble à ceci: l' [1, 0, -1, 0, 1, 0, -1, 0, 1...]appliquer à un tableau donné signifie additionner les premiers éléments, les seconds éléments, etc.

Plus précisément:

Votre programme ou fonction recevra un tableau d'entiers. Il doit imprimer ou renvoyer un tableau de taille égale avec 1ajouté au 1er, 5e, 9e, etc. élément du tableau d'origine, -1ajouté au 3e, 7e, 11e, etc. élément du tableau d'origine, et le reste des éléments devrait être laissé intact.

Le tableau d'entrée est garanti d'avoir au moins un élément.

Cas de test:

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]

C'est le , le code le plus court gagne!

Pavel
la source
De façon assez inattendue, de nombreuses solutions utilisent la magie des nombres imaginaires ...
Pavel
2
Il est très logique de comprendre pourquoi les nombres imaginaires seraient utiles, c'est un problème de vague et les nombres imaginaires ont une histoire bien documentée des propriétés polaires. Les nombres imaginaires peuvent être une manière assez golfique de calculer les sinus et les cosinus, en particulier pour ces types de quart de tour entiers. Math is cool ...
Wheat Wizard
3
@WheatWizard C'est une proportion assez importante étant donné que la plupart des langues ne prennent pas en charge les nombres imaginaires.
Pavel

Réponses:

8

Gelée , 5 octets

Jı*Ċ+

Essayez-le en ligne!

Comment ça marche

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
la source
Identique à ce que Leaky Nun a obtenu: chat.stackexchange.com/transcript/message/38868472#38868472
Pavel
1
Une explication?
Pureferret
1
@Pureferret la partie imaginaire des puissances successives du nombre imaginaire i est ajoutée à chaque élément
Cœur
@ Cœur c'est ça 1, 2, 3 ...ou 1, 0, -1, 0 ...?
Pureferret
1
@Pureferret la même explication que la réponse en MATL ou Math.JS ou Mathematica ou R ou ...
Cœur
14

LOGO , 18 octets

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

Il n'y a pas de "Essayez-le en ligne!" lien car tous les interpréteurs de LOGO en ligne ne prennent pas en charge la liste de modèles.

Il s'agit d'une liste de modèles (équivalent de la fonction lambda dans d'autres langues).

Usage:

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

( invokeappelle la fonction, primprime le résultat)

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

Explication (déjà assez compréhensible):

 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
la source
Hah, je savais que quelqu'un trouverait une réponse à base de sinus.
ETHproductions
2
@ETHproductions la toute première réponse, dans Mathematica, était basée sur Sine jusqu'à ce qu'il soit joué au golf. La deuxième réponse, en R, est toujours en utilisant le sinus.
Pavel
1
@Phoenix Je suis choqué de ne pas l'avoir remarqué ...
ETHproductions
@ETHproductions et .... Sine a également été éliminé de la réponse R. Je pense que cela fait la même chose que la réponse Mathematica.
Pavel
13

Haskell , 26 octets

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

Essayez-le en ligne! (exécute tous les cas de test)

Explication:

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
la source
9

JavaScript (ES6), 28 octets

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

Le calcul se déroule comme suit:

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

Le dernier bit profitant du fait qu'en JS, un nombre négatif lorsqu'il est modulé conservera son signe négatif (c'est -5 % 3 -> -2-à- dire au lieu de 1ce qu'il serait en Python).

ETHproductions
la source
9

Mathematica, 26 23 22 octets

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

Essayez-le en ligne! (Mathématiques)

Remarque: Le lien TIO est pour la version 23 octets, la version 22 octets n'est pas compatible avec les mathématiques.

user202729
la source
Il existe une solution Mathematica de 19 octets ci-dessous (avec 4 octets d'initialisation)
user202729
8

MATL , 11 8 octets

Jyn:^Yj+

Essayez-le sur MATL Online!

Explication

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
la source
Hum, vous avez oublié d'ajouter le +dans l'explication
caird coinheringaahing
@cairdcoinheringaahing Merci, édité
Luis Mendo
3

Gelée , 16 octets

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

Essayez-le en ligne!

heh je suis sûr que c'est trop long

modifier

Je sais qu'une solution à 5 octets est possible mais mon wifi semble commencer à me couper, donc je jouerai au golf demain. Si quelqu'un poste la courte solution Jelly avant que je puisse jouer au golf, ça me va; Je vais juste garder ceci ici pour référence à quel point je suis mauvais à Jelly lol une autre façon de le faire. Je veux dire, je pourrais simplement regarder le lien que Phoenix a posté dans les commentaires, mais comme j'apprends encore, je ne veux pas regarder la solution avant de l'avoir trouvée moi-même. Cela pourrait me coûter de la réputation mais l'apprentissage est ce pour quoi je suis ici :)))

HyperNeutrino
la source
LeakyNun l'a fait en 5 sur le chat: Spoiler
Pavel
5
oh .__________.
HyperNeutrino
Dennis l'a compris: codegolf.stackexchange.com/a/135145/60042
Pavel
3

Python 2 , 50 42 octets

8 octets enregistrés grâce à @Sisyphus!

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

Essayez-le en ligne!

53 octets

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

Essayez-le en ligne!

musicman523
la source
lambda l:map(sum,zip(l,[1,0,-1,0]*len(l)))pour Python 2
Sisyphus
Bien, cela économise 5 octets en Python 3 puis 3 autres en Python 2. Merci!
musicman523
3

Haskell , 26 octets

@Mego m'a battu pour cette solution

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

Essayez-le en ligne!

C'est ce à quoi Haskell est excellent. Cela déclare une fonction sans point qui zippe l'entrée avec une liste infinie.

Haskell , 56 octets

Voici une solution qui utilise des nombres complexes. Pas très compétitif à cause de l'import mais jamais moins sympa.

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

Essayez-le en ligne!

Assistant de blé
la source
2
Eek! Tu m'as ninja de 20 secondes!
Mego
Il est inutile d'avoir deux solutions identiques. Puisque vous avez pris mon amélioration sans attribution et rendu nos réponses identiques, supprimeriez-vous la vôtre?
Mego
3

Mathematica, 19 octets

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

Explication

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

Remarque: i=1apparaît en dehors de la fonction, ce qui est correct selon ce méta consensus .

JungHwan Min
la source
Mais alors la fonction n'est pas nécessairement réutilisable (si après un appel de la fonction ia une valeur différente de 1)
user202729
@ user202729 le méta consensus que j'ai lié traite spécifiquement de cette question. Il est correct de déclarer une variable globale en dehors d'une fonction.
JungHwan Min
3

J, 12 octets

+1 0 _1 0$~#

Essayez-le en ligne!

Parce que l'opérateur de forme de J se $remplit cycliquement, lorsque nous le façonnons à la longueur #de l'entrée, il fait exactement ce que nous voulons, et nous pouvons simplement l'ajouter à l'entrée]

Jonas
la source
Vous pouvez enregistrer un octet en supprimant le premier] (c'est-à-dire utiliser un crochet)
Tikkanz
@Tikkanz nice catch. j'ai mis à jour le message.
Jonah
3

C ++, 93 85 83 63 octets

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

-8 octets, grâce à cette réponse , j'ai découvert que les paramètres lambda peuvent être autoet vous pouvez passer avec le paramètre correct, cela fonctionnera

-2 octets grâce à Nevay

-2 octets grâce à Zacharý

J'ai supprimé l' vectorinclude. Vous devrez passer comme argument à un conteneur qui respecte les conditions suivantes:

  • Avoir une méthode appelée sizesans arguments
  • Ont surchargé l'opérateur d'indice

Les conteneurs STL qui respectent les conditions suivantes sont array, vector, string, map, unordered_map, et peut - être d' autres

Si la sortie en modifiant des arguments n'est pas autorisée, alors:

C ++, 112 110 octets

#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
la source
1
Votre premier est un E / S valide.
Pavel
1
Vous pouvez utiliser j%4pour enregistrer 2 octets.
Nevay
1
Je ne pense pas que vous ayez besoin de parens j%4.
Zacharý
2

Dyalog APL, 13 octets

⊢+1 0 ¯1 0⍴⍨≢

Essayez-le en ligne!

Comment?

1 0 ¯1 0 - le tableau [1, 0, -1, 0]

⍴⍨≢ - remodeler à la longueur de l'entrée, cyclique

⊢+ - somme vectorisée avec l'entrée

Uriel
la source
2

Perl 6 , 28 octets

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

Essayez-le en ligne!

1+0i, * × i ... *produit une liste infinie des nombres 1, i, -1, -irépétés dans un cycle. Ces nombres sont zippés avec addition ( Z+) avec la liste d'entrée ( $_), puis les composants réels des nombres complexes résultants sont extraits ( ».re).

Sean
la source
2

Japt , 11 10 octets

Profite de l'habillage d'index de Japt.

Ë+[1TJT]gE

Essaye-le


Explication

Entrée implicite du tableau U.

Ë

Carte sur le tableau.

+

À l'élément actuel, ajoutez ...

gE

L'élément à l'index en cours ( E) ...

[1TJT]

Dans le tableau [1,0,-1,0].

Hirsute
la source
1

En fait , 11 octets

;r⌠╦½*C≈⌡M¥

Essayez-le en ligne! (exécute tous les cas de test)

Explication:

;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
la source
1

Pyth , 11 octets

.e+bss^.j)k

Essayez-le en ligne!

deltaepsilon3
la source
Entré avec une autre solution avec le même nombre d'octets:.e+b@[1Z_1Z
clap
Remplacez sspar e-1.
Erik the Outgolfer du
Est-ce que ça marche? .e+be^.j)kne semblait pas fonctionner quand je l'ai essayé.
deltaepsilon3
1

Math.JS , 34 octets

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

Expliqué

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.

Essayez-le en ligne!

ATaco
la source
1

8ème , 96 63 octets

Code

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

Ce code laisse le tableau résultant sur TOS

Utilisation et exemples

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]

Explication

Nous utilisons cos (x) pour obtenir la bonne séquence [1,0, -1,0]. L'index de chaque élément du tableau est multiplié par 90 degrés, puis il est passé à la fonction cos () pour obtenir le "facteur d'onde" souhaité à ajouter à l'élément correspondant.

: 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
;
Manoir du Chaos
la source
1

05AB1E , 16 octets

vy3L2.SR0¸«Nè+})

Essayez-le en ligne!


3L2.SR0¸«est la chose la plus courte à laquelle je puisse penser sin(x % 4)dans 05AB1E.

Urne de poulpe magique
la source