Hasilkan sinyal triangular

9

Tugas:

Diberikan indeks sampel, x, hitung nilai sampel f (x) dari gelombang segitiga, dengan periode 4 sampel dan amplitudo 1. Offset bisa negatif dan nilai sampel bisa berupa {0, 1, -1}.

Kasus uji:

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

Secara pribadi saya tahu dua pendekatan dalam C - yang pertama menggunakan tabel pencarian, yang kedua menggunakan instruksi kondisional. Untuk poin brownies, bisakah Anda membuat saya terkesan dengan pendekatan "matematika" murni? (Maksud saya pendekatan fungsional murni, misalnya tidak menggunakan instruksi kondisional atau menggunakan memori untuk LUT.) Tapi ini bukan batasan. Jika Anda tidak bisa, atau bahasa Anda tidak mendukungnya - cukup kirim solusi apa pun

0 '
sumber
3
Apa yang Anda maksud dengan "offset bisa negatif"? Juga ini pada dasarnya hanya fungsi trigonometrik, jadi saya akan terkejut jika itu bukan tiruan dari sesuatu.
FryAmTheEggman
@JungHwanMin Ini memiliki aturan yang jauh lebih santai, jadi itu bukan benar-benar penipu (meskipun meminta hal yang sama).
Mego
@Mego baik-baik saja. Menarik kembali suara saya.
JungHwan Min
Bisakah gelombang keluar dari fase relatif ke contoh?
Maria

Jawaban:

12

Mathematica, 8 byte

Im[I^#]&

Penjelasan

Im[I^#]&
   I^#    (* Raise the imaginary unit to the input power *)
Im[   ]   (* Take the imaginary part *)
JungHwan Min
sumber
3
Ohh, pendekatan yang indah. Bagaimana saya tidak melihat ini? : D
HyperNeutrino
tidak dapat melihat algo cara membuat unit imajiner dalam C .. = (im assembler man ^^ menggunakan builtin dalam bahasa eksotis tidak disukai saya) namun merupakan jawaban ..
7

TI-Basic, 7 5 4 byte

sin(90Ans

(Mode Derajat) -1 byte dari @immibis dari jawaban lama saya.


Jawaban lama

imag(i^Ans

Pendekatan matematika murni pada kalkulator. :)

Hanya untuk bersenang-senang, inilah solusi murni-matematika (ish) lainnya untuk 9 byte (dalam mode radian), atau 8 byte (mode Gelar)

2/πsin-1sin(πAns/2 # Radians
90-1sin-1sin(90Ans # Degrees
pizzapants184
sumber
ya, tetapi Anda hanya lupa implementasi imag () .. tetapi menggunakan kode yang lain baik-baik saja, meskipun .. jawaban yang bagus :)
2
@ xakepp35 Saya tidak mengerti. imag()adalah fungsi yang valid pada TI-BASIC.
JungHwan Min
Ada apa dengan ini sin(90Ans? Mengapa Anda membutuhkan tambahan 90-1sin-1?
user253751
@immibis The 90 ^ -1sin ^ -1 membuatnya menjadi gelombang segitiga untuk semua nilai, tetapi dosa (90Ans bekerja untuk apa yang ditanyakan oleh pertanyaan.
pizzapants184
6

Python 2 , 20 byte

lambda n:n%2-n%4/3*2

Cobalah online!

Saya menjalankan pencarian kasar untuk aritmatika atau ekspresi bitwise yang lebih pendek, saya akan melihat apakah ada sesuatu yang muncul. Yang ini saya temukan sendiri.

Tidak
sumber
2
Pencarian ekspresi paksa? Bagus!
Graviton
5

Julia 0,5 , 12 byte

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

Saya suka pendekatan ini karena tidak mungkin menjadi yang terpendek dalam bahasa lain.

Cobalah online!

Bagaimana itu bekerja

Prioritas operator Julia sedikit tidak biasa: tidak seperti kebanyakan bahasa lain, operator bitwise memiliki prioritas yang sama dengan rekan aritmatika mereka, jadi &(penggandaan bitwise) memiliki prioritas yang sama dengan *.

Pertama, n&3ambil input modulo 4 , dengan tanda positif.

Hasilnya - 0 , 1 , 2 , atau 3 - kemudian dikurangi dari 2 , menghasilkan 2 , 1 , 0 , atau -1 .

Akhirnya, kami mengambil sisa pembagian yang ditandatangani dengan 2 , mengembalikan 0 , 1 , 0 , atau -1 .

Dennis
sumber
4

Jelly , 3 byte

ı*Ċ

Cobalah online!

Bagaimana itu bekerja

ı*Ċ  Main link. Argument: n

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

dc, 13

Tidak yakin apakah Anda menghitung %operator modulo sebagai "matematika murni":

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

Cobalah online . Perhatikan bahwa dcgunakan _bukan -untuk menunjukkan angka negatif.

Penjelasan

?              # 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

Perhatikan bahwa dc's %operator mod adalah standar 'CPU' versi yang memetakan nilai-nilai negatif ke nilai negatif.

Trauma Digital
sumber
Bisakah Anda lakukan abs((x+1)%4)-1saja?
Magic Octopus Mm
2

brainfuck , 136 byte

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

Cobalah online!

Mungkin ada jawaban yang lebih sepele, tetapi ini pada dasarnya menggunakan daftar nilai. Meskipun brainfuck mengambil input sebagai karakter ASCII dengan nilai positif dari 0 hingga 127, itu tetap berfungsi seolah-olah ia dapat menerima nilai negatif (untuk menguji, mengganti ,dengan njumlah -karakter dengan).

Bagaimana itu bekerja

>,                                   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)
Graviton
sumber
1

Python, 26 24 21 byte

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

-2 byte terima kasih kepada ValueInk untuk menyadari bahwa metode matematika sebenarnya lebih panjang dari pendekatan sepele: P
-3 byte terima kasih kepada Dennis karena menunjukkan bahwa saya tidak memerlukannya int(...), sehingga membuat ini lebih pendek :)

HyperNeutrino
sumber
lambda x:[0,1,0,-1][x%4]sebenarnya lebih pendek dari jawaban int-coerced Anda lol
Value Ink
@ NilaiInk Oh ... um ini memalukan lol
HyperNeutrino
2
Mengapa Anda menggunakannya int()?
Dennis
@ Dennis Karena .imagmemberikan nilai floating-point dan saya tidak yakin apakah itu diizinkan oleh spesifikasi. Tidak masalah sekarang :)
HyperNeutrino
Jika pelampung tidak diizinkan, JavaScript tidak akan dapat bersaing.
Dennis
1

Mathematica, 18 byte

#~JacobiSymbol~46&
J42161217
sumber
5
Ini tidak berfungsi: input 9 dan 11 keduanya memberikan 1 sebagai output, misalnya. Periode fungsi ini adalah 184, bukan 4.
Greg Martin
1
Namun, JacobiSymbol[-4,#]&tidak bekerja, dan hanya biaya satu byte lagi Ide bagus!
Greg Martin
lagi tidak bisa melihat algrithm (hanya builtines yang ditulis oleh orang lain dan beberapa kode pendek .. ah, semua seperti biasa. jawaban yang baik sekalipun
1

PHP, 20 byte

<?=2<=>($argn&3?:2);
pengguna63956
sumber
1

Haskell , 19 byte

Solusi Port of Dennis's Julia, hanya karena dia mengatakan itu tidak akan terpendek dalam bahasa lain. (Seseorang mungkin masih membuktikan saya salah bahwa itu adalah yang terpendek di Haskell.)

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

Cobalah online!

Haskell memiliki dua fungsi sisa yang berbeda, satu ( rem) berfungsi seperti yang Julia, sedangkan yang lain ( mod) memberikan hasil positif bahkan ketika argumen pertama negatif, dan karenanya cocok untuk menerjemahkan &3. (Haskell yang sebenarnya & , yang disebut .&., sayangnya membutuhkan import Data.Bits.)

Ørjan Johansen
sumber
Sejauh yang saya tahu, port solusi Dennis's Julia juga optimal untuk JavaScript (14 byte). Menunjukkan bahwa bahkan Dennis pun bisa keliru!
Neil
1

Oktaf , 22 byte

@(x)round(sin(x*pi/2))

Cobalah online!

pengguna41805
sumber
0

Ruby, 20 byte

Sederhana dan bersih.

->x{[0,1,0,-1][x%4]}
Nilai Tinta
sumber
0

C99, 27 byte

Dengan asumsi Anda ingin gelombang dipusatkan pada titik asal:

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

jika tidak f(n){return cpow(1i,n);}akan dilakukan. Saya awalnya punya cimagdi sana, tetapi tampaknya mencoba untuk mengembalikan intdari _Complex inthasil bagian yang sebenarnya, jadi saya menggunakannya. Itu masuk akal, tetapi tidak ada yang saya perkirakan. Perilaku adalah sama dalam gccdanclang

algmyr
sumber
cpow tidak didefinisikan xD
beberapa #termasuk dihilangkan, tidak dikompilasi)))))
tapi +1 hanya untuk C
1
@ xakepp35 Itu sebenarnya bukan kesalahan dari menyertakan, itu masalah tautan. Kompilasi dengan -std=c99 -lmdan itu akan berhasil. Ini berfungsi baik untuk saya dengan keduanya gccdan clangtanpa menyertakan apa pun. Yah, maksud saya maksud saya tidak ada kesalahan, tetapi sejumlah besar peringatan.
algmyr
0

05AB1E , 5 byte

4%<Ä<

Cobalah online!


Outputnya terbalik, tetapi dari apa yang saya pahami ini diperbolehkan:

+1 byte untuk mengalikan output dengan -1 menggunakan (.

   -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...
Guci Gurita Ajaib
sumber
apa yang saya pahami ini diizinkan
test case tidak lulus ;-)
tapi +1 usaha yang bagus
0

Pyth - 7 byte (mungkin 6)

ta2%tQ4

Cobalah

Jika fase gelombang tidak penting, 6 byte:

ta2%Q4

Cobalah

Penjelasan:

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]
Maria
sumber
0

AWK , 26 byte

{$0=(sqrt(($0%4)^2)-2)%2}1

Cobalah online!

Ini adalah pendekatan alternatif menggunakan fungsi trig tanpa operator modulus.

{$0=int(sin($0*atan2(0,-1)/2))}1

Cobalah online!

Robert Benson
sumber
0

Javascript ES6, 18 17 byte

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

Pertama, periksa apakah inputnya genap atau ganjil dan kembalikan 0 untuk semua nilai genap. Untuk semua input ganjil, kenaikan dan bitwise dengan 0b10menghapus bit yang tidak menarik bagi kami, lalu kembalikan jawabannya dengan offset.

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)}`;
}

Nit
sumber
1
Simpan satu byte dengan menggantinya ? :0dengan&&
Steve Bennett
@SteveBennett Terima kasih, ide bagus!
Nit
0

JavaScript, 15 byte

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

Bitwise dan 3 setara dengan modulo 4 kecuali tanpa aturan aneh pada modulos JavaScript dari angka negatif. Saya melakukan regresi polinomial pada empat poin pertama pada awalnya tetapi kemudian menyadari bahwa saya bodoh karena (1, 1), (2, 0), dan (3, -1) hanya 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)])

Kuilin Li
sumber
sangat baik! +1 untuk jawabannya