Grafik operasi modulo ( ) terlihat seperti ini:
Ini adalah fungsi yang sangat berguna, karena memungkinkan kita untuk membuat perilaku "membungkus". Namun, itu sangat rumit ketika saya ingin menggunakannya untuk membuat tampilan "memantul" di antara dua dinding. Grafik fungsi "bouncing" ( ) terlihat seperti ini:
The periode dari grafik yaitu . Periode grafik adalah , karena bergerak ke atas untuk unit , dan kemudian bergerak ke bawah untuk unit lain , sebelum kembali ke tempat dimulainya. Untuk kedua fungsi, nilai minimum untuk adalah 0, dan maksimum adalah (Sebenarnya, untuk fungsi modulus dengan input integral, ). Selain itu, untuk kedua fungsi, nilai adalah 0.k y = bouncing ( x , k ) 2 k ky k k - 1 x = 0
Tantangan
Dengan bilangan bulat dan bilangan bulat positif , kembalikan pendekatan bilangan bulat atau titik mengambang dari .k y = bouncing ( x , k )
Ini adalah kode-golf , sehingga pengiriman terpendek yang valid (dihitung dalam byte) menang.
Uji Kasus
x, k -> bounce(x, k)
0, 14 -> 0
3, 7 -> 3
14, 14 -> 14
15, 14 -> 13
-13, 14 -> 13 (12.999997 etc would be an acceptable answer)
-14, 14 -> 14
191, 8 -> 1
192, 8 -> 0
sumber
k % k = 0
k
.Jawaban:
x86-64 Kode Mesin, 18 byte
Kode ini mendefinisikan fungsi dalam bahasa mesin x86-64 yang menghitung
bounce(x, k
). Mengikuti konvensi pemanggilan Sistem V AMD64 yang digunakan pada sistem Gnu / Unix,x
parameter dilewatkan dalamEDI
register, sementarak
parameter dilewatkan dalamESI
register. Seperti dengan semua konvensi pemanggilan x86, hasilnya dikembalikan dalamEAX
register.Untuk memanggil ini dari C, Anda akan membuat prototipe sebagai berikut:
Cobalah online!
Mnemonik perakitan tidak dikumpulkan:
Perhatikan bahwa bagian pertama (yang mengambil nilai absolut) dapat secara setara ditulis:
yang merupakan jumlah byte yang sama persis (6). Kinerja harus serupa, mungkin sedikit lebih cepat (kecuali pada chip Intel tertentu, di mana gerakan bersyarat lambat ).
XCHG
tentu saja relatif lambat dan tidak akan disukaiMOV
kecuali dalam kode golf (bahwa yang pertama adalah 1-byte ketika salah satu operan adalah akumulator, sedangkan register-registerMOV
selalu 2 byte).sumber
Jelly , 3 byte
Cobalah online!
Built-in ftw.
Penjelasan
æ%
adalah built-in yang berguna di sini. Saya tidak tahu bagaimana menggambarkannya, jadi saya hanya akan memberikan output untuk beberapa input:Sebagai
x
pergi dari0
tak terbatas,xæ%4
pergi di0,1,2,3,4,(-3,-2,-1,0,1,2,3,4,)
mana bagian dalam kurung diulangi hingga tak terbatas kedua cara.sumber
Python 2 ,
2927 byteCobalah online!
sumber
Python 3 , 27 byte
Cobalah online!
sumber
Ruby,
40 byte32 byteCobalah online!
Penjelasan
Hai, ini jawaban pertama saya di situs ini! Kode ini didasarkan pada pengamatan bahwa fungsi bouncing berperilaku persis seperti modulo ketika ( n -1) k <= x < nk dan n ganjil, dan berperilaku seperti operasi modulo terbalik ketika n adalah genap.
(x/k+1)
adalah bilangan bulat terkecil yang lebih besar dari x / k (yaitu x / k +1 dibulatkan ke bilangan bulat). Oleh karena itu,(x/k+1)
temukan n yang disebutkan di atas.%2>0
memeriksa untuk melihat apakah n ganjil atau genap. Jika n mod 2> 0, maka n ganjil. Jika nmod 2 = 0, maka n adalah genap. Jika n ganjil, maka fungsi bouncing harus sama dengan x mod k . Jika n adalah genap, fungsi bouncing seharusnya terbalik, sama dengan k - x mod k . Seluruh ekspresi(x/k+1)%2>0?x%k:k-x%k
menemukan n , kemudian mengeksekusi x mod k jika itu aneh, dan mengeksekusi k - x mod k sebaliknya.Jawabannya ditingkatkan berdasarkan saran dari Cyoce .
sumber
def b(x,k) ... end
menggunakan->x,k{...}
.to_i
tidak perlu.Mathematica, 19 byte
sumber
Pyth , 5 byte
Verifikasi semua testcases.
Fork dari jawaban Python saya .
sumber
J, 25 byte
Petunjuk:
Berikut adalah solusi (belum golf dengan baik) di J. Akan mencoba untuk meningkatkan besok:
terkompresi:
[((|~#){])(i.@>:,}:@i.@-)@]
dikompresi2:
[((|~#){])(<:|.|@}.@i:)@]
Cobalah online!
sumber
i:
dapat digunakan di sini, tetapi saya belum mencoba solusii:
. Hanya belum punya waktu untuk memperbarui yang utama dan memberikan penjelasan. Saya berharap seorang ahli bisa mencukur setidaknya 4 atau 5 byte lagi ...((|~#){])]-|@}:@i:
untuk 18 byteQBIC ,
253027 byteMelakukan sedikit restrukturisasi ...
Penjelasan
sumber
x
-13 dank
14.abs
kedua kali?C89, 40 byte
Port AC jawaban kode mesin x86 saya , ini mendefinisikan fungsi
f
,, yang menghitung bouncing-modulo untuk parameterx
dank
.Ia menggunakan aturan implisit-int C89, sehingga kedua parameter, variabel global
t
, dan nilai pengembalian fungsi semuanya secara implisit bertipeint
. Variabel globalt
hanya digunakan untuk menyimpan nilai sementara, yang akhirnya menghemat byte, dibandingkan dengan mengulangi perhitungan di kedua sisi operator bersyarat.The
abs
function (nilai absolut) disediakan di<stdlib.h>
header, tapi kita tidak harus menyertakan di sini, lagi berkat aturan implisit int C89 (di mana fungsi ini secara implisit dinyatakan dan diasumsikan kembaliint
).Cobalah online!
Versi tidak disatukan:
Melihat ini mengingat kode mesin yang disetel dengan tangan saya , kompiler sebenarnya menghasilkan output yang cukup bagus untuk ini. Maksud saya, mereka harus; itu fungsi yang cukup sederhana untuk dioptimalkan! Saya menemukan bug kecil di pengoptimal x86-64 GCC , meskipun, di mana anehnya menghasilkan kode yang lebih besar ketika Anda mengatakannya untuk mengoptimalkan ukuran dan kode yang lebih kecil ketika Anda mengatakannya untuk mengoptimalkan kecepatan .
sumber
m;f(x,k){m=abs(x%k);x=x/k%2?k-m:m;}
lebih pendekHaskell, 37 Bytes
Cobalah online!
Cara menggunakan:
Panggil sebagai
15#14
untuk argumen kiri non-negatif dan(-13)#14
untuk argumen kiri negatif, karena Haskell akan menafsirkan-13#14
seolah--(13#14)
olah Anda menggunakan sesuatu sepertighci
. TIO-link hanya membutuhkan dua argumen baris perintah.Penjelasan:
Pertama mendefinisikan ulang operator infiks biner
!
menjadi sama denganmod
. Haskellmod
selalu menampilkan nilai non-negatif, jadi kita tidak memerlukanabs
solusi lain di sini. Ini kemudian memeriksa apakahx/k
(pembagian integer) aneh dan jika demikian, mengembalikank-x mod k
(yaitu kembali-bouncing) atau kembalix mod k
.sumber
!
karena tidak menyimpan byte lebihx#k|odd$x`div`k=k-x`mod`k|1<2=x`mod`k
PHP,
4050 bytedolar sialan. sialan impor overhead. :)
versi integer:
atau
versi float, 56 byte:
Ganti
abs($x)%$k
denganfmod(abs($x),$k)
.sunting: hasil tetap untuk negatif
x
sumber
€argv
atau£argv
? Itu akan terlihat bagus: xJavaScript (ES6),
3632 byteBouncing secara rekursif
x
terhadap0
dank
, sangat banyak dalam semangat tantangan.sumber
Gangguan Umum, 41 byte
Cobalah online!
sumber
C (gcc),
4353 byteSunting: Memperbaiki masalah negatif
Cobalah secara Online!
sumber
R, 28 byte
Yang mengevaluasi fungsi:
Yang tampaknya menjadi metode yang paling banyak digunakan solusi. Saya tidak melihat mereka sebelum membuat ini.
sumber