Applicare un'onda a un array


24

Il tuo compito oggi è applicare un'onda a una matrice di numeri. Un'onda ha questo aspetto: [1, 0, -1, 0, 1, 0, -1, 0, 1...]applicarla a un determinato array significa sommare i primi elementi, i secondi elementi, ecc.

Più precisamente:

Il tuo programma o funzione riceverà una matrice di numeri interi. Deve stampare o restituire un array di dimensioni uguali con l' 1aggiunta del 1o, 5o, 9o, ecc. Elemento dell'array originale, -1aggiunto al 3o, 7o, 11o, ecc. Elemento dell'array originale e il resto degli elementi dovrebbe essere lasciato intatto.

È garantito che l'array di input abbia almeno un elemento.

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

Questo è , vince il codice più corto!


Un po 'inaspettatamente, molte soluzioni stanno usando la magia del numero immaginario ...
Pavel,

2
Ha molto senso il motivo per cui i numeri immaginari sarebbero utili, questo è un problema d'onda e i numeri immaginari hanno una storia ben documentata di proprietà polari. I numeri immaginari possono essere un modo piuttosto golfoso di calcolare seni e coseni soprattutto per questi tipi di rotazioni di un quarto intero. La matematica è bella ...
Wheat Wizard,

3
@WheatWizard È una proporzione abbastanza grande dato che la maggior parte delle lingue non supporta i numeri immaginari.
Pavel,

Risposte:


8

Gelatina , 5 byte

Jı*Ċ+

Provalo online!

Come funziona

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.

Lo stesso di quello che ha ottenuto Leaky Nun: chat.stackexchange.com/transcript/message/38868472#38868472
Pavel

1
Alcuna spiegazione?
Pureferret,

1
@Pureferret la parte immaginaria dei successivi poteri del numero immaginario i vengono aggiunti a ciascun elemento
Cœur

@Cœur è questo 1, 2, 3 ...o 1, 0, -1, 0 ...?
Pureferret,

1
@Pureferret la stessa spiegazione della risposta in MATL o Math.JS o Mathematica o R o ...
Cœur

14

LOGO , 18 byte

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

Non esiste "Provalo online!" collegamento perché tutto l'interprete LOGO online non supporta l'elenco dei modelli.

Questo è un elenco di modelli (equivalente della funzione lambda in altre lingue).

Uso:

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

( invokechiama la funzione, prstampa il risultato)

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

Spiegazione (già abbastanza comprensibile):

 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

Ah, sapevo che qualcuno avrebbe avuto una risposta sinusoidale.
ETHproductions

2
@ETHproductions la prima risposta, a Mathematica, era basata su Sine fino a quando non è stata eliminata. La seconda risposta, in R, è stil usando il seno.
Pavel,

1
@Phoenix Sono scioccato di non aver notato ...
ETHproductions

@ETHproductions and .... Anche Sine è stato scartato dalla risposta R. Penso che stia facendo la stessa cosa della risposta di Mathematica.
Pavel,

13

Haskell , 26 byte

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

Provalo online! (esegue tutti i casi di test)

Spiegazione:

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 byte

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

Il calcolo procede in questo modo:

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

L'ultimo bit sfrutta il fatto che in JS, un numero negativo quando modulato manterrà il suo segno negativo (cioè -5 % 3 -> -2, invece di 1come sarebbe in Python).


9

Mathematica, 26 23 22 byte

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

Provalo online!(Mathics)

Nota: il collegamento TIO è per la versione a 23 byte, la versione a 22 byte non è compatibile con Mathics.


C'è una soluzione Mathematica a 19 byte di seguito (con 4 byte di inizializzazione)
user202729


8

MATL , 11 8 byte

Jyn:^Yj+

Provalo su MATL Online!

Spiegazione

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]

Uhm, hai dimenticato di aggiungere la +spiegazione
caird coinheringaahing il

@cairdcoinheringaahing Grazie, a cura
Luis Mendo

3

Gelatina , 16 byte

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

Provalo online!

eh sono sicuro che sia troppo lungo

modificare

So che una soluzione a 5 byte è possibile ma il mio wifi sembra iniziare a tagliarmi, quindi domani giocherò a golf. Se qualcuno pubblica la soluzione Jelly corta prima che io possa giocare a golf, va bene per me; Terrò questo qui come riferimento per quanto sono cattivo a Jelly per un altro modo di farlo. Voglio dire, potrei solo guardare il link che Phoenix ha pubblicato nei commenti, ma dato che sto ancora imparando, non voglio guardare la soluzione fino a quando non l'ho capito da solo. Questo potrebbe costarmi la reputazione ma l'apprendimento è quello per cui sono qui :)))


