产生三角信号


9

任务:

给定样本索引x,计算三角波的样本值f(x),周期为4个样本,幅度为1。偏移量可以为负,样本值可以为{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

@Mego好吧。撤消我的投票。
JungHwan Min


相对于示例,波形可以异相吗?
玛丽亚

Answers:


12

Mathematica,8个字节

Im[I^#]&

说明

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

3
哦,漂亮的方法。我怎么没看到这个?:D
HyperNeutrino

无法看到算法如何在C中生成虚构单元。=(im汇编器^^使用外来语言的内置函数对我不利)但是是个答案

7

TI基本(7 5 4字节)

sin(90Ans

(度模式)我的旧答案中@immibis的-1个字节。


旧答案

imag(i^Ans

在计算器上的纯数学方法。:)

只是为了好玩,这是另一个9字节(在弧度模式下)或8字节(度数模式)的纯数学(ish)解决方案

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 '17

@immibis 90 ^ ^ -1sin -1使它对所有值的三角波,但罪(90Ans工作的问题问什么。
pizzapants184


5

朱莉娅0.5,12字节

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

我喜欢这种方法,因为它不可能是其他任何语言中最短的一种。

在线尝试!

怎么运行的

Julia的运算符优先级有点不同寻常:与大多数其他语言不同,按位运算符的优先级与算术运算符的优先级相同,因此&(按位乘法)的优先级与相同*

首先,n&3将输入模4带正号。

结果- 012,或3 -然后从减去2,得到210,或-1

最后,我们来划分的签署剩余的2,返回010,或-1


4

果冻,3个字节

ı*Ċ

在线尝试!

怎么运行的

ı*Ċ  Main link. Argument: n

ı*   Elevate i, the imaginary unit, to the n-th power.
  Ċ  Take the imaginary part of the result.

4

直流电,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's %mod运算符是将负值映射为负值的标准“ CPU”版本。


你能abs((x+1)%4)-1代替吗?
魔术章

2

brainfuck,136个字节

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

在线尝试!

可能有一个更简单的答案,但这实际上使用了一个值表。虽然brainfuck需要输入为ASCII字符与正值从0到127,它仍然有效,如果它能够接受负值(测试,更换,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

Python,26 24 21字节

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

-2个字节感谢ValueInk意识到数学方法实际上比普通方法更长:P
-3个字节感谢Dennis指出我不需要int(...),因此使它变得更短:)


lambda x:[0,1,0,-1][x%4]实际上比您的int强制回答还要短
值油墨

@ValueInk哦...嗯,这真令人尴尬
-HyperNeutrino

2
您为什么首先要使用int()
丹尼斯

@Dennis因为.imag提供了浮点值,所以我不确定规范是否允许该值。现在没关系了:)
HyperNeutrino

如果不允许使用浮动,则JavaScript将无法竞争。
丹尼斯


1

Mathematica,18个字节

#~JacobiSymbol~46&

5
这不是很有效:例如,输入9和11都给出1作为输出。该职能的期限为184,而不是
格雷格·马丁

1
但是,JacobiSymbol[-4,#]&它确实有效,并且仅花费一个字节。好主意!
格雷格·马丁

再次看不到一个算法(只是由其他人编写的buildines和几个短代码。。啊,都像往常一样。很好的答案



1

Haskell,19个字节

丹尼斯(Dennis)的茱莉亚(Julia)解决方案港口,只是因为他说这不是任何其他语言中最短的。(有人可能仍然证明我错了,它是Haskell中最短的。)

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

在线尝试!

Haskell具有两个不同的余数函数,一个(rem)的工作方式与Julia一样,而另一个(mod)的工作方式即使在第一个参数为负数时也给出正数,因此适合翻译&3。(Haskell的实际 &称呼为.&.A。import Data.Bits


据我所知,Dennis的Julia解决方案端口也是JavaScript的最佳选择(14字节)。表明即使丹尼斯也是容易犯错的!
尼尔



0

C99,27个字节

假设您希望波以原点为中心:

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

否则f(n){return cpow(1i,n);}会做。我最初cimag在其中有一个,但显然尝试int_Complex intyield中返回一个实部,因此我使用了它。这是有道理的,但我早已预料到了。行为是相同的gcc,并clang


cpow是未定义的xD

一些#include省略,无法编译)))))

但只为C +1

1
@ xakepp35实际上这不是include的错,这是一个链接器问题。编译,-std=c99 -lm它应该可以工作。它工作正常,我既gccclang没有任何包括。好吧,好的,我的意思是没有错误,但是有很多警告。
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

尝试一下

如果wave的相位不重要,则为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

Javascript 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&&
Steve Bennett

@SteveBennett谢谢,好主意!
Nit

0

JavaScript,15个字节

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

按位和3等于模4,不同之处在于没有关于JavaScript负数模的怪异规则。我最初对前四个点做了多项式回归,但后来意识到我很笨,因为(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的答案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.