Áp dụng sóng cho một mảng


24

Nhiệm vụ của bạn hôm nay là áp dụng một làn sóng cho một dãy số. Một làn sóng trông như thế này: [1, 0, -1, 0, 1, 0, -1, 0, 1...]Áp dụng nó vào một mảng nhất định có nghĩa là thêm các phần tử đầu tiên, các phần tử thứ hai, v.v.

Chính xác hơn:

Chương trình hoặc chức năng của bạn sẽ nhận được một loạt các số nguyên. Nó phải in hoặc trả về một mảng có kích thước bằng nhau được 1thêm vào phần tử 1, 5, 9, v.v. của mảng ban đầu, -1được thêm vào phần tử thứ 3, 7, 11, v.v. của mảng ban đầu và phần còn lại của các phần tử không bị ảnh hưởng

Mảng đầu vào được đảm bảo có ít nhất một phần tử.

Các trường hợp thử nghiệm:

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]

Đây là , mã thắng ngắn nhất!


Hơi lạ một chút, nhiều giải pháp đang sử dụng ma thuật số tưởng tượng ...
Pavel

2
Nó có ý nghĩa tốt tại sao các số ảo sẽ hữu ích, đây là một vấn đề về sóng và các số ảo có một lịch sử được ghi chép tốt về các thuộc tính cực. Các con số tưởng tượng có thể là cách khá hay để tính toán các sin và cosin, đặc biệt đối với các kiểu quay số nguyên này. Toán học thật tuyệt ...
Thuật sĩ lúa mì

3
@WheatWizard Đó là một tỷ lệ khá lớn do hầu hết các ngôn ngữ không hỗ trợ cho số ảo.
Pavel

Câu trả lời:


8

Thạch , 5 byte

Jı*Ċ+

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

Giống như những gì Leaky Nun nhận được: chat.stackexchange.com/transcript/message/38868472#38868472
Pavel

1
Có lời giải thích nào không?
Pureferret

1
@Pureferret phần tưởng tượng của các quyền hạn liên tiếp của số ảo tôi được thêm vào mỗi phần tử
Cur

@ Cur là thế 1, 2, 3 ...hay 1, 0, -1, 0 ...?
Pureferret

1
@Pureferret giải thích tương tự như câu trả lời trong MATL hoặc Math.JS hoặc Mathematica hoặc R hoặc ...
Cur

14

LOGO , 18 byte

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

Không có "Thử trực tuyến!" liên kết vì tất cả trình thông dịch LOGO trực tuyến không hỗ trợ danh sách mẫu.

Đó là một danh sách mẫu (tương đương với hàm lambda trong các ngôn ngữ khác).

Sử dụng:

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

( invokegọi hàm, prin kết quả)

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

Giải thích (đã khá dễ hiểu):

 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, tôi biết ai đó sẽ đưa ra một câu trả lời dựa trên sin.
Sản xuất ETH

2
@ETHproductions câu trả lời đầu tiên, trong Mathicala, được dựa trên Sine cho đến khi nó được đánh xuống. Câu trả lời thứ hai, trong R, là stil sử dụng sin.
Pavel

1
@Phoenix Tôi bị sốc vì tôi đã không nhận thấy ...
Sản phẩm ETH

@ETHproductions và .... Sine cũng đã bị loại khỏi câu trả lời R. Tôi nghĩ rằng nó đang làm điều tương tự như câu trả lời Mathicala.
Pavel

13

Haskell , 26 byte

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

Hãy thử trực tuyến! (chạy tất cả các trường hợp thử nghiệm)

Giải trình:

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)

Việc tính toán diễn ra như sau:

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

Bit cuối cùng lợi dụng thực tế là trong JS, một số âm khi được điều chế sẽ giữ lại dấu âm của nó (nghĩa là -5 % 3 -> -2thay vì 1như trong Python).




8

MATL , 11 8 byte

Jyn:^Yj+

Hãy thử nó tại MATL Online!

Giải trình

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]

Ừm, bạn đã quên thêm +phần giải thích
caird coinheringaahing

@cairdcoinheringaahing Cảm ơn, đã chỉnh sửa
Luis Mendo

3

Thạch , 16 byte

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

Hãy thử trực tuyến!

heh tôi chắc chắn điều này quá dài

Chỉnh sửa

Tôi biết một giải pháp 5 byte là có thể nhưng wifi của tôi dường như bắt đầu cắt đứt tôi vì vậy tôi sẽ chơi golf vào ngày mai. Nếu ai đó đăng giải pháp Jelly ngắn trước khi tôi có thể chơi golf này, điều đó tốt với tôi; Tôi sẽ chỉ giữ điều này ở đây để tham khảo về việc tôi làm việc tồi tệ như thế nào tại Jelly lol . Ý tôi là, tôi chỉ có thể nhìn vào liên kết mà Phoenix đăng trong các bình luận, nhưng vì tôi vẫn đang học, tôi không muốn xem xét giải pháp cho đến khi tôi tự mình tìm ra. Điều này có thể khiến tôi mất danh tiếng nhưng việc học là những gì tôi ở đây :)))


