Le graphique de l'opération modulo ( ) ressemble à ceci:
Il s'agit d'une fonction très utile, car elle nous permet de créer un comportement "enveloppant". Cependant, c'est très lourd quand je veux l'utiliser pour créer une apparence de "rebond" entre deux murs. Le graphique de la fonction "rebond" ( ) ressemble à ceci:
La période du graphe de est . La période du graphique de est de , car elle monte vers le haut pour unités, puis descend vers le bas pour autres unités, avant de revenir à son point de départ. Pour les deux fonctions, la valeur minimale pour est 0 et la valeur maximale est (en fait, pour la fonction module avec entrées intégrales, c'est ). De plus, pour les deux fonctions, la valeur où est 0.k y = rebond ( x , k ) 2 k k k y k k - 1 x = 0
Le défi
Étant donné un entier et un entier positif , renvoyer une approximation entière ou à virgule flottante de .k y = rebond ( x , k )
Il s'agit de code-golf , donc la soumission valide la plus courte (comptée en octets) l'emporte.
Cas de test
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
Les points bonus pour une Fourier -Basé approche de Fourier .
la source
k % k = 0
k
.Réponses:
Code machine x86-64, 18 octets
Ce code définit une fonction en langage machine x86-64 qui calcule
bounce(x, k
). Conformément à la convention d'appel System V AMD64 utilisée sur les systèmes Gnu / Unix, lex
paramètre est transmis dans leEDI
registre, tandis que lek
paramètre est transmis dans leESI
registre. Comme pour toutes les conventions d'appel x86, le résultat est renvoyé dans leEAX
registre.Pour appeler cela depuis C, vous le prototyperiez comme suit:
Essayez-le en ligne!
Mnémoniques d'assemblage non golfés:
Notez que la première section (qui prend la valeur absolue) aurait pu être écrite de manière équivalente:
qui est exactement le même nombre d'octets (6). Les performances devraient être similaires, peut-être légèrement plus rapides (sauf sur certaines puces Intel, où les mouvements conditionnels sont lents ).
XCHG
est, bien sûr, relativement lent et ne serait pas préféré à l'MOV
exception du golf de code (que le premier est de 1 octet lorsque l'un des opérandes est l'accumulateur, alors qu'un registre-registreMOV
est toujours de 2 octets).la source
Gelée , 3 octets
Essayez-le en ligne!
Ftw intégré.
Explication
æ%
est un utile intégré ici. Je ne sais pas comment le décrire, donc je vais juste fournir la sortie pour certaines entrées:Comme
x
va de0
à l'infini,xæ%4
va0,1,2,3,4,(-3,-2,-1,0,1,2,3,4,)
où la partie entre parenthèses est répétée à l'infini dans les deux sens.la source
Python 2 ,
2927 octetsEssayez-le en ligne!
la source
Python 3 , 27 octets
Essayez-le en ligne!
la source
Ruby,
40 octets32 octetsEssayez-le en ligne!
Explication
Salut, c'est ma première réponse sur ce site! Ce code est basé sur l'observation que la fonction de rebond se comporte exactement comme modulo lorsque ( n -1) k <= x < nk et n est impair, et se comporte comme une opération modulo inversée lorsque n est pair.
(x/k+1)
est le plus petit entier supérieur à x / k (qui est x / k +1 arrondi à un entier). Par conséquent,(x/k+1)
trouve le n mentionné ci-dessus.%2>0
vérifie si n est impair ou pair. Si n mod 2> 0, alors n est impair. Si nmod 2 = 0, alors n est pair. Si n est impair, alors la fonction de rebond doit être égale à x mod k . Si n est pair, la fonction de rebond doit être l'inverse, égale à k - x mod k . L'expression entière(x/k+1)%2>0?x%k:k-x%k
trouve n , puis exécute le x mod k s'il est impair, et exécute k - x mod k sinon.La réponse a été améliorée sur la base d'une suggestion de Cyoce .
la source
def b(x,k) ... end
utilisation->x,k{...}
.to_i
n'est pas nécessaire.Mathematica, 19 octets
la source
Pyth , 5 octets
Vérifiez tous les cas de test.
Fork de ma réponse Python .
la source
J, 25 octets
Allusion:
Voici une solution (pas encore bien golfée) dans J. Essayera de s'améliorer demain:
comprimé:
[((|~#){])(i.@>:,}:@i.@-)@]
compressé2:
[((|~#){])(<:|.|@}.@i:)@]
Essayez-le en ligne!
la source
i:
peux l'utiliser ici, mais je n'ai pas encore essayé de solutioni:
. Je n'ai tout simplement pas eu le temps de mettre à jour le principal et de fournir une explication. Je m'attends à ce qu'un expert puisse raser encore 4 ou 5 octets au moins ...((|~#){])]-|@}:@i:
pour 18 octetsQBIC ,
253027 octetsA fait un peu de restructuration ...
Explication
la source
x
-13 et àk
14 ans.abs
deux fois?C89, 40 octets
Port AC de ma réponse de code machine x86 , cela définit une fonction
f
, qui calcule le rebond-modulo pour les paramètresx
etk
.Il utilise la règle implicit-int de C89, de sorte que les deux paramètres, la variable globale
t
et la valeur de retour de la fonction sont tous implicitement de typeint
. La variable globalet
est juste utilisée pour contenir une valeur temporaire, ce qui finit par économiser des octets, par rapport à la répétition du calcul de chaque côté de l'opérateur conditionnel.La
abs
fonction (valeur absolue) est fournie dans l'en-<stdlib.h>
tête, mais nous n'avons pas à l'inclure ici, encore une fois grâce à la règle implicite-int de C89 (où la fonction est implicitement déclarée et supposée retournerint
).Essayez-le en ligne!
Version non golfée:
En regardant cela à la lumière de mon code machine réglé à la main , les compilateurs génèrent en fait une assez bonne sortie pour cela. Je veux dire, ils devraient; c'est une fonction assez simple à optimiser! J'ai cependant découvert un bogue mineur dans l'optimiseur x86-64 de GCC , où il produit curieusement un code plus gros lorsque vous lui dites d'optimiser la taille et un code plus petit lorsque vous lui dites d'optimiser la vitesse .
la source
m;f(x,k){m=abs(x%k);x=x/k%2?k-m:m;}
est plus courtHaskell, 37 octets
Essayez-le en ligne!
Comment utiliser:
Appelez comme
15#14
pour les arguments gauches non négatifs et comme(-13)#14
pour les arguments gauches négatifs, car Haskell interpréterait-13#14
comme-(13#14)
si vous utilisiez quelque chose commeghci
. Le lien TIO prend simplement deux arguments de ligne de commande.Explication:
Redéfinit d'abord l'opérateur d'infixe binaire
!
pour qu'il soit identique àmod
. Haskell affichemod
toujours une valeur non négative, nous n'avons donc pas besoin de ceabs
que font les autres solutions ici. Il vérifie ensuite six/k
(division entière) est impair et si c'est le cas, retournek-x mod k
(c'est-à-dire le back-bounce) ou bien il retournex mod k
.la source
!
car cela n'économise aucun octetx#k|odd$x`div`k=k-x`mod`k|1<2=x`mod`k
PHP,
4050 octetsputain de dollars. putain de frais généraux d'importation. :)
version entière:
ou
version flottante, 56 octets:
Remplacez
abs($x)%$k
parfmod(abs($x),$k)
.modifier: résultats fixes pour négatif
x
la source
€argv
ou£argv
? Celles-ci auraient fière allure: xJavaScript (ES6),
3632 octetsRebondit récursivement
x
contre0
etk
, tellement dans l'esprit du défi.la source
Lisp commun, 41 octets
Essayez-le en ligne!
la source
C (gcc),
4353 octetsModifier: correction d'un problème négatif
Essayez-le en ligne!
la source
R, 28 octets
Qui évalue à la fonction:
Ce qui semble être la méthode utilisée par la plupart des solutions. Je ne les ai pas regardés avant de faire ça.
la source