Застосувати хвилю до масиву


24

Ваше завдання сьогодні - застосувати хвилю до масиву чисел. Хвиля виглядає приблизно так: [1, 0, -1, 0, 1, 0, -1, 0, 1...]Застосовуючи її до заданого масиву, це означає додати разом перші елементи, другі елементи тощо.

Точніше:

Ваша програма або функція отримає масив цілих чисел. Він повинен друкувати або повертати масив однакового розміру з 1доданим до елемента 1-го, 5-го, 9-го і т. Д. Елемента оригінального масиву, -1доданого до елемента 3-го, 7-го, 11-го і т. Д. Елемента оригінального масиву та решта елементів слід залишити недоторканим.

Гарантовано, що вхідний масив містить хоча б один елемент.

Тестові приклади:

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]

Це , найкоротший виграш коду!


Дещо несподівано багато рішень використовують магію уявного числа ...
Павло,

2
Це має велике значення, чому уявні числа були б корисними, це хвильова проблема, і уявні числа мають добре задокументовану історію полярних властивостей. Уявні числа можуть бути досить гострим способом обчислення синусів і косинусів, особливо для цих типів цілих чвертей обертів. Математика крута ...
Пшеничний майстер

3
@WheatWizard Це досить велика частка, оскільки більшість мов не підтримують уявні числа.
Павло

Відповіді:


8

Желе , 5 байт

Jı*Ċ+

Спробуйте в Інтернеті!

Як це працює

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.

Те саме, що отримала Leaky Nun: chat.stackexchange.com/transcript/message/38868472#38868472
Павло

1
Будь-яке пояснення?
Pureferret

1
@Pureferret уявної частини послідовних ступенів мнимого числа я додаю до кожного елементу
Кер

@ Cœur це 1, 2, 3 ...чи 1, 0, -1, 0 ...?
Pureferret

1
@ Чисто те саме пояснення, що і відповідь у MATL або Math.JS або Mathematica або R або ...
Cœur

14

LOGO , 18 байт

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

Немає "Спробуйте в Інтернеті!" посилання, оскільки весь онлайн-перекладач LOGO не підтримує список шаблонів.

Це список-шаблон (еквівалент функції лямбда на інших мовах).

Використання:

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

( invokeвикликає функцію, prдрукує результат)

відбитки [-3 3 -1 1 8 9 7 -2 12 -88].

Пояснення (вже досить зрозуміло):

 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

Га, я знав, що хтось придумає відповідь на основі синуса.
ETHproductions

2
@ETHproductions найперша відповідь, в Mathematica, базувалася на Sine, поки вона не стала гольфу. Друга відповідь, у R, - це стиль із застосуванням синуса.
Павло

1
@Phoenix Я шокований тим, що не помітив ...
ETHproductions

@ETHproductions та .... Sine також виграли з відповіді R. Я думаю, що це робить те саме, що відповідь Mathematica.
Павло


9

JavaScript (ES6), 28 байт

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

Розрахунок йде так:

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

Останній біт, що скористався тим, що в JS від'ємне число при модуляції збереже свій негативний знак (тобто -5 % 3 -> -2замість того, 1як це було б в Python).




8

MATL , 11 8 байт

Jyn:^Yj+

Спробуйте в MATL Online!

Пояснення

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]

Гм, ви забули додати своє +пояснення
caird coinheringaahing

@cairdcoinheringaahing Спасибі, відредаговано
Луїс Мендо

3

Желе , 16 байт

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

Спробуйте в Інтернеті!

хе, я впевнений, що це занадто довго

Редагувати

Я знаю, що можливе рішення в 5 байт, але, здається, мій wifi починає скорочувати мене, тому завтра я буду гольфувати. Якщо хтось опублікує коротке рішення Jelly, перш ніж я зможу це зробити, це добре зі мною; Я просто збережу це тут для ознайомлення з тим, наскільки я поганий у Jelly lol - інший спосіб зробити це. Я маю на увазі, я міг би просто подивитися на посилання, яке Фенікс розмістив у коментарях, але оскільки я все ще вчусь, я не хочу дивитись на рішення, поки я сам не з’ясував це. Це може коштувати мені репутації, але навчання - це те, про що я тут :)))


