O gráfico da operação do módulo ( ) fica assim:
Essa é uma função muito útil, pois permite criar um comportamento de "quebra automática". No entanto, é muito complicado quando eu quero usá-lo para criar uma aparência de "saltar" entre duas paredes. O gráfico da função "rejeição" ( ) tem a seguinte aparência:
O período do gráfico de é . O período do gráfico de é , porque se move para cima por unidades e depois se move para baixo por outras unidades, antes de retornar ao local onde foi iniciado. Para ambas as funções, o valor mínimo para é 0 e o máximo é (na verdade, para a função de módulo com entradas integrais, é ). Além disso, para ambas as funções, o valor em que é 0.k y = ressalto ( x , k ) 2 k k k y k k - 1 x = 0
O desafio
Dado um número inteiro e um número inteiro positivo , retorne uma aproximação de número inteiro ou de ponto flutuante de .k y = salto ( x , k )
Isso é código-golfe , portanto, o menor envio válido (contado em bytes) vence.
Casos de teste
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
Os pontos de bónus para um Fourier baseados abordagem em Fourier .
fonte
k % k = 0
k
.Respostas:
Código da máquina x86-64, 18 bytes
Este código define uma função na linguagem de máquina x86-64 que calcula
bounce(x, k
). Após a convenção de chamada System64 AMD64 usada nos sistemas Gnu / Unix, ox
parâmetro é passado noEDI
registro, enquanto ok
parâmetro é passado noESI
registro. Como em todas as convenções de chamada x86, o resultado é retornado noEAX
registro.Para chamar isso de C, você deve fazer o protótipo da seguinte maneira:
Experimente online!
Mnemônicos de montagem não destruídos:
Observe que a primeira seção (que leva o valor absoluto) poderia ter sido escrita de forma equivalente:
que é exatamente o mesmo número de bytes (6). O desempenho deve ser semelhante, talvez um pouco mais rápido (exceto em determinados chips da Intel, onde os movimentos condicionais são lentos ).
XCHG
é, é claro, relativamente lento e não seria preferido,MOV
exceto no código de golfe (que o primeiro tem 1 byte quando um dos operandos é o acumulador, enquanto um registradorMOV
é sempre de 2 bytes).fonte
Geléia , 3 bytes
Experimente online!
Ftw interno.
Explicação
æ%
é um útil embutido aqui. Não sei como descrevê-lo, então fornecerei a saída para algumas entradas:Como
x
vai do0
infinito,xæ%4
vai para0,1,2,3,4,(-3,-2,-1,0,1,2,3,4,)
onde a parte entre parênteses é repetida até o infinito nos dois sentidos.fonte
Python 2 ,
2927 bytesExperimente online!
fonte
Python 3 , 27 bytes
Experimente online!
fonte
Ruby,
40 bytes32 bytesExperimente online!
Explicação
Olá, esta é a minha primeira resposta neste site! Esse código é baseado na observação de que a função de rejeição se comporta exatamente como o módulo quando ( n -1) k <= x < nk e n é ímpar e se comporta como uma operação de módulo invertido quando n é par.
(x/k+1)
é o menor número inteiro maior que x / k (que é x / k +1 arredondado para um número inteiro). Portanto,(x/k+1)
encontra o n mencionado acima.%2>0
verifica se n é ímpar ou par. Se n mod 2> 0, então n é ímpar. Se nmod 2 = 0, então n é par. Se n for ímpar, a função de rejeição deve ser igual a x mod k . Se n for par, a função de rejeição deve ser o inverso, igual a k - x mod k . A expressão inteira(x/k+1)%2>0?x%k:k-x%k
encontra n , depois executa x mod k, se for ímpar, e executa k - x mod k, caso contrário.A resposta foi aprimorada com base em uma sugestão da Cyoce .
fonte
def b(x,k) ... end
usar->x,k{...}
.to_i
não é necessário.Mathematica, 19 bytes
fonte
Pitão , 5 bytes
Verifique todos os casos de teste.
Garfo da minha resposta Python .
fonte
J, 25 bytes
Dica:
Aqui está uma solução (ainda não bem-desenvolvida) em J. Tentará melhorar amanhã:
comprimido:
[((|~#){])(i.@>:,}:@i.@-)@]
compressed2:
[((|~#){])(<:|.|@}.@i:)@]
Experimente online!
fonte
i:
pode ser usado aqui, mas ainda não tentei uma solução #i:
. Só não tive tempo de atualizar o principal e fornecer uma explicação. Espero que um especialista poderia raspar mais 4 ou 5 bytes, pelo menos ...((|~#){])]-|@}:@i:
para 18 bytesQBIC ,
253027 bytesFiz um pouco de reestruturação ...
Explicação
fonte
x
-13 ek
14.abs
duas vezes?C89, 40 bytes
A porta CA da resposta do meu código de máquina x86 define uma função
f
que calcula o módulo de rejeição para os parâmetrosx
ek
.Ele usa a regra implit-int do C89, para que ambos os parâmetros, a variável global
t
e o valor de retorno da função sejam implicitamente do tipoint
. A variável globalt
é usada apenas para armazenar um valor temporário, que acaba salvando bytes, em comparação com a repetição da computação nos dois lados do operador condicional.A
abs
função (valor absoluto) é fornecida no<stdlib.h>
cabeçalho, mas não precisamos incluí-la aqui, novamente graças à regra implit-int do C89 (onde a função é implicitamente declarada e supõe-se que retorneint
).Experimente online!
Versão não destruída:
Olhando isso à luz do meu código de máquina ajustado à mão , os compiladores realmente geram uma saída muito boa para isso. Quero dizer, eles deveriam; é uma função bastante simples de otimizar! No entanto, eu descobri um pequeno bug no otimizador x86-64 do GCC , onde, curiosamente, produz código maior quando você pede para otimizar o tamanho e código menor quando você pede para otimizar a velocidade .
fonte
m;f(x,k){m=abs(x%k);x=x/k%2?k-m:m;}
é menorHaskell, 37 bytes
Experimente online!
Como usar:
Ligue
15#14
para argumentos à esquerda não negativos e(-13)#14
para argumentos à esquerda negativos, porque Haskell interpretaria-13#14
como-(13#14)
se você estivesse usando algo parecidoghci
. O link TIO simplesmente aceita dois argumentos de linha de comando.Explicação:
Primeiro redefine o operador de infixo binário
!
para ser o mesmo quemod
. A Haskellmod
sempre gera um valor não negativo, portanto não precisamos dasabs
outras soluções aqui. Em seguida, verifica sex/k
(divisão inteira) é ímpar e, em caso afirmativo, retornak-x mod k
(ou seja, o retorno) ou então retornax mod k
.fonte
!
, uma vez que não salva nenhum bytes maisx#k|odd$x`div`k=k-x`mod`k|1<2=x`mod`k
PHP,
4050 bytesmalditos dólares. maldita sobrecarga de importação. :)
versão inteira:
ou
versão flutuante, 56 bytes:
Substitua
abs($x)%$k
porfmod(abs($x),$k)
.editar: resultados fixos para negativos
x
fonte
€argv
ou£argv
? Isso seria bom: xJavaScript (ES6),
3632 bytesBate
x
contra recursivamente0
ek
, muito no espírito do desafio.fonte
Lisp comum, 41 bytes
Experimente online!
fonte
C (gcc),
4353 bytesEditar: problema negativo corrigido
Experimente Online!
fonte
R, 28 bytes
Que avalia a função:
Qual parece ser o método usado pela maioria das soluções. Eu não olhei para eles antes de fazer isso.
fonte