Diziye bir dalga uygulama


24

Bugün sizin göreviniz bir sayı dizisine bir dalga uygulamak. Bir dalga şuna benzer: [1, 0, -1, 0, 1, 0, -1, 0, 1...]Belirli bir diziye uygulamak, ilk öğeleri, ikinci öğeleri vb. Birleştirmek demektir.

Daha kesin:

Programınız veya işleviniz bir tamsayı dizisi alır. Bu yazdırmak veya bir eşit büyüklükte dizi döndürmesi gerekir 1vs. 1., 5., 9., orijinal dizi öğesi eklenir -1vb 3, 7, 11 eklenen orijinal dizinin eleman ve geri kalan öğelerinin dokunulmadan bırakılmalıdır.

Giriş dizisinin en az bir elemana sahip olması garanti edilir.

Test durumları:

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]

Bu , en kısa kod kazanır!


Beklenmedik bir şekilde, birçok çözüm hayali sayı büyü kullanıyor ...
Pavel

2
Bu, hayali sayıların neden faydalı olacağı konusunda oldukça mantıklıdır, bu bir dalga problemidir ve hayali sayıların iyi belgelenmiş bir kutupsal özellik geçmişi vardır. Hayali sayılar, özellikle bu tam sayı çeyrek turları için sinüs ve kosinüslerin hesaplanmasında oldukça başarılı olabilir. Matematik havalı ...
Buğday Sihirbazı

3
@WheatWizard Çoğu dilin hayali sayıları desteklemediği göz önüne alındığında oldukça büyük bir orandır.
Pavel,

Yanıtlar:


8

Jöle , 5 bayt

Jı*Ċ+

Çevrimiçi deneyin!

Nasıl çalışır

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.

Sızdıran Rahibe'nin
Pavel

1
Bir açıklaması var mı?
Pureferret

1
Hayali sayının ardışık güçlerin hayali bölümünü @Pureferret i her öğe eklenir
Coeur

@ Coeur olduğunu 1, 2, 3 ...ya da 1, 0, -1, 0 ...?
Pureferret

1
İçinde cevap olarak aynı açıklama @Pureferret Matl veya Math.JS veya Mathematica veya R ... ya
Coeur

14

LOGO , 18 bayt

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

"Çevrimiçi deneyin!" Yok. çünkü tüm çevrimiçi LOGO yorumlayıcısı şablon listesini desteklememektedir.

Bu bir şablon listesidir (diğer dillerde lambda işlevinin eşdeğeri).

Kullanımı:

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

( invokeişlevi çağırır pr, sonucu yazdırır)

yazdırır [-3 3 -1 1 8 9 7 -2 12 -88].

Açıklama (zaten oldukça anlaşılabilir):

 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, birisinin sinüs bazlı bir cevap bulacağını biliyordum.
ETHproductions

2
@ETHproductions ilk cevap, Mathematica'da, golf atılıncaya kadar Sine'ye dayanıyordu. R'deki ikinci cevap sinüs kullanan stildir.
Pavel,

1
@Phoenix Farketmediğim için şok oldum ...
ETHproductions

@ETHproductions and .... Sine de R cevabı dışında golf oynuyor. Bence Mathematica cevabıyla aynı şeyi yapıyor.
Pavel,

13

Haskell , 26 bayt

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

Çevrimiçi deneyin! (tüm test durumlarını çalıştırır)

Açıklama:

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 bayt

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

Hesaplama şöyle devam eder:

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

JS, modüle negatif bir sayı (yani onun eksi işareti koruyacaktır gerçeğinin son bit alma avantajı -5 % 3 -> -2yerine, 1Python diliyle olacağı gibi).


9

Mathematica, 26 23 22 bayt

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

Çevrimiçi deneyin! (Mathics)

Not: TIO bağlantısı 23 baytlık versiyon içindir, 22 baytlık versiyon matematiksel değildir.


Aşağıda 19 baytlık bir Mathematica çözümü var (başlatma işleminin 4 baytı ile)
user202729


8

MATL , 11 8 bayt

Jyn:^Yj+

MATL Online'da deneyin !

açıklama

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]

+Açıklamaya eklemeyi unuttun
caird coinheringaahing

@cairdcoinheringaahing Düzenlendi, düzenlendi
Luis Mendo

3

Jöle , 16 bayt

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

Çevrimiçi deneyin!

heh eminim bu çok uzun

Düzenle

5 baytlık bir çözümün mümkün olduğunu biliyorum ama wifi'um beni kesmeye başlıyor gibi görünüyor, bu yüzden bu yarın golf oynayacağım. Bunu yapmadan önce biri kısa Jelly çözümünü gönderirse, bu benim için sorun değil; Jelly Jol'da ne kadar kötüyüm , bunu yapmanın başka bir yolu olarak atıfta bulunmak için burada tutacağım . Yani, Ben olabilirdi sadece Phoenix yorumlarda haberi bağlantı bakmak, ama hala öğreniyorum beri, ben kendim çözdüm kadar çözümü bakmak istemiyorum. Bu bana itibara mal olabilir ama öğrenme bunun için buradayım :)))


LeakyNun 5 sohbette yaptı: Spoiler
Pavel

5
oh .__________.
HyperNeutrino




3

Haskell , 26 bayt

@Mego beni bu çözüme ulaştı

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

Çevrimiçi deneyin!

Haskell'in harika olduğu şey bu. Bu, girişi sonsuz bir liste ile fermuarlayan noktadan bağımsız bir işlev bildirir.

Haskell , 56 bayt

İşte karmaşık sayıları kullanan bir çözüm. İthalat nedeniyle çok rekabetçi değil, ancak hiçbir zaman daha az havalı değil.

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

Çevrimiçi deneyin!


2
Eek! Beni 20 saniye boyunca ninja!
Mego

İki özdeş çözüme sahip olmanın anlamı yok. Gelişmelerimi atıfta bulunmadan yaptığınız ve cevaplarımızı özdeşleştirdiğiniz için sizinkini siler misiniz?
Mego

3

Mathematica, 19 bayt

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

açıklama

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

Not: Bu meta konsensüsi=1 için tamam olan fonksiyonun dışında görünür .


Ama sonra işlev mutlaka yeniden değildir (eğer fonksiyon bir çağrı sonra i1 den değer diğerlerinden farkı vardır)
user202729

@ user202729 Bağladığım meta konsensüs özellikle bu konuyla ilgileniyor. Bir fonksiyonun dışında global bir değişken bildirmek sorun değil.
JungHwan Min,

3

J, 12 bayt

+1 0 _1 0$~#

Çevrimiçi deneyin!

J'nin şekil operatörü $döngüsel olarak doldurduğu için #, onu girişin uzunluğuna göre biçimlendirdiğimizde , tam olarak istediğimiz şeyi yapar ve girişi sadece ekleyebiliriz]


İlk bırakarak bir bayt kaydedebilirsiniz] (yani bir kanca kullanın)
Tikkanz

@Tikkanz güzel yakaladı. yazıyı güncelledim.
Jonah

3

C ++, 93 85 83 63 bayt

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

-8 bayt, bu cevap sayesinde lambda parametrelerinin olabileceğini autove doğru parametre ile geçebileceğinizi keşfettim , çalışacak

Nevay sayesinde -2 bayt

Zacharý sayesinde -2 bayt

İçeriği kaldırdım vector. Aşağıdaki koşullara uyan wa konteynerine argüman olarak geçmeniz gerekir:

  • sizeArgüman olmadan çağrılan bir yöntem var
  • Abonelik operatörünü aşırı yükledi

Aşağıdaki koşulları saygı STL Konteynerleri vardır array, vector, string, map, unordered_map, ve belki diğerleri

Argümanları değiştirerek çıktı almak için argümanlara izin verilmiyorsa, o zaman:

C ++, 112 110 bayt

#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
İlk bir olan geçerli g / ç.
Pavel,

1
j%42 bayt kaydetmek için kullanabilirsiniz .
Nevay

1
Etrafta parka ihtiyacın olduğunu sanmıyorum j%4.
Zacharý


2

Dyalog APL, 13 bayt

⊢+1 0 ¯1 0⍴⍨≢

Çevrimiçi deneyin!

Nasıl?

1 0 ¯1 0 - dizi [1, 0, -1, 0]

⍴⍨≢ - girişin uzunluğuna göre yeniden şekillendirme, döngüsel

⊢+ - giriş ile vectorized toplamı


2

Perl 6 , 28 bayt

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

Çevrimiçi deneyin!

1+0i, * × i ... *1, i, -1, -ibir döngüde tekrarlanan sayıların sonsuz bir listesini üretir . Bu sayılar Z+giriş listesi ( $_) ile toplama ( ) ile sıkıştırılır ve daha sonra ortaya çıkan karmaşık sayıların gerçek bileşenleri çıkartılır ( ».re).



2

Japt , 11 10 bayt

Japt'in endeks sarmaından faydalanır.

Ë+[1TJT]gE

Dene


açıklama

Dizinin örtük girişi U.

Ë

Dizinin üzerinde eşleyin.

+

Geçerli öğeye ekle ...

gE

Geçerli dizindeki öğe ( E) ...

[1TJT]

Dizide [1,0,-1,0].


1

Aslında , 11 bayt

;r⌠╦½*C≈⌡M¥

Çevrimiçi deneyin! (tüm test durumlarını çalıştırır)

Açıklama:

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

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

Açıklaması

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.

Çevrimiçi Deneyin!


1

8 , 96 63 bayt

kod

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

Bu kod sonuç dizisini TOS'ta bırakır

Kullanım ve örnekler

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]

açıklama

Cos'u (x) doğru sıralamayı elde etmek için kullanıyoruz [1,0, -1,0]. Her dizi elemanının indeksi 90 derece ile çarpılır ve sonra karşılık gelen maddeye eklenmesini istenen "dalga faktörü" nün elde edilmesi için cos () fonksiyonuna geçirilir.

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



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.