ใช้คลื่นกับอาร์เรย์


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]

นี่คือรหัสที่สั้นที่สุดชนะ!


ค่อนข้าง unexepectedly โซลูชั่นจำนวนมากมีการใช้เวทมนตร์จำนวนจินตนาการ ...
พาเวล

2
มันสมเหตุสมผลมากว่าทำไมตัวเลขในจินตนาการจึงมีประโยชน์นี่เป็นปัญหาคลื่นและตัวเลขในจินตนาการมีประวัติที่เป็นเอกสารเกี่ยวกับคุณสมบัติของขั้ว ตัวเลขในจินตนาการอาจเป็นวิธีคำนวณของไซน์และโคไซน์โดยเฉพาะอย่างยิ่งสำหรับการหมุนของเลขจำนวนเต็มชนิดเหล่านี้ คณิตศาสตร์นั้นยอดเยี่ยม ...
Wheat Wizard

3
@WheatWizard เป็นสัดส่วนที่ค่อนข้างใหญ่เนื่องจากภาษาส่วนใหญ่ไม่รองรับตัวเลขในจินตนาการ
Pavel

คำตอบ:


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
Pavel

1
คำอธิบายใด ๆ
Pureferret

1
@Pureferret ส่วนจินตภาพของอำนาจต่อเนื่องของจำนวนจินตนาการฉันจะถูกเพิ่มในแต่ละองค์ประกอบ
Cœur

@Cœurนั่นคือ1, 2, 3 ...หรือ1, 0, -1, 0 ...?
Pureferret

1
@Pureferret คำอธิบายที่เป็นคำตอบเดียวกันในMATLหรือMath.JSหรือMathematicaหรือRหรือ ...
Cœur

14

โลโก้ขนาด 18 ไบต์

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

ไม่มี "ลองออนไลน์!" ลิงก์เนื่องจากล่ามโลโก้ออนไลน์ทั้งหมดไม่สนับสนุนรายการเทมเพลต

นั่นคือรายการแม่แบบ (เทียบเท่าฟังก์ชั่นแลมบ์ดาในภาษาอื่น ๆ )

การใช้งาน:

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 คือ stil โดยใช้ sine
Pavel

1
@ ฟีนิกซ์ฉันตกใจที่ฉันไม่ได้สังเกต ...
ETHproductions

@ETHproductions และ .... Sine ได้รับการตีกอล์ฟออกมาจากคำตอบ R เกินไป ฉันคิดว่ามันทำแบบเดียวกันกับคำตอบของ Mathematica
Pavel


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)


9

Mathematica, 26 23 22 ไบต์

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

ลองออนไลน์! (Mathics)

หมายเหตุ: ลิงค์ TIO นั้นใช้สำหรับรุ่น 23- ไบต์รุ่น 22- ไบต์ไม่สามารถใช้กับ Mathics ได้


มีวิธีแก้ปัญหาแบบ 19-byte Mathematica ด้านล่าง (พร้อมการเริ่มต้น 4 ไบต์)
user202729


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 ขอขอบคุณแก้ไข
Luis Mendo

3

เยลลี่ขนาด 16 ไบต์

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

ลองออนไลน์!

ฉันแน่ใจว่านี่มันนานเกินไป

แก้ไข

ฉันรู้ว่าโซลูชัน 5 ไบต์เป็นไปได้ แต่ wifi ของฉันดูเหมือนจะเริ่มตัดฉันดังนั้นฉันจะตีกอล์ฟในวันพรุ่งนี้ หากใครบางคนโพสต์คำตอบสั้น ๆ ของเยลลี่ก่อนที่ฉันจะตีกอล์ฟได้ ฉันจะเก็บสิ่งนี้ไว้ที่นี่เพื่ออ้างอิงถึงความเลวของฉันที่ Jelly lolอีกวิธีหนึ่ง ฉันหมายถึงฉันสามารถดูได้ที่ลิงค์ Phoenix โพสต์ในความคิดเห็น แต่เนื่องจากฉันยังเรียนรู้อยู่ฉันไม่ต้องการดูวิธีแก้ปัญหาจนกว่าฉันจะหาคำตอบได้เอง สิ่งนี้อาจทำให้ฉันเสียชื่อเสียง แต่การเรียนรู้คือสิ่งที่ฉันมาที่นี่เพื่อ :)))


