Aplicar una ola a una matriz


24

Su tarea hoy es aplicar una onda a una serie de números. Una onda se ve así: [1, 0, -1, 0, 1, 0, -1, 0, 1...]aplicarla a una matriz dada significa sumar los primeros elementos, los segundos elementos, etc.

Más precisamente:

Su programa o función recibirá una variedad de enteros. Debe imprimir o devolver una matriz de igual tamaño 1agregada al primer, quinto, noveno, etc. elemento de la matriz original, -1agregada al tercer, séptimo, 11.º, etc. elemento de la matriz original y el resto de los elementos. debe dejarse intacto.

Se garantiza que la matriz de entrada tenga al menos un elemento.

Casos de prueba:

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]

Este es el , ¡el código más corto gana!


Algo inesperado, muchas soluciones están usando magia imaginaria de números ...
Pavel

2
Tiene mucho sentido por qué los números imaginarios serían útiles, este es un problema de onda y los números imaginarios tienen un historial bien documentado de propiedades polares. Los números imaginarios pueden ser una forma bastante golfosa de calcular senos y cosenos, especialmente para este tipo de rotaciones de cuartos enteros. Math is cool ...
Wheat Wizard

3
@WheatWizard Es una proporción bastante grande dado que la mayoría de los idiomas no tienen soporte para números imaginarios.
Pavel

Respuestas:


8

Jalea , 5 bytes

Jı*Ċ+

Pruébalo en línea!

Cómo funciona

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.


1
Alguna explicación?
Pureferret

1
@Pureferret la parte imaginaria de los poderes sucesivos del número imaginario i se agrega a cada elemento
Cœur

@ Cœur es eso 1, 2, 3 ...o 1, 0, -1, 0 ...?
Pureferret

1
@Pureferret la misma explicación de la respuesta en MAT o Math.JS o Mathematica o R o ...
Coeur

14

LOGOTIPO , 18 bytes

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

No hay un "¡Pruébelo en línea!" enlace porque todos los intérpretes de LOGO en línea no admiten la lista de plantillas.

Esa es una lista de plantillas (equivalente a la función lambda en otros idiomas).

Uso:

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

( invokellama a la función, primprime el resultado)

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

Explicación (ya bastante comprensible):

 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

Ja, sabía que a alguien se le ocurriría una respuesta sinusoidal.
ETHproductions

2
@ETHproductions la primera respuesta, en Mathematica, se basó en Sine hasta que se redujo. La segunda respuesta, en R, sigue usando seno.
Pavel

1
@ Phoenix Estoy sorprendido de no
haberme

@ETHproductions y ... Sine también ha sido extraída de la respuesta R. Creo que está haciendo lo mismo que la respuesta de Mathematica.
Pavel

13

Haskell , 26 bytes

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

Pruébalo en línea! (ejecuta todos los casos de prueba)

Explicación:

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 bytes

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

El cálculo es así:

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

El último bit aprovecha el hecho de que en JS, un número negativo cuando se modula conservará su signo negativo (es decir -5 % 3 -> -2, en lugar de 1como sería en Python).


9

Mathematica, 26 23 22 bytes

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

Pruébalo en línea!(Matemáticas)

Nota: El enlace TIO es para la versión de 23 bytes, la versión de 22 bytes no es compatible con matemáticas.


Hay una solución de Mathematica de 19 bytes a continuación (con 4 bytes de inicialización)
user202729


8

MATL , 11 8 bytes

Jyn:^Yj+

¡Pruébalo en MATL Online!

Explicación

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]

Um, se te olvidó agregar el +en la explicación
caird coinheringaahing

@cairdcoinheringaahing Gracias, editado
Luis Mendo

3

Jalea , 16 bytes

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

Pruébalo en línea!

heh estoy seguro de que esto es demasiado largo

Editar

Sé que es posible una solución de 5 bytes, pero mi wifi parece estar empezando a interrumpirme, así que jugaré golf mañana. Si alguien publica la solución Jelly corta antes de que pueda jugar golf, está bien para mí; Solo mantendré esto aquí como referencia de lo mal que estoy en Jelly jajaja otra forma de hacerlo. Quiero decir, podría mirar el enlace que Phoenix publicó en los comentarios, pero como todavía estoy aprendiendo, no quiero mirar la solución hasta que lo haya descubierto yo mismo. Esto podría costarme reputación, pero el aprendizaje es para lo que estoy aquí :)))