LeakyNun l'ha fatto in chat 5: Spoiler
Pavel,

5
oh .__________.
HyperNeutrino,




3

Haskell , 26 byte

@Mego mi ha battuto per questa soluzione

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

Provalo online!

Questo è ciò in cui Haskell è eccezionale. Questo dichiara una funzione senza punti che comprime l'input con un elenco infinito.

Haskell , 56 byte

Ecco una soluzione che utilizza numeri complessi. Non molto competitivo a causa dell'importazione ma mai meno interessante.

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

Provalo online!


2
Eek! Mi hai distrutto per 20 secondi!
Mego,

Non ha senso avere due soluzioni identiche. Dato che hai preso il mio miglioramento senza attribuzione e reso identiche le nostre risposte, elimineresti le tue?
Mego,

3

Mathematica, 19 byte

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

Spiegazione

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

Nota: i=1appare al di fuori della funzione, il che va bene per questo meta consenso .


Ma poi la funzione non è necessariamente riutilizzabile (se dopo una chiamata della funzione iha un valore diverso da 1)
user202729

@ user202729 il meta consenso che ho collegato si occupa specificamente di quel problema. Va bene dichiarare una variabile globale al di fuori di una funzione.
JungHwan Min

3

J, 12 byte

+1 0 _1 0$~#

Provalo online!

Poiché l'operatore di forma J si $riempie ciclicamente, quando lo modelliamo in base alla lunghezza #dell'input, fa esattamente quello che vogliamo e possiamo semplicemente aggiungerlo all'input]


È possibile salvare un byte rilasciando il primo] (ovvero utilizzare un hook)
Tikkanz

@Tikkanz bella cattura. ho aggiornato il post.
Giona,

3

C ++, 93 85 83 63 byte

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

-8 byte, grazie a questa risposta , ho scoperto che i parametri lambda possono essereauto e puoi passare con il parametro corretto, funzionerà

-2 byte grazie a Nevay

-2 byte grazie a Zacharý

Ho rimosso l' vectorinclusione. Dovrai passare come argomento per wa container che rispetti le seguenti condizioni:

  • Fai chiamare un metodo size senza argomenti
  • Ho sovraccaricato l'operatore di sottoscrizione

I contenitori STL che rispettano le seguenti condizioni sono array, vector, string, map,unordered_map , e forse altri

Se l'output mediante la modifica di argomenti non è consentito, allora:

C ++, 112 110 byte

#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
Il tuo primo è I / O valido.
Pavel,

1
È possibile utilizzare j%4per salvare 2 byte.
Nevay,

1
Non penso che tu abbia bisogno di genitori in giro j%4.
Zacharý,


2

Dyalog APL, 13 byte

⊢+1 0 ¯1 0⍴⍨≢

Provalo online!

Come?

1 0 ¯1 0 - l'array [1, 0, -1, 0]

⍴⍨≢ - rimodellare la lunghezza dell'input, ciclica

⊢+ - somma vettorializzata con l'input


2

Perl 6 , 28 byte

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

Provalo online!

1+0i, * × i ... *produce un elenco infinito dei numeri 1, i, -1, -iripetuti in un ciclo. Questi numeri vengono compressi con addizione ( Z+) con l'elenco di input ( $_), quindi vengono estratti i componenti reali dei numeri complessi risultanti ( ».re).



2

Japt , 11 10 byte

Sfrutta il wrapping dell'indice di Japt.

Ë+[1TJT]gE

Provalo


Spiegazione

Input implicito di array U.

Ë

Mappa sull'array.

+

All'elemento corrente aggiungi ...

gE

L'elemento nell'indice corrente ( E) ...

[1TJT]

Nella matrice [1,0,-1,0].


1

In realtà , 11 byte

;r⌠╦½*C≈⌡M¥

Provalo online! (esegue tutti i casi di test)

Spiegazione:

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

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

spiegato

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.

Provalo online!


1

8 ° , 96 63 byte

Codice

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

Questo codice lascia l'array risultante su TOS

Utilizzo ed esempi

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]

Spiegazione

Usiamo cos (x) per ottenere la giusta sequenza [1,0, -1,0]. L'indice di ciascun elemento dell'array viene moltiplicato per 90 gradi e quindi viene passato alla funzione cos () per ottenere il "fattore d'onda" desiderato da aggiungere all'elemento corrispondente.

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



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.