Terapkan wave ke array


24

Tugas Anda hari ini adalah menerapkan gelombang ke array angka. Gelombang terlihat seperti ini: [1, 0, -1, 0, 1, 0, -1, 0, 1...]Menerapkannya ke array yang diberikan berarti menambahkan bersama elemen pertama, elemen kedua, dll.

Lebih tepatnya:

Program atau fungsi Anda akan menerima array bilangan bulat. Ini harus mencetak atau mengembalikan array berukuran sama dengan 1ditambahkan ke elemen 1, 5, 9, dll. Dari array asli, -1ditambahkan ke elemen ke-3, 7, 11, dll. Dari array asli, dan sisa elemen harus dibiarkan tidak tersentuh.

Array input dijamin memiliki setidaknya satu elemen.

Kasus uji:

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]

Ini , kode terpendek menang!


Agak tidak terduga, banyak solusi menggunakan sihir angka imajiner ...
Pavel

2
Sangat masuk akal mengapa bilangan imajiner akan berguna, ini adalah masalah gelombang dan bilangan imajiner memiliki sejarah sifat kutub yang terdokumentasi dengan baik. Angka imajiner dapat menjadi cara yang sangat mudah untuk menghitung sinus dan cosinus terutama untuk jenis rotasi seperempat bilangan bulat ini. Matematika itu keren ...
Wheat Wizard

3
@WheatWizard Ini adalah proporsi yang cukup besar mengingat sebagian besar bahasa tidak memiliki dukungan untuk angka imajiner.
Pavel

Jawaban:


8

Jelly , 5 byte

Jı*Ċ+

Cobalah online!

Bagaimana itu bekerja

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.

Sama seperti yang didapatkan Leaky Nun: chat.stackexchange.com/transcript/message/38868472#38868472
Pavel

1
Ada penjelasan?
Pureferret

1
@ Pureferret bagian imajiner dari kekuatan nomor imajiner berturut-turut saya ditambahkan ke setiap elemen
Cœur

@ Cœur apakah itu 1, 2, 3 ...atau 1, 0, -1, 0 ...?
Pureferret

1
@ Pureferret penjelasan yang sama dengan jawaban dalam MATL atau Math.JS atau Mathematica atau R atau ...
Cœur

14

LOGO , 18 byte

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

Tidak ada "Coba online!" tautan karena semua penerjemah LOGO online tidak mendukung daftar templat.

Itu adalah daftar template (setara dengan fungsi lambda dalam bahasa lain).

Pemakaian:

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

( invokememanggil fungsi, prmencetak hasilnya)

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

Penjelasan (sudah cukup dimengerti):

 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, saya tahu seseorang akan datang dengan jawaban berbasis sinus.
ETHproduk

2
@ ETHproductions, jawaban pertama, di Mathematica, didasarkan pada Sine sampai golf. Jawaban kedua, dalam R, adalah stil menggunakan sinus.
Pavel

1
@Phoenix Saya terkejut bahwa saya tidak memperhatikan ...
ETHproduksi

@ ETHproductions dan .... Sine telah di- golf -kan dari jawaban R juga. Saya pikir itu melakukan hal yang sama dengan jawaban Mathematica.
Pavel

13

Haskell , 26 byte

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

Cobalah online! (menjalankan semua kasus uji)

Penjelasan:

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)

Perhitungannya seperti ini:

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

Bit terakhir mengambil keuntungan dari fakta bahwa di JS, angka negatif ketika dimodulasi akan mempertahankan tanda negatifnya (yaitu -5 % 3 -> -2, alih-alih 1seperti dalam Python).


9

Mathematica, 26 23 22 byte

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

Cobalah online! (Matematika)

Catatan: TIO link untuk versi 23-byte, versi 22-byte tidak kompatibel dengan Matematika.


Ada solusi Mathematica 19-byte di bawah ini (dengan inisialisasi 4 byte)
user202729


8

MATL , 11 8 byte

Jyn:^Yj+

Cobalah di MATL Online!

Penjelasan

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, Anda lupa menambahkan +penjelasannya
caird coinheringaahing

@cairdcoinheringaahing Terima kasih, diedit
Luis Mendo

3

Jelly , 16 byte

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

Cobalah online!

heh saya yakin ini terlalu panjang

Edit

Saya tahu solusi 5 byte mungkin tetapi wifi saya tampaknya mulai memotong saya jadi saya akan bermain golf besok. Jika seseorang memposting solusi Jelly singkat sebelum saya bisa bermain golf ini, itu tidak masalah bagi saya; Saya hanya akan menyimpan ini di sini untuk referensi seberapa buruk saya di Jelly lol cara lain untuk melakukannya. Maksudku, aku bisa melihat tautan yang diposting Phoenix di komentar, tapi karena aku masih belajar, aku tidak ingin melihat solusinya sampai aku sendiri yang menemukannya. Ini mungkin membuat saya kehilangan reputasi, tetapi belajarlah untuk saya di sini :)))


