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!

Pavel
sumber
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.
Dennis
sumber
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
pengguna202729
sumber
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
Mego
sumber
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).

Produksi ETH
sumber
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.

pengguna202729
sumber
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]
Luis Mendo
sumber
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 :)))

HyperNeutrino
sumber
LeakyNun melakukannya di 5 dalam obrolan: Spoiler
Pavel
5
oh .__________.
HyperNeutrino
Dennis mendapatkannya: codegolf.stackexchange.com/a/135145/60042
Pavel
3

Python 2 , 50 42 byte

Disimpan 8 byte berkat @Sisyphus!

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

Cobalah online!

53 byte

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

Cobalah online!

musicman523
sumber
lambda l:map(sum,zip(l,[1,0,-1,0]*len(l)))untuk Python 2
Sisyphus
Bagus, itu menghemat 5 byte di Python 3 dan kemudian 3 lagi di Python 2. Terima kasih!
musicman523
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!

Wisaya Gandum
sumber
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 .

JungHwan Min
sumber
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]

Jonah
sumber
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;}
HatsuPointerKun
sumber
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

Uriel
sumber
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).

Sean
sumber
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].

Shaggy
sumber
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
Mego
sumber
1

Pyth , 11 byte

.e+bss^.j)k

Cobalah online!

deltaepsilon3
sumber
Datang dengan solusi lain dengan jumlah byte yang sama:.e+b@[1Z_1Z
bertepuk
Ganti ssdengan euntuk -1.
Erik the Outgolfer
Apakah itu bekerja? .e+be^.j)ksepertinya tidak berfungsi ketika saya mencobanya.
deltaepsilon3
1

CJam , 15 byte

l~_,,[1TW0]f=.+

Cobalah online!

Erik the Outgolfer
sumber
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!

ATaco
sumber
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
;
Kekacauan Manor
sumber
1

C # (.NET Core) , 50 byte

n=>{for(int i=0;i<n.Length;i+=2)n[i]+=i%4<1?1:-1;}

Cobalah online!

Menggunakan lambda sederhana. Memodifikasi array asli dan mengembalikan output melalui referensi.

jkelm
sumber
1

05AB1E , 16 byte

vy3L2.SR0¸«Nè+})

Cobalah online!


3L2.SR0¸«adalah hal terpendek yang dapat saya pikirkan untuk sin(x % 4)di 05AB1E.

Guci Gurita Ajaib
sumber