Zastosuj falę do tablicy


24

Twoim zadaniem dzisiaj jest zastosowanie fali do szeregu liczb. Fala wygląda następująco: [1, 0, -1, 0, 1, 0, -1, 0, 1...]zastosowanie jej do danej tablicy oznacza zsumowanie pierwszych elementów, drugich elementów itp.

Dokładniej:

Twój program lub funkcja otrzyma tablicę liczb całkowitych. Musi wydrukować lub zwrócić tablicę o równej wielkości z 1dodanym do pierwszego, piątego, dziewiątego itd. Elementu oryginalnej tablicy, -1dodanym do trzeciego, siódmego, 11., itd. Elementu oryginalnej tablicy i pozostałych elementów powinny pozostać nietknięte.

Tablica wejściowa ma co najmniej jeden element.

Przypadki testowe:

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]

To jest , wygrywa najkrótszy kod!


Trochę nieoczekiwanie wiele rozwiązań używa magii liczb urojonej ...
Pavel

2
Sensowne jest, dlaczego liczby urojone byłyby przydatne, jest to problem falowy, a liczby urojone mają dobrze udokumentowaną historię właściwości polarnych. Wyimaginowane liczby mogą być dość golfistycznym sposobem obliczania sinusów i cosinusów, szczególnie w przypadku tego rodzaju obrotów w liczbach całkowitych. Matematyka jest fajna ...
Wheat Wizard

3
@WheatWizard To dość duży odsetek, biorąc pod uwagę, że większość języków nie obsługuje wyimaginowanych liczb.
Pavel

Odpowiedzi:


8

Galaretka , 5 bajtów

Jı*Ċ+

Wypróbuj online!

Jak to działa

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
Jakieś wyjaśnienie?
Pureferret

1
@Pureferret wyimaginowana część kolejnych mocy urojonej liczby i jest dodawana do każdego elementu
Cœur

@ Cœur jest to 1, 2, 3 ...czy 1, 0, -1, 0 ...?
Pureferret,

1
@Pureferret to samo wyjaśnienie, co odpowiedź w MATL lub Math.JS lub Mathematica lub R lub ...
Cœur

14

LOGO , 18 bajtów

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

Nie ma „Wypróbuj online!” link, ponieważ wszystkie internetowe interpretery LOGO nie obsługują listy szablonów.

To jest lista szablonów (odpowiednik funkcji lambda w innych językach).

Stosowanie:

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

( invokewywołuje funkcję, prdrukuje wynik)

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

Objaśnienie (już dość zrozumiałe):

 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, wiedziałem, że ktoś wymyśli odpowiedź sinusoidalną.
ETHprodukcje

2
@ETHproductions pierwsza odpowiedź, w Mathematica, była oparta na Sine, dopóki nie została rozegrana w golfa. Druga odpowiedź, w R, to stil przy użyciu sinusa.
Pavel

1
@Phoenix Jestem zszokowany, że nie zauważyłem ...
ETHprodukcje

@ETHproductions i .... Sine również grał w golfa z odpowiedzi R. Myślę, że robi to samo co odpowiedź Mathematica.
Pavel

13

Haskell , 26 bajtów

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

Wypróbuj online! (uruchamia wszystkie przypadki testowe)

Wyjaśnienie:

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 bajtów

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

Obliczenia wyglądają następująco:

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

Ostatni bit wykorzystujący fakt, że w JS liczba ujemna po zmodulowaniu zachowuje swój znak ujemny (tj. -5 % 3 -> -2Zamiast 1jak w Pythonie).


9

Mathematica, 26 23 22 bajtów

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

Wypróbuj online! (Matematyka)

Uwaga: Łącze TIO dotyczy wersji 23-bajtowej, wersja 22-bajtowa nie jest kompatybilna z Mathics.


Poniżej znajduje się 19-bajtowe rozwiązanie Mathematica (z 4 bajtami inicjalizacji)
user202729,


8

MATL , 11 8 bajtów

Jyn:^Yj+

Wypróbuj w MATL Online!

Wyjaśnienie

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, zapomniałeś dodać +wyjaśnienia
Cairney Coheringaahing

@cairdcoinheringaahing Dzięki, edytowano
Luis Mendo,

3

Galaretka , 16 bajtów

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

Wypróbuj online!

heh jestem pewien, że to za długo

Edytować

Wiem, że możliwe jest rozwiązanie 5-bajtowe, ale moje Wi-Fi zaczyna mnie odcinać, więc jutro zagram w golfa. Jeśli ktoś opublikuje krótkie rozwiązanie Jelly, zanim będę mógł zagrać w golfa, nie mam nic przeciwko; Zatrzymam to tutaj w celach informacyjnych, jak źle jestem w Jelly lol, inny sposób na zrobienie tego. To znaczy, ja mógł tylko patrzeć na link Phoenix pisał w komentarzach, ale ponieważ wciąż się uczę, nie chcę patrzeć na rozwiązania, dopóki nie zorientowaliśmy się sam. Może to kosztować mnie reputację, ale po to tu jestem :)))


LeakyNun zrobił to na 5 w czacie: Spoiler
Pavel