LeakyNun melakukannya di 5 dalam obrolan: Spoiler
Pavel

5
oh .__________.
HyperNeutrino




3

Haskell , 26 byte

@Mego mengalahkan saya ke solusi ini

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

Cobalah online!

Inilah yang hebat dari Haskell. Ini menyatakan fungsi point-free yang mem-zip input dengan daftar yang tak terbatas.

Haskell , 56 byte

Inilah solusi yang menggunakan bilangan kompleks. Tidak terlalu kompetitif karena impor tetapi tidak pernah kurang keren.

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

Cobalah online!


2
Eek! Anda ninja saya 20 detik!
Mego

Tidak ada gunanya memiliki dua solusi yang identik. Karena Anda mengambil peningkatan saya tanpa atribusi dan menjadikan jawaban kami identik, apakah Anda akan menghapus jawaban Anda?
Mego

3

Mathematica, 19 byte

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

Penjelasan

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

Catatan: i=1muncul di luar fungsi, yang tidak apa-apa per konsensus meta ini .


Tetapi kemudian fungsi tersebut tidak selalu dapat digunakan kembali (jika setelah satu panggilan fungsi imemiliki nilai yang berbeda dari 1)
user202729

@ user202729 konsensus meta yang saya tautkan secara khusus berkaitan dengan masalah itu. Tidak masalah untuk mendeklarasikan variabel global di luar fungsi.
JungHwan Min

3

J, 12 byte

+1 0 _1 0$~#

Cobalah online!

Karena operator bentuk J $mengisi secara siklikal, ketika kita membentuknya sesuai panjang #input, ia melakukan apa yang kita inginkan, dan kita bisa menambahkannya ke input]


Anda dapat menyimpan byte dengan menjatuhkan yang pertama] (yaitu, gunakan kail)
Tikkanz

@Tikkanz tangkapan yang bagus. saya telah memperbarui pos.
Jonah

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 byte, berkat jawaban ini , saya menemukan bahwa parameter lambda dapat autodan Anda dapat lulus dengan parameter yang benar, ini akan berfungsi

-2 byte terima kasih kepada Nevay

-2 byte terima kasih kepada Zacharý

Saya menghapus vectortermasuk. Anda harus memberikan argumen kepada wadah yang memenuhi ketentuan berikut:

  • Minta metode yang dipanggil sizetanpa argumen
  • Telah membebani operator subskrip

Kontainer STL yang menghormati kondisi berikut array, vector, string, map, unordered_map, dan mungkin orang lain

Jika mengeluarkan dengan memodifikasi argumen tidak diperbolehkan, maka:

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
Pertama Anda adalah valid i / o.
Pavel

1
Anda dapat menggunakan j%4untuk menyimpan 2 byte.
Nevay

1
Saya tidak berpikir Anda perlu orang tua di sekitar j%4.
Zacharý


2

Dyalog APL, 13 byte

⊢+1 0 ¯1 0⍴⍨≢

Cobalah online!

Bagaimana?

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

⍴⍨≢ - membentuk kembali panjang input, siklik

⊢+ - penjumlahan vektor dengan input


2

Perl 6 , 28 byte

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

Cobalah online!

1+0i, * × i ... *menghasilkan daftar angka tak terbatas yang 1, i, -1, -idiulang dalam satu siklus. Angka-angka tersebut dizip dengan penambahan ( Z+) dengan daftar input ( $_), dan kemudian komponen nyata dari bilangan kompleks yang dihasilkan diekstraksi ( ».re).



2

Japt , 11 , 10 byte

Mengambil keuntungan dari pembungkus indeks Japt.

Ë+[1TJT]gE

Menguji


Penjelasan

Input array secara implisit U.

Ë

Peta di atas larik.

+

Untuk elemen saat ini tambahkan ...

gE

Elemen pada indeks saat ini ( E) ...

[1TJT]

Dalam array [1,0,-1,0].


1

Sebenarnya , 11 byte

;r⌠╦½*C≈⌡M¥

Cobalah online! (menjalankan semua kasus uji)

Penjelasan:

;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]))

Dijelaskan

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.

Cobalah secara Online!


1

8 , 96 63 byte

Kode

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

Kode ini meninggalkan array yang dihasilkan pada TOS

Penggunaan dan contoh

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]

Penjelasan

Kami menggunakan cos (x) untuk mendapatkan urutan yang benar [1,0, -1,0]. Setiap indeks elemen array dikalikan 90 derajat dan kemudian diteruskan ke fungsi cos () untuk mendapatkan "faktor gelombang" yang diinginkan untuk ditambahkan ke item yang sesuai.

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



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.