삼각 신호 생성


9

직무:

주어진 샘플 인덱스 x는 4 개의 샘플주기 및 진폭 1을 갖는 삼각파의 샘플 값 f (x)를 계산합니다. 오프셋은 음수 일 수 있으며 샘플 값은 {0, 1, -1} 일 수 있습니다.

테스트 사례 :

   -5 -> -1
   -4 -> 0
   -3 -> 1
   -2 -> 0
   -1 -> -1
    0 -> 0
    1 -> 1
    2 -> 0
    3 -> -1
    4 -> 0
    5 -> 1

개인적으로 C에서 두 가지 접근 방식을 알고 있습니다. 첫 번째는 조회 테이블을 사용하고 두 번째는 조건부 명령을 사용합니다. 브라우니 포인트의 경우 순수한 "수학"접근 방식으로 저에게 깊은 인상을 줄 수 있습니까? (예를 들어 조건부 명령어를 사용하지 않거나 LUT에 메모리를 사용하는 순수한 기능적 접근을 의미합니다.) 그러나 이것은 제한이 아닙니다. 당신이 할 수 없거나 당신의 언어가 그것을 지원하지 않는 경우-그냥 해결책을 게시


3
"오프셋이 음수 일 수 있습니다"는 무슨 뜻입니까? 또한 이것은 기본적으로 삼각 함수일 뿐이므로 무언가를 속이는 것이 아니라면 놀랄 것입니다.
FryAmTheEggman

@JungHwanMin 이것은 훨씬 더 편안한 규칙을 가지고 있기 때문에 실제로 같은 것은 아닙니다.
Mego

@ 메고 좋아. 내 투표를 철회합니다.
JungHwan Min


예제와 비교하여 웨이브가 위상이 맞지 않을 수 있습니까?
Maria

답변:


12

수학, 8 바이트

Im[I^#]&

설명

Im[I^#]&
   I^#    (* Raise the imaginary unit to the input power *)
Im[   ]   (* Take the imaginary part *)

3
오, 아름다운 접근입니다. 이걸 어떻게 보지 못했습니까? : D
HyperNeutrino

C.에서 가상 단위를 생성하는 방법도 알 수 없습니다. = (im assembler man ^^ 이국적인 언어로 내장을 사용하는 것은 좋지 않습니다).

7

TI 기본, 7 5 4 바이트

sin(90Ans

(도 모드) @immibis에서 -1 바이트 내 이전 답변.


이전 답변

imag(i^Ans

계산기에 대한 순수 수학 접근법. :)

재미를 위해 9 바이트 (라디안 모드) 또는 8 바이트 (도 모드)에 대한 또 다른 순수한 수학 솔루션이 있습니다.

2/πsin-1sin(πAns/2 # Radians
90-1sin-1sin(90Ans # Degrees

예, 그러나 당신은 단지 imag () 구현을 잊어 버립니다. 그러나 다른 코드를 사용하면 괜찮습니다. 좋은 대답 :)

2
@ xakepp35 이해가되지 않습니다. imag()TI-BASIC에서 유효한 기능입니다.
JungHwan Min

무슨 일이야 sin(90Ans? 왜 추가가 필요 90-1sin-1합니까?
user253751 2018 년

@immibis 90 ^ -1sin ^ -1은 모든 값에 대해 삼각파를 만들지 만 sin (90Ans는 질문이하는대로 작동합니다.
pizzapants184


5

줄리아 0.5 , 12 바이트

!n=(2-n&3)%2

다른 언어로는 가장 짧을 것 같지 않기 때문에이 방법이 마음에 듭니다.

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

작동 원리

Julia의 연산자 우선 순위는 약간 특이합니다. 대부분의 다른 언어와 달리 비트 연산자는 산술 연산자와 우선 순위가 동일하므로 &(비트 곱셈)과 우선 순위가 같습니다 *.

먼저 양의 부호 n&3가있는 입력 모듈로 4를 취합니다 .

그런 다음 결과 0 , 1 , 2 또는 3 –을 2 에서 빼고 2 , 1 , 0 또는 -1을 생성 합니다.

마지막으로 부호있는 나눗셈의 나머지를 2 씩 취하여 0 , 1 , 0 또는 -1을 반환 합니다.



4

dc, 13

모듈로 %연산자를 "순수 수학"으로 계산하는지 확실하지 않은 경우 :

?1+d*v4%1-2%p

온라인으로 사용해보십시오 . 참고 dc사용하는 _대신를 -음수를 나타냅니다.

설명

?              # read input
 1+            # add 1
   d*v         # duplicate, multiply, square root (poor-mans abs())
      4%       # mod 4
        1-     # subtract 1
          2%   # mod 2
            p  # print

주의 dc%모드 운영자가 음의 값에 음수 값을 매핑 표준 "CPU"버전입니다.


당신은 abs((x+1)%4)-1대신에 할 수 있습니까 ?
Magic Octopus Urn

2

brainfuck , 136 바이트

>,>++++<[>->+<[>]>[<+>-]<<[<]>-]>>>>-[>+<-----]>--[-<+>>>+>>>+>>>+<<<<<<<<]<->>>>>>->--[>+<++++++]>++<<<<<<<<<<[[->>>+<<<]>>>-]>[.[-]]>.

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

아마도 더 간단한 대답이있을 수 있지만 본질적으로 값 테이블을 사용합니다. 브레인 퍽 127 0에서 양의 값으로 ASCII 문자로 입력을 받아 있지만 여전히 (테스트로 대체 음의 값을 받아 들일 수 있다면로 작동 ,n-문자).

작동 원리

>,                                   take input (X)
>++++<                               take second input for modulo (4)
[>->+<[>]>[<+>-]<<[<]>-]             calculate X mod 4
>>>>-[>+<-----]>--                   create initial '1' character
[-<+>>>+>>>+>>>+<<<<<<<<]            duplicate '1' four times as 1,1,1,1
<->>>>>>->--[>+<++++++]>++<<<<<<<<<< change 1,1,1,1 to 0,1,0,-1 
[[->>>+<<<]>>>-]>[.[-]]>.            move to the right X%4 * 3 times, then print the following two characters ( 0, 1, 0,-1)

1

파이썬, 26 24 21 바이트

lambda x:(1j**x).imag

수학적 방법이 사소한 접근 방식보다 실제로 길다는 것을 깨닫은 ValueInk 덕분에 -2 바이트 덕분에 P는
-3 바이트는 내가 필요하지 않다고 지적 int(...)했기 때문에 Dennis 덕분에 더 짧아 졌습니다. :)


lambda x:[0,1,0,-1][x%4]실제로 당신의 int-coerced 응답보다 짧습니다. lol
Value Ink

@ValueInk 아 ... 음이 롤 당황한다
HyperNeutrino

2
int()그래도 왜 처음에 사용 하겠습니까?
데니스

@Dennis .imag부동 소수점 값을 제공하므로 사양에서 허용되는지 확실하지 않습니다. 지금은 중요하지 않습니다 :)
HyperNeutrino

플로트가 허용되지 않으면 JavaScript는 경쟁 할 수 없습니다.
데니스


1

매스 매 티카, 18 바이트

#~JacobiSymbol~46&

5
예를 들어, 입력 9와 11은 모두 1을 출력으로 제공합니다. 이 기능의 기간은 4가 아니라 184입니다.
Greg Martin

1
그러나 JacobiSymbol[-4,#]&작동 하지만 1 바이트가 더 필요합니다. 좋은 생각!
Greg Martin

다시 algrithm (다른 사람들과 몇 개의 짧은 코드에 의해 작성된 내장을 볼 수 없습니다. 아, 모두 평소와 같이. 좋은 답변



1

하스켈 , 19 바이트

데니스 포트의 줄리아 솔루션은 다른 언어로는 가장 짧지 않을 것이라고 말했다. (누군가 Haskell에서 가장 짧다는 것이 여전히 틀릴 수 있습니다.)

f n=rem(2-n`mod`4)2

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

Haskell에는 두 가지 다른 함수가 있는데, 하나 rem는 Julia 하나처럼 작동하고 다른 하나 mod는 첫 번째 인수가 음수 일 때에도 긍정적 인 결과를 나타내므로 번역에 적합합니다 &3. (Haskell의 실제 & ,에는 .&.아아가 필요합니다 import Data.Bits.)


내가 알 수있는 한 Dennis의 Julia 솔루션 포트는 JavaScript에도 최적입니다 (14 바이트). 데니스조차도 오류가 있음을 보여줍니다!
Neil



0

C99, 27 바이트

웨이브가 원점을 중심으로하고 싶다고 가정하면 :

f(n){return cpow(1i,n)/1i;}

그렇지 않으면 f(n){return cpow(1i,n);}할 것입니다. 나는 원래 cimag거기에 있었지만 분명히 수익률 을 반환하려고 하면 실제 부분 int_Complex int산출되므로 그것을 사용했습니다. 말이 되겠지만, 내가 예측 한 것은 아닙니다. 동작은 동일에 gccclang


cpow는 정의되지 않은 xD입니다

일부 # 생략, 컴파일 안함)))))

C 만 +1

1
@ xakepp35 실제로는 포함의 결함이 아니며 링커 문제입니다. 컴파일하고 -std=c99 -lm작동해야합니다. 그것은 모두 나를 위해 잘 작동 gcc하고 clang어떤 포함하지 않고. 글쎄, 나는 오류가 없지만 많은 경고가 있음을 의미합니다.
algmyr

0

05AB1E , 5 바이트

4%<Ä<

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


출력이 반전되었지만 이해 한 바에 따르면 다음이 허용됩니다.

를 사용하여 출력에 -1을 곱하려면 +1 바이트 (.

   -5 -> 1
   -4 -> 0
   -3 -> -1
   -2 -> 0
   -1 -> 1
    0 -> 0
    1 -> -1
    2 -> 0
    3 -> 1
    4 -> 0
    5 -> -1

4%    # Amplitude of 4...
  <   # Period of 1...
   Ä  # Absolute value...
    < # Period of 1 centered at 0...

내가 이해 한 것

테스트 케이스가 전달되지 않음 ;-)

그러나 +1 좋은 시도

0

Pyth-7 바이트 (아마도 6)

ta2%tQ4

시도 해봐

웨이브의 위상이 중요하지 않은 경우 6 바이트 :

ta2%Q4

시도 해봐

설명:

ta2%tQ4
     Q    # The input
    t     # Subtract 1 to get the phase right (might not be necessary)
   %  4   # Take mod 4
 a2       # Absolute value of the result - 2
t         # Subtract 1 so the result is in [-1,0,1]


0

자바 스크립트 ES6, 18 17 바이트

n=>n&1&&(++n&2)-1

먼저 입력이 짝수인지 홀수인지 확인하고 모든 짝수 값에 대해 0을 반환합니다. 모든 홀수 입력의 경우, 0b10관심이없는 비트를 제거하기 위해 증분 및 비트 단위로 입력 한 다음 오프셋과 함께 답을 반환하십시오.

const f = n=>n&1&&(++n&2)-1;

for (let i = -5; i < 6; i++) {
  document.body.appendChild(document.createElement('pre')).innerHTML = `f(${i}) => ${f(i)}`;
}


1
대체하여 바이트를 저장 ? :0하여&&
스티브 베넷

@SteveBennett 감사합니다, 좋은 생각입니다!
Nit

0

자바 스크립트, 15 바이트

n=>n&3&&2-(n&3)

비트 및 3은 JavaScript의 음수 모듈러스에 대한 이상한 규칙이 없으면 모듈로 4와 같습니다. 나는 처음에 처음 네 점에서 다항식 회귀 분석을 수행했지만 (1, 1), (2, 0) 및 (3, -1)이 단지 2-n이기 때문에 내가 바보임을 깨달았습니다.

a=n=>n&1&&2-(n&3);
console.log([a(-5), a(-4), a(-3), a(-2), a(-1), a(0), a(1), a(2), a(3), a(4), a(5)])


아주 잘! 답변 +1

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.