LeakyNun lo hizo en 5 en el chat: Spoiler
Pavel

55
Oh .__________.
HyperNeutrino




3

Haskell , 26 bytes

@Mego me ganó a esta solución

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

Pruébalo en línea!

Esto es en lo que Haskell es genial. Esto declara una función sin puntos que comprime la entrada con una lista infinita.

Haskell , 56 bytes

Aquí hay una solución que usa números complejos. No es muy competitivo debido a la importación, pero sin embargo es bastante bueno.

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

Pruébalo en línea!


2
Eek! ¡Me has hecho un ninja por 20 segundos!
Mego

No tiene sentido tener dos soluciones idénticas. Dado que tomó mi mejora sin atribución e hizo que nuestras respuestas fueran idénticas, ¿eliminaría las suyas?
Mego

3

Mathematica, 19 bytes

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

Explicación

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=1aparece fuera de la función, lo cual está bien según este meta consenso .


Pero entonces la función no es necesariamente reutilizable (si después de una llamada de la función itiene un valor diferente de 1)
user202729

@ user202729 el meta consenso que vinculé específicamente trata ese tema. Está bien declarar una variable global fuera de una función.
JungHwan Min

3

J, 12 bytes

+1 0 _1 0$~#

Pruébalo en línea!

Debido a que el operador de forma de J se $llena cíclicamente, cuando le damos forma a la longitud #de la entrada, hace exactamente lo que queremos, y simplemente podemos agregarlo a la entrada]


Puede guardar un byte soltando el primero] (es decir, usar un gancho)
Tikkanz

@Tikkanz buena captura. He actualizado la publicación.
Jonás

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, gracias a esta respuesta , descubrí que los parámetros lambda pueden ser autoy puede pasar con el parámetro correcto, funcionará

-2 bytes gracias a Nevay

-2 bytes gracias a Zacharý

Eliminé la vectorinclusión. Deberá pasar como argumento a un contenedor que respete las siguientes condiciones:

  • Tener un método llamado sizesin argumentos
  • Han sobrecargado el operador de subíndice

Los contenedores STL que respetan las siguientes condiciones son array,vector , string, map,unordered_map , y tal vez otros

Si la salida mediante la modificación de argumentos no está permitida, entonces:

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

1
Su primera es válida E / S.
Pavel

1
Puede usar j%4para guardar 2 bytes.
Nevay

1
No creo que necesites parens alrededor j%4.
Zacharý


2

Dyalog APL, 13 bytes

⊢+1 0 ¯1 0⍴⍨≢

Pruébalo en línea!

¿Cómo?

1 0 ¯1 0 - la matriz [1, 0, -1, 0]

⍴⍨≢ - remodelar a la longitud de la entrada, cíclica

⊢+ - suma vectorizada con la entrada


2

Perl 6 , 28 bytes

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

Pruébalo en línea!

1+0i, * × i ... *produce una lista infinita de los números 1, i, -1, -irepetidos en un ciclo. Esos números se comprimen con suma ( Z+) con la lista de entrada ( $_), y luego se extraen los componentes reales de los números complejos resultantes ( ».re).



2

Japt , 11 10 bytes

Aprovecha el ajuste de índice de Japt.

Ë+[1TJT]gE

Pruébalo


Explicación

Entrada implícita de la matriz U.

Ë

Mapa sobre la matriz.

+

Al elemento actual agregue ...

gE

El elemento en el índice actual ( E) ...

[1TJT]

En la matriz [1,0,-1,0].


1

En realidad , 11 bytes

;r⌠╦½*C≈⌡M¥

Pruébalo en línea!(ejecuta todos los casos de prueba)

Explicación:

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

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

Explicado

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.

Pruébalo en línea!


1

8 , 96 63 bytes

Código

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

Este código deja la matriz resultante en TOS

Uso y ejemplos

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]

Explicación

Usamos cos (x) para obtener la secuencia correcta [1,0, -1,0]. El índice de cada elemento de matriz se multiplica por 90 grados y luego se pasa a la función cos () para obtener el "factor de onda" deseado que se agregará al elemento correspondiente.

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



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.