LeakyNun đã làm điều đó trong 5 lần trò chuyện: Spoiler
Pavel

5
Oh .__________.
HyperNeutrino




3

Haskell , 26 byte

@Mego đánh bại tôi để giải pháp này

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

Hãy thử trực tuyến!

Đây là những gì Haskell là tuyệt vời. Điều này khai báo một hàm không có điểm giúp nén đầu vào với một danh sách vô hạn.

Haskell , 56 byte

Đây là một giải pháp sử dụng số phức. Không cạnh tranh lắm vì nhập khẩu nhưng không bao giờ kém đẹp.

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

Hãy thử trực tuyến!


2
Ôi! Bạn ninja tôi 20 giây!
Mego

Không có điểm nào có hai giải pháp giống hệt nhau. Vì bạn đã thực hiện cải tiến của tôi mà không có sự ghi nhận và làm cho câu trả lời của chúng tôi giống hệt nhau, bạn sẽ xóa câu trả lời của bạn chứ?
Mego

3

Toán học, 19 byte

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

Giải trình

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

Lưu ý: i=1xuất hiện bên ngoài chức năng, điều này ổn đối với sự đồng thuận meta này .


Nhưng sau đó, chức năng này không nhất thiết có thể tái sử dụng (nếu sau một cuộc gọi của chức năng icó giá trị khác với 1)
user202729

@ user202729 sự đồng thuận meta mà tôi liên kết cụ thể liên quan đến vấn đề đó. Bạn có thể khai báo một biến toàn cục bên ngoài hàm.
JungHwan Min

3

J, 12 byte

+1 0 _1 0$~#

Hãy thử trực tuyến!

Bởi vì toán tử hình dạng của J $điền theo chu kỳ, khi chúng ta định hình nó theo chiều dài #của đầu vào, nó thực hiện chính xác những gì chúng ta muốn và chúng ta có thể thêm nó vào đầu vào]


Bạn có thể lưu một byte bằng cách thả cái đầu tiên] (tức là sử dụng một cái móc)
Tikkanz

@Tikkanz bắt đẹp. Tôi đã cập nhật bài viết.
Giô-na

3

C ++, 93 85 83 63 byte

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

-8 byte, nhờ câu trả lời này , tôi phát hiện ra rằng các tham số lambda có thể autovà bạn có thể vượt qua với tham số chính xác, nó sẽ hoạt động

-2 byte nhờ Nevay

-2 byte nhờ Zacharý

Tôi loại bỏ vectorbao gồm. Bạn sẽ cần chuyển làm đối số cho wa container tôn trọng các điều kiện sau:

  • Có một phương thức được gọi sizemà không có đối số
  • Đã quá tải toán tử đăng ký

Container STL rằng tôn trọng các điều kiện sau array, vector, string, map, unordered_map, và có lẽ những người khác

Nếu đầu ra bằng cách sửa đổi đối số đối số không được phép, thì:

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
Cái đầu tiên của bạn hợp lệ i / o.
Pavel

1
Bạn có thể sử dụng j%4để lưu 2 byte.
Nevay

1
Tôi không nghĩ rằng bạn cần parens xung quanh j%4.
Zacharý


2

APL Dyalog, 13 byte

⊢+1 0 ¯1 0⍴⍨≢

Hãy thử trực tuyến!

Làm sao?

1 0 ¯1 0 - mảng [1, 0, -1, 0]

⍴⍨≢ - định hình lại theo chiều dài của đầu vào, theo chu kỳ

⊢+ - Tổng hợp véc tơ với đầu vào


2

Perl 6 , 28 byte

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

Hãy thử trực tuyến!

1+0i, * × i ... *tạo ra một danh sách vô hạn các số được 1, i, -1, -ilặp lại trong một chu kỳ. Các số đó được nén bằng phép cộng ( Z+) với danh sách đầu vào ( $_) và sau đó các thành phần thực của các số phức kết quả được trích xuất ( ».re).



2

Japt , 11 10 byte

Tận dụng lợi thế của gói chỉ số của Japt.

Ë+[1TJT]gE

Kiểm tra nó


Giải trình

Đầu vào ngầm định của mảng U.

Ë

Bản đồ trên mảng.

+

Để phần tử hiện tại thêm ...

gE

Phần tử tại chỉ mục hiện tại ( E) ...

[1TJT]

Trong mảng [1,0,-1,0].


1

Trên thực tế , 11 byte

;r⌠╦½*C≈⌡M¥

Hãy thử trực tuyến!(chạy tất cả các trường hợp thử nghiệm)

Giải trình:

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

Giải thích

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.

Hãy thử trực tuyến!


1

8 , 96 63 byte

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

Mã này để lại mảng kết quả trên ĐKDV

Cách sử dụng và ví dụ

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]

Giải trình

Chúng tôi sử dụng cos (x) để có được chuỗi đúng [1,0, -1,0]. Chỉ số của mỗi phần tử mảng được nhân với 90 độ và sau đó nó được chuyển đến hàm cos () để có được "hệ số sóng" mong muốn được thêm vào mục tương ứng.

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



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.