LeakyNun зробив це в 5 в чаті: Спойлер
Павло

5
о .__________.
HyperNeutrino



3

Python 2 , 50 42 байти

Збережено 8 байт завдяки @Sisyphus!

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

Спробуйте в Інтернеті!

53 байти

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

Спробуйте в Інтернеті!


lambda l:map(sum,zip(l,[1,0,-1,0]*len(l)))для Python 2
Сизіф

Приємно, що економить 5 байт у Python 3, а потім ще 3 в Python 2. Дякую!
musicman523

3

Haskell , 26 байт

@Mego побив мене до цього рішення

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

Спробуйте в Інтернеті!

У цьому Хаскелл чудово підходить. Це оголошує безточну функцію, яка посилається на вхід з нескінченним списком.

Haskell , 56 байт

Ось рішення, яке використовує складні числа. Не дуже конкурентоспроможний через імпорт, але ніколи не дуже крутий.

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

Спробуйте в Інтернеті!


2
Еек! Ти ніндзя мене за 20 секунд!
Мего

Немає сенсу мати два однакових рішення. Оскільки ви прийняли моє вдосконалення без віднесення атрибутів і зробили наші відповіді однаковими, ви видалите свою?
Мего

3

Математика, 19 байт

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

Пояснення

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

Примітка: i=1з'являється поза функцією, що нормально за цим мета-консенсусом .


Але тоді функцію необов’язково використовувати повторно (якщо після одного виклику функції iзначення має відмінне від 1)
user202729

@ user202729 мета-консенсус, який я пов’язував, спеціально займається цим питанням. Добре оголосити глобальну змінну поза функцією.
JungHwan Min

3

J, 12 байт

+1 0 _1 0$~#

Спробуйте в Інтернеті!

Оскільки оператор форми J $заповнюється циклічно, коли ми формуємо його на довжину #введення, він робить саме те, що ми хочемо, і ми можемо просто додати його до вводу]


Ви можете зберегти байт, скинувши перший] (тобто використовуйте гачок)
Tikkanz

@Tikkanz приємний улов. я оновив публікацію.
Йона

3

C ++, 93 85 83 63 байт

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

-8 байт, завдяки цій відповіді я виявив, що параметри лямбда можуть бути, autoі ви можете передати правильний параметр, він буде працювати

-2 байти завдяки Невайю

-2 байти завдяки Захарі

Я видалив vectorвключення. Вам потрібно буде надати як аргумент контейнеру wa, який відповідає наступним умовам:

  • Майте метод, викликаний sizeбез аргументів
  • Перевантажили оператор підписки

STL контейнери , які дотримуються наступні умови є array, vector, string, map, unordered_map, і , можливо , інші

Якщо виведення зміною аргументів не дозволено, то:

C ++, 112 110 байт

#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
Ваш перший один є дійсним в / о.
Павло

1
Ви можете використовувати j%4для збереження 2 байти.
Невай

1
Я не думаю, що тобі потрібні парени j%4.
Zacharý



2

Perl 6 , 28 байт

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

Спробуйте в Інтернеті!

1+0i, * × i ... *створює нескінченний перелік чисел, 1, i, -1, -iповторених за циклом. Ці числа зашифровуються додаванням ( Z+) зі списком вхідних даних ( $_), а потім витягуються реальні компоненти отриманих складних чисел ( ».re).



2

Japt , 11 10 байт

Користується обгортанням індексу Japt.

Ë+[1TJT]gE

Перевірте це


Пояснення

Неявне введення масиву U.

Ë

Мапа через масив.

+

До поточного елемента додайте ...

gE

Елемент у поточному індексі ( E) ...

[1TJT]

У масиві [1,0,-1,0].





1

Math.JS , 34 байт

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

Пояснив

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.

Спробуйте в Інтернеті!


1

8-е , 96 63 байти

Код

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

Цей код залишає отриманий масив на TOS

Використання та приклади

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]

Пояснення

Ми використовуємо cos (x) для того, щоб отримати правильну послідовність [1,0, -1,0]. Індекс елемента масиву множиться на 90 градусів, після чого він передається функції cos (), щоб отримати бажаний "коефіцієнт хвилі", який слід додати до відповідного елемента.

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



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.