LeakyNun ทำมันใน 5 ในการแชท: สปอยเลอร์
พาเวล

5
โอ้ .__________
HyperNeutrino

เดนนิสเข้าใจแล้ว: codegolf.stackexchange.com/a/135145/60042
พาเวล


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
Sisyphus

เยี่ยมมากนั่นช่วยประหยัด 5 ไบต์ใน Python 3 และ 3 เพิ่มเติมใน Python 2 ขอบคุณ!
musicman523

3

Haskell , 26 ไบต์

@ Mego เอาชนะฉันเพื่อแก้ปัญหานี้

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

ลองออนไลน์!

นี่คือสิ่งที่ Haskell ทำได้ยอดเยี่ยม นี่เป็นการประกาศฟังก์ชั่นที่ไม่มีจุดที่รูดรหัสเข้ากับรายการที่ไม่มีที่สิ้นสุด

Haskell , 56 ไบต์

นี่คือวิธีแก้ปัญหาที่ใช้ตัวเลขที่ซับซ้อน ไม่ค่อยมีการแข่งขันมากนักเนื่องจากการนำเข้า แต่ไม่เคยดูเท่

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

ลองออนไลน์!


2
จี๊ด! คุณนินจาฉันโดย 20 วินาที!
Mego

ไม่มีประเด็นใดที่จะมีวิธีแก้ปัญหาสองแบบ เมื่อคุณทำการปรับปรุงโดยไม่มีการระบุแหล่งที่มาและทำให้คำตอบของเราเหมือนกันคุณจะลบของคุณออกไหม
Mego

3

Mathematica, 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 ฉันทามติ meta ฉันเชื่อมโยงข้อเสนอพิเศษกับปัญหานั้น มันโอเคที่จะประกาศตัวแปรระดับโลกนอกฟังก์ชั่น
JungHwan Min

3

J, 12 ไบต์

+1 0 _1 0$~#

ลองออนไลน์!

เนื่องจากตัวดำเนินการของ J $เติมเต็ม cyclically เมื่อเรากำหนดความยาว#ของอินพุตมันจึงทำสิ่งที่เราต้องการอย่างแน่นอนและเราสามารถเพิ่มลงในอินพุตได้]


คุณสามารถบันทึก byte โดยการปล่อยครั้งแรก] (เช่นใช้ตะขอ)
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 ไบต์ต้องขอบคุณ Nevay

-2 ไบต์ขอบคุณZacharý

ฉันลบการvectorรวม คุณจะต้องผ่านเป็นอาร์กิวเมนต์เพื่อ wa container ที่เคารพเงื่อนไขต่อไปนี้:

  • มีวิธีการที่เรียกว่า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
คนแรกของคุณเป็นผมที่ถูกต้อง / o
Pavel

1
คุณสามารถใช้j%4เพื่อบันทึก 2 ไบต์
Nevay

1
ผมไม่คิดว่าคุณต้อง parens j%4รอบ
Zacharý


2

Dyalog APL ขนาด 13 ไบต์

⊢+1 0 ¯1 0⍴⍨≢

ลองออนไลน์!

อย่างไร?

1 0 ¯1 0 - อาร์เรย์ [1, 0, -1, 0]

⍴⍨≢ - ก่อร่างใหม่ตามความยาวของอินพุตวงจร

⊢+ - ผลรวมแบบเวกเตอร์ด้วยอินพุต


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

Pyth , 11 ไบต์

.e+bss^.j)k

ลองออนไลน์!


มากับโซลูชันอื่นที่มีจำนวนไบต์เท่ากัน:.e+b@[1Z_1Z
ตบมือ

แทนที่ssด้วยeสำหรับ -1
Erik the Outgolfer

ใช้งานได้หรือไม่ .e+be^.j)kดูเหมือนจะไม่ทำงานเมื่อฉันพยายาม
deltaepsilon3


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

8th , 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
;



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.