5
och .__________.
HyperNeutrino,



3

Python 2 , 50 42 bajtów

Zaoszczędź 8 bajtów dzięki @Sisyphus!

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

Wypróbuj online!

53 bajty

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

Wypróbuj online!


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

Fajnie, że pozwala zaoszczędzić 5 bajtów w Pythonie 3, a następnie kolejne 3 w Pythonie 2. Dzięki!
musicman523,

3

Haskell , 26 bajtów

@Mego pobiło mnie do tego rozwiązania

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

Wypróbuj online!

W tym Haskell jest świetny. To deklaruje funkcję bez punktów, która zamyka wejście nieskończoną listą.

Haskell , 56 bajtów

Oto rozwiązanie wykorzystujące liczby zespolone. Nie bardzo konkurencyjny ze względu na import, ale nigdy nie mniej fajny.

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

Wypróbuj online!


2
Eek! Ninja'd mnie o 20 sekund!
Mego

Nie ma sensu mieć dwóch identycznych rozwiązań. Skoro wziąłeś moją poprawę bez przypisywania i ujednoliciłeś nasze odpowiedzi, czy usunąłbyś swoją?
Mego

3

Mathematica, 19 bajtów

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

Wyjaśnienie

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

Uwaga: i=1pojawia się poza funkcją, co jest zgodne z tym meta konsensusem .


Ale wtedy funkcja niekoniecznie musi być wielokrotnego użytku (jeśli po jednym wywołaniu funkcji ima wartość inną niż 1)
user202729

@ user202729 meta konsensus, który podłączyłem, dotyczy konkretnie tego problemu. Można zadeklarować zmienną globalną poza funkcją.
JungHwan Min

3

J, 12 bajtów

+1 0 _1 0$~#

Wypróbuj online!

Ponieważ operator kształtu J $wypełnia się cyklicznie, kiedy kształtujemy go do długości #danych wejściowych, robi dokładnie to, co chcemy, i możemy po prostu dodać go do danych wejściowych]


Możesz zapisać bajt, upuszczając pierwszy] (tzn. Użyj haka)
Tikkanz

@Tikkanz nice catch. zaktualizowałem post.
Jonah,

3

C ++, 93 85 83 63 bajty

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

-8 bajtów, dzięki tej odpowiedzi odkryłem, że parametry lambda mogą być autoi możesz podać poprawny parametr, zadziała

-2 bajty dzięki Nevay

-2 bajty dzięki Zacharýowi

Usunąłem vectordołączenie. Musisz podać jako argument, aby kontener spełniający następujące warunki:

  • Wywołaj metodę sizebez argumentów
  • Przeładowałem operator indeksu dolnego

Kontenery STL, które przestrzegają następujących warunków array, vector, string, map, unordered_map, a może inni

Jeśli wyprowadzanie przez modyfikację argumentów nie jest dozwolone, wówczas:

C ++, 112 110 bajtów

#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
Twój pierwszy jest prawidłowy we / wy.
Pavel

1
Możesz użyć, j%4aby zapisać 2 bajty.
Nevay,

1
Nie sądzę, żebyś potrzebował parens j%4.
Zacharý


2

Dyalog APL, 13 bajtów

⊢+1 0 ¯1 0⍴⍨≢

Wypróbuj online!

W jaki sposób?

1 0 ¯1 0 - tablica [1, 0, -1, 0]

⍴⍨≢ - zmienić kształt na długość wejścia, cyklicznie

⊢+ - wektoryzowana suma z danymi wejściowymi


2

Perl 6 , 28 bajtów

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

Wypróbuj online!

1+0i, * × i ... *tworzy nieskończoną listę liczb 1, i, -1, -ipowtarzanych w cyklu. Liczby te są spakowane za pomocą funkcji add ( Z+) za pomocą listy danych wejściowych ( $_), a następnie wyodrębniane są rzeczywiste składniki wynikowych liczb zespolonych ( ».re).



2

Japt , 11 10 bajtów

Korzysta z owijania indeksu Japt.

Ë+[1TJT]gE

Sprawdź to


Wyjaśnienie

Domniemane wejście tablicy U.

Ë

Odwzoruj na tablicy.

+

Do bieżącego elementu dodaj ...

gE

Element o bieżącym indeksie ( E) ...

[1TJT]

W tablicy [1,0,-1,0].


1

Właściwie 11 bajtów

;r⌠╦½*C≈⌡M¥

Wypróbuj online! (uruchamia wszystkie przypadki testowe)

Wyjaśnienie:

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

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

Wyjaśnił

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.

Wypróbuj online!


1

8th , 96 63 bajtów

Kod

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

Ten kod pozostawia wynikową tablicę w TOS

Zastosowanie i przykłady

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]

Wyjaśnienie

Używamy cos (x), aby uzyskać odpowiednią sekwencję [1,0, -1,0]. Indeks każdego elementu tablicy jest mnożony przez 90 stopni, a następnie przekazywany do funkcji cos () w celu uzyskania żądanego „współczynnika fali”, który zostanie dodany do odpowiedniego elementu.

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



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.