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


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 *)

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

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.


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 .


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.

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.


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)

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 :)


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&

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

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.)


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



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


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...

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]


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


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)])


sangat baik! +1 untuk jawabannya

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.