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
Jawaban:
Mathematica, 8 byte
Penjelasan
sumber
TI-Basic,
754 byte(Mode Derajat) -1 byte dari @immibis dari jawaban lama saya.
Jawaban lama
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)
sumber
imag()
adalah fungsi yang valid pada TI-BASIC.sin(90Ans
? Mengapa Anda membutuhkan tambahan90-1sin-1
?Python 2 , 20 byte
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.
sumber
Julia 0,5 , 12 byte
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&3
ambil 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 .
sumber
Jelly , 3 byte
Cobalah online!
Bagaimana itu bekerja
sumber
dc, 13
Tidak yakin apakah Anda menghitung
%
operator modulo sebagai "matematika murni":Cobalah online . Perhatikan bahwa
dc
gunakan_
bukan-
untuk menunjukkan angka negatif.Penjelasan
Perhatikan bahwa
dc
's%
operator mod adalah standar 'CPU' versi yang memetakan nilai-nilai negatif ke nilai negatif.sumber
abs((x+1)%4)-1
saja?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
,
dengann
jumlah-
karakter dengan).Bagaimana itu bekerja
sumber
Python,
262421 byte-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 :)sumber
lambda x:[0,1,0,-1][x%4]
sebenarnya lebih pendek dari jawaban int-coerced Anda lolint()
?.imag
memberikan nilai floating-point dan saya tidak yakin apakah itu diizinkan oleh spesifikasi. Tidak masalah sekarang :)Python , 20 byte
Fungsi tanpa nama yang mengembalikan hasilnya.
Cobalah online!
sumber
Mathematica, 18 byte
sumber
JacobiSymbol[-4,#]&
tidak bekerja, dan hanya biaya satu byte lagi Ide bagus!Pari / GP , 12 byte
Cobalah online!
sumber
PHP, 20 byte
sumber
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.)
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 membutuhkanimport Data.Bits
.)sumber
Oktaf , 22 byte
Cobalah online!
sumber
Ruby, 20 byte
Sederhana dan bersih.
sumber
C99, 27 byte
Dengan asumsi Anda ingin gelombang dipusatkan pada titik asal:
jika tidak
f(n){return cpow(1i,n);}
akan dilakukan. Saya awalnya punyacimag
di sana, tetapi tampaknya mencoba untuk mengembalikanint
dari_Complex int
hasil bagian yang sebenarnya, jadi saya menggunakannya. Itu masuk akal, tetapi tidak ada yang saya perkirakan. Perilaku adalah sama dalamgcc
danclang
sumber
-std=c99 -lm
dan itu akan berhasil. Ini berfungsi baik untuk saya dengan keduanyagcc
danclang
tanpa menyertakan apa pun. Yah, maksud saya maksud saya tidak ada kesalahan, tetapi sejumlah besar peringatan.05AB1E , 5 byte
Cobalah online!
Outputnya terbalik, tetapi dari apa yang saya pahami ini diperbolehkan:
+1 byte untuk mengalikan output dengan -1 menggunakan
(
.sumber
Pyth - 7 byte (mungkin 6)
Cobalah
Jika fase gelombang tidak penting, 6 byte:
Cobalah
Penjelasan:
sumber
AWK , 26 byte
Cobalah online!
Ini adalah pendekatan alternatif menggunakan fungsi trig tanpa operator modulus.
Cobalah online!
sumber
Javascript ES6,
1817 bytePertama, periksa apakah inputnya genap atau ganjil dan kembalikan 0 untuk semua nilai genap. Untuk semua input ganjil, kenaikan dan bitwise dengan
0b10
menghapus bit yang tidak menarik bagi kami, lalu kembalikan jawabannya dengan offset.sumber
? :0
dengan&&
JavaScript, 15 byte
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.
sumber
R , 19 byte
Cobalah online!
Port jawaban JungHwan Min dari Mathematica .
sumber