배열에 웨이브를 적용


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]

이것은 , 최단 코드 승리입니다!


어쨌든 많은 솔루션들이 허수 마법을 사용하고 있습니다.
Pavel

2
허수가 유용한 이유를 이해하는 것은 상당히 합리적입니다. 이것은 물결 문제이며 허수에는 잘 기록 된 극좌표 특성 이력이 있습니다. 허수와 코사인을 계산하는 가상의 수는 이러한 정수 정수 회전의 경우 특히 골치 거리가 될 수 있습니다. 수학은 멋지다 ...
밀 마법사

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.


1
어떤 설명?
Pureferret

1
@Pureferret 허수 i 의 연속 된 거듭 제곱의 허수 부분이 각 요소에 추가됩니다.
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

Hah, 나는 누군가 사인을 기반으로 대답 할 것이라는 것을 알고 있었다.
ETHproductions

2
@ETHproductions Mathematica의 첫 번째 답변은 Sine을 기반으로 골프를 치기 전까지였습니다. R의 두 번째 대답은 사인을 사용하여 여전히 정답입니다.
Pavel

1
@Phoenix 나는 눈치 채지 못해서 충격을 받았습니다 ...
ETHproductions

@ETHproductions and .... 사인도 R 답변에서 골프를 쳤다. 나는 그것이 Mathematica 답변과 같은 일을하고 있다고 생각합니다.
Pavel

13

하스켈 , 26 바이트

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

온라인으로 사용해보십시오! (모든 테스트 사례를 실행)

설명:

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

자바 스크립트 (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파이썬 에서와는 달리).


9

Mathematica, 26 23 22 바이트

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

온라인으로 사용해보십시오! (수학)

참고 : TIO 링크는 23 바이트 버전 용이며 22 바이트 버전은 Mathics와 호환되지 않습니다.


아래에 19 바이트 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 바이트 솔루션이 가능하다는 것을 알고 있지만 내 와이파이가 나를 차단하기 시작한 것으로 보이므로 내일 골프를 할 것이다. 골프를하기 전에 누군가가 짧은 젤리 솔루션을 게시한다면 그것은 괜찮습니다. 나는 젤리 롤에서 얼마나 나쁜지에 대한 참고로 이것을 여기에 보관할 것입니다. 나는 피닉스가 의견에 게시 한 링크를 볼 수는 있지만 여전히 배우고 있기 때문에 스스로 알아낼 때까지 솔루션을보고 싶지 않습니다. 이것은 명성이 들지 만 학습은 내가 여기있는 것입니다 :))))


LeakyNun은 채팅에서 5 번으로했습니다 : Spoiler
Pavel

5
아 .__________.
HyperNeutrino

데니스는 그것을 얻었다 : codegolf.stackexchange.com/a/135145/60042
Pavel


3

파이썬 2 , 50 42 바이트

@Sisyphus 덕분에 8 바이트가 절약되었습니다!

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

파이썬 3에서는 5 바이트를 절약 한 다음 파이썬 2에서는 3 바이트를 더 절약합니다. 감사합니다!
musicman523

3

하스켈 , 26 바이트

@ Mego 가이 솔루션으로 나를 이겼습니다.

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

온라인으로 사용해보십시오!

이것이 하스켈이 위대한 일입니다. 이것은 입력을 무한리스트로 압축하는 포인트없는 함수를 선언합니다.

하스켈 , 56 바이트

다음은 복소수를 사용하는 솔루션입니다. 수입으로 인해 경쟁이 치열하지는 않지만 결코 시원하지는 않습니다.

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

온라인으로 사용해보십시오!


2
에크! 당신은 20 초 닌자를 했어요!
Mego

두 개의 동일한 솔루션을 가질 필요는 없습니다. 귀속없이 내 개선을 취하여 답변을 동일하게 만들었으므로 귀하의 답변을 삭제 하시겠습니까?
Mego

3

매스 매 티카, 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 내가 구체적으로 링크 한 메타 합의는 그 문제를 다룹니다. 함수 외부에서 전역 변수를 선언해도됩니다.
JungHwan Min

3

J, 12 바이트

+1 0 _1 0$~#

온라인으로 사용해보십시오!

J의 셰이프 연산자 $는 주기적으로 채워 지므로 #입력 길이 에 맞게 셰이프하면 원하는대로 정확하게 수행 할 수 있으며 입력에 추가 할 수 있습니다.]


첫 번째를 삭제하여 바이트를 절약 할 수 있습니다] (즉, 훅 사용)
Tikkanz

@Tikkanz 좋은 캐치. 게시물을 업데이트했습니다.
Jonah

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하고 올바른 매개 변수를 전달할 수 있음을 발견했습니다.

Nevay 덕분에 -2 바이트

Zacharý 덕분에 -2 바이트

vector포함을 제거했습니다 . 다음 조건을 준수하는 wa 컨테이너에 인수로 전달해야합니다.

  • 라는 방법을 사용하십시오 size인수없이
  • 아래 첨자 연산자를 오버로드했습니다

있는 다음과 같은 조건을 존중 STL 컨테이너 array, vector, string,map , unordered_map, 어쩌면 다른 사람

인수를 수정하여 출력하는 것이 허용되지 않으면 다음을 수행하십시오.

C ++, 112110 바이트

#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
첫 번째 유효한 I / O입니다.
Pavel

1
j%42 바이트를 절약 하는 데 사용할 수 있습니다 .
Nevay

1
나는 당신이 parens가 필요하다고 생각하지 않습니다 j%4.
Zacharý



2

펄 6 , 28 바이트

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

온라인으로 사용해보십시오!

1+0i, * × i ... *1, i, -1, -i사이클에서 반복 되는 숫자의 무한 목록을 생성합니다 . 해당 숫자는 Z+입력 목록 ( )과 함께 추가 ( )로 압축 된 $_다음 결과 복소수의 실제 구성 요소가 추출됩니다 ( ».re).



2

apt , 11 10 바이트

Japt의 인덱스 줄 바꿈을 활용합니다.

Ë+[1TJT]gE

그것을 테스트


설명

배열의 암시 적 입력 U.

Ë

배열을 매핑하십시오.

+

현재 요소에 추가 ...

gE

현재 색인의 요소 ( E) ...

[1TJT]

배열에서 [1,0,-1,0].


1

실제로 11 바이트

;r⌠╦½*C≈⌡M¥

온라인으로 사용해보십시오! (모든 테스트 사례를 실행)

설명:

;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 바이트

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

8 , 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]

설명

올바른 시퀀스 [1,0, -1,0]을 얻기 위해 cos (x)를 사용합니다. 각 배열 요소의 인덱스에 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.