El gráfico de la operación de módulo ( ) se ve así:
Esta es una función muy útil, ya que nos permite crear un comportamiento de "ajuste". Sin embargo, es muy engorroso cuando quiero usarlo para crear una apariencia de "rebote" entre dos paredes. El gráfico de la función "rebote" ( ) se ve así:
El período de la gráfica de es . El período de la gráfica de es , porque se mueve hacia arriba para unidades, y luego se mueve hacia abajo para otras unidades, antes de regresar a donde comenzó. Para ambas funciones, el valor mínimo para es 0, y el máximo es (en realidad, para la función de módulo con entradas integrales, es ). Además, para ambas funciones, el valor donde es 0.k y = rebote ( x , k ) 2 k k k y k k - 1 x = 0
El reto
Dado un entero un entero positivo , devuelve una aproximación entera o de coma flotante de .k y = rebote ( x , k )
Este es el código de golf , por lo que gana el envío válido más corto (contado en bytes).
Casos de prueba
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
Los puntos de bonificación para un Fourier basados en el enfoque de Fourier .
fuente
k % k = 0
k
.Respuestas:
Código de máquina x86-64, 18 bytes
Este código define una función en lenguaje de máquina x86-64 que computa
bounce(x, k
). Siguiendo la convención de llamada System V AMD64 utilizada en los sistemas Gnu / Unix, elx
parámetro se pasa en elEDI
registro, mientras que elk
parámetro se pasa en elESI
registro. Como con todas las convenciones de llamadas x86, el resultado se devuelve en elEAX
registro.Para llamar a esto desde C, debería crear un prototipo de la siguiente manera:
Pruébalo en línea!
Mnemónicos de ensamblaje sin golf:
Tenga en cuenta que la primera sección (que toma el valor absoluto) podría haberse escrito de manera equivalente:
que es exactamente el mismo número de bytes (6). El rendimiento debería ser similar, quizás un poco más rápido (excepto en ciertos chips Intel, donde los movimientos condicionales son lentos ).
XCHG
es, por supuesto, relativamente lento y no se preferiría más queMOV
en golf de código (que el primero es de 1 byte cuando uno de los operandos es el acumulador, mientras que un registro-registroMOV
siempre es de 2 bytes).fuente
Jalea , 3 bytes
Pruébalo en línea!
Incorporado ftw.
Explicación
æ%
es un útil incorporado aquí. No sé cómo describirlo, así que solo proporcionaré la salida para algunas entradas:A medida que
x
va del0
infinito,xæ%4
va0,1,2,3,4,(-3,-2,-1,0,1,2,3,4,)
donde la parte entre paréntesis se repite al infinito en ambos sentidos.fuente
Python 2 ,
2927 bytesPruébalo en línea!
fuente
Python 3 , 27 bytes
Pruébalo en línea!
fuente
Rubí,
40 bytes32 bytesPruébalo en línea!
Explicación
Hola, esta es mi primera respuesta en este sitio. Este código se basa en la observación de que la función de rebote se comporta exactamente como un módulo cuando ( n -1) k <= x < nk yn es impar, y se comporta como una operación de módulo inverso cuando n es par.
(x/k+1)
es el entero más pequeño mayor que x / k (que es x / k +1 redondeado a un entero). Por lo tanto,(x/k+1)
encuentra la n mencionada anteriormente.%2>0
comprueba si n es par o impar. Si n mod 2> 0, entonces n es impar. Si nmod 2 = 0, entonces n es par. Si n es impar, entonces la función de rebote debería ser igual a x mod k . Si n es par, la función de rebote debe ser inversa, igual a k - x mod k . La expresión completa(x/k+1)%2>0?x%k:k-x%k
encuentra n , luego ejecuta x mod k si es impar, y ejecuta k - x mod k de lo contrario.La respuesta fue mejorada en base a una sugerencia de Cyoce .
fuente
def b(x,k) ... end
usar->x,k{...}
.to_i
no es necesario.Mathematica, 19 bytes
fuente
Pyth , 5 bytes
Verifique todos los casos de prueba.
Tenedor de mi respuesta Python .
fuente
J, 25 bytes
Insinuación:
Aquí hay una solución (aún no bien desarrollada) en J. Intentará mejorar mañana:
comprimido:
[((|~#){])(i.@>:,}:@i.@-)@]
comprimido2:
[((|~#){])(<:|.|@}.@i:)@]
Pruébalo en línea!
fuente
i:
se puede usar aquí, pero aún no he probado una solucióni:
. Simplemente no he tenido tiempo de actualizar el principal y proporcionar una explicación. Espero que un experto pueda reducir otros 4 o 5 bytes al menos ...((|~#){])]-|@}:@i:
para 18 bytesQBIC ,
253027 bytesHice un poco de reestructuración ...
Explicación
fuente
x
sea -13 yk
sea 14.abs
dos veces?C89, 40 bytes
El puerto de CA de mi respuesta de código de máquina x86 , esto define una función
f
, que calcula el módulo de rebote para los parámetrosx
yk
.Utiliza la regla implícita-int de C89, de modo que ambos parámetros, la variable global
t
y el valor de retorno de la función son implícitamente de tipoint
. La variable globalt
solo se usa para mantener un valor temporal, que termina guardando bytes, en comparación con la repetición del cálculo a ambos lados del operador condicional.La
abs
función (valor absoluto) se proporciona en el<stdlib.h>
encabezado, pero no tenemos que incluirla aquí, nuevamente gracias a la regla implícita-int de C89 (donde la función se declara implícitamente y se supone que regresaint
).Pruébalo en línea!
Versión sin golf:
Mirando esto a la luz de mi código de máquina sintonizado a mano , los compiladores en realidad generan una salida bastante buena para esto. Quiero decir, deberían; ¡Es una función bastante simple de optimizar! Sin embargo, descubrí un error menor en el optimizador x86-64 de GCC , donde curiosamente produce un código más grande cuando le dice que optimice el tamaño y un código más pequeño cuando le dice que optimice la velocidad .
fuente
m;f(x,k){m=abs(x%k);x=x/k%2?k-m:m;}
es más cortoHaskell, 37 Bytes
Pruébalo en línea!
Cómo usarlo:
llama
15#14
a los argumentos izquierdos no negativos y(-13)#14
a los argumentos izquierdos negativos, porque Haskell interpretaría-13#14
como-(13#14)
si estuvieras usando algo asíghci
. El enlace TIO simplemente toma dos argumentos de línea de comandos.Explicación:
Primero redefine el operador infijo binario
!
para que sea el mismo quemod
. Haskellmod
siempre genera un valor no negativo, por lo que no necesitamos lasabs
otras soluciones que aquí necesitamos . Luego comprueba six/k
(división entera) es impar y, de ser así, regresak-x mod k
(es decir, el rebote) o si no regresax mod k
.fuente
!
ya que no guarda ningún bytex#k|odd$x`div`k=k-x`mod`k|1<2=x`mod`k
PHP,
4050 bytesmalditos dólares. maldita sobrecarga de importación. :)
versión entera:
o
versión flotante, 56 bytes:
Reemplazar
abs($x)%$k
confmod(abs($x),$k)
.editar: resultados fijos para negativo
x
fuente
€argv
o£argv
? Esos se verían bien: xJavaScript (ES6),
3632 bytesRebota de forma recursiva
x
contra0
yk
, por lo mucho en el espíritu del desafío.fuente
Lisp común, 41 bytes
Pruébalo en línea!
fuente
C (gcc),
4353 bytesEditar: problema negativo corregido
Pruébalo en línea!
fuente
R, 28 bytes
Lo que evalúa la función:
Cuál parece ser el método que utilizan la mayoría de las soluciones. No los miré antes de hacer esto.
fuente