三角信号を生成


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で2つのアプローチを知っています。1つはルックアップテーブルを使用する方法、2つ目は条件付き命令を使用する方法です。ブラウニーポイントについて、純粋な「数学」アプローチで私を印象づけることができますか?(つまり、条件付き命令を使用したり、LUTにメモリを使用したりしない、純粋な機能的アプローチを意味します。)しかし、これは制限ではありません。できない場合、または言語がサポートしていない場合-解決策を投稿してください


3
「オフセットはマイナスになる可能性がある」とはどういう意味ですか?また、これは基本的には三角関数にすぎないので、それが何かのだましではないなら、私は驚かれることでしょう。
FryAmTheEggman 2017年

@JungHwanMinこれははるかに緩和されたルールを持っているので、それは実際にはだまされたものではありません(同じことを要求します)。
Mego 2017年

@Mego大丈夫。投票を撤回します。
JungHwan Min 2017


例に比べて波の位相がずれていてもよいですか?
マリア

回答:


12

Mathematica、8バイト

Im[I^#]&

説明

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

3
ああ、美しいアプローチ。どうしてこれを見なかったの?:D
HyperNeutrino 2017年

Cに虚数単位を生成する方法アルゴ見カント.. =(エキゾチックな言語での組み込みコマンドを使用してイムアセンブラ男が^^私の賛成ではありません)しかし、答えは..です

7

TI-Basic、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

。90 ^ -1sin ^ -1すべての値の三角波になりますが、罪(90Ansは質問が尋ねる何のために働く@immibis
pizzapants184


5

ジュリア0.5、12バイト

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

他の言語では最短になる可能性が低いため、このアプローチが好きです。

オンラインでお試しください!

使い方

Juliaの演算子の優先順位は少し変わっています。他のほとんどの言語とは異なり、ビット単位の演算子の優先順位は算術演算子と同じなので、&(ビット単位の乗算)の優先順位はと同じ*です。

最初に、正の符号を使用して4をn&3法とする入力を受け取ります。

結果- 012、または3が -次にから減算される2生じ、210、または、-1

最後に、我々は、除算の署名された余りを取る2戻り、010、または-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%mod演算子は、負の値を負の値にマッピングする標準の「CPU」バージョンであることに注意してください。


abs((x+1)%4)-1代わりにできますか?
マジックタコの壷

2

ブレインファック、136バイト

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

オンラインでお試しください!

おそらくもっと簡単な答えがありますが、これは基本的に値のテーブルを使用します。brainfuckは、0から127までの正の値を持つ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

Python、26 24 21バイト

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

-2バイトは、数学的な方法が実際には些細なアプローチよりも長いことを認識したValueInkに感謝します:P
-3バイトは、私がを必要としないことを指摘しint(...)、これによりこれを短くしました:)


lambda x:[0,1,0,-1][x%4]実際には、int型強制回答よりも短いですlol
Value Ink

@ValueInkああ...これは恥ずかしいです笑
HyperNeutrino 2017年

2
int()そもそもなぜ使うの?
デニス

@Dennis .imagは浮動小数点値を与えるので、仕様で許可されているかどうかはわかりません。今は関係ありません:)
HyperNeutrino 2017年

フロートが許可されていない場合、JavaScriptは競合できません。
デニス


1

Mathematica、18バイト

#~JacobiSymbol~46&

5
これはうまくいきません。たとえば、入力9と11はどちらも出力として1を与えます。この関数の周期ではなく、4 184です
グレッグ・マーティン

1
ただし、JacobiSymbol[-4,#]&機能し、さらに1バイトのコストがかかります。良いアイデア!
グレッグマーティン

再びすべてのいつものように、ああ...(他の人とのショートコードのカップルによって書かれただけbuiltinesをalgrithmを参照してくださいカント細かい答えをけれども。



1

Haskell、19バイト

ポートオブデニスのジュリアソリューション。これは、他の言語では最短ではないと述べたからです。(誰かがそれがHaskellで最短であることを私がまだ間違っていると証明するかもしれません。)

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

オンラインでお試しください!

Haskellには2つの異なる剰余関数があります。1つ(rem)はJuliaと同じように機能し、もう1つ()modは最初の引数が負の場合でも正の結果を返すため、を変換するのに適しています&3。(Haskellの実際の &と呼ばれる.&.、悲しいかな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 int本当の部分が得られるので、それを使用しました。それは理にかなっていますが、私が予測したことは何もありません。動作は同じであるgccclang


cpowは未定義のxD

一部の#includeは省略され、コンパイルされません)))))

ただし、Cのみの場合は+1

1
@ xakepp35これはインクルードのせいではなく、リンカの問題です。でコンパイル-std=c99 -lmすれば動作するはずです。両方gccclang、インクルードなしで問題なく動作します。まあ、結局のところ、エラーはありませんが、警告は多数あります。
algmyr 2017年

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

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ありがとう、素晴らしいアイデア!
2017年

0

JavaScript、15バイト

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

ビットワイズおよび3は、JavaScriptの負の数のモジュロに関する奇妙な規則がないことを除いて、モジュロ4と同等です。最初は最初の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.