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!


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.

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

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

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


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.


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]

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


LeakyNun l'a fait en 5 sur le chat: Spoiler
Pavel

5
oh .__________.
HyperNeutrino




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!


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 .


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]


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;}

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


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



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].


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



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!


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
;



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.