График операции по модулю ( ) выглядит следующим образом:
Это очень полезная функция, так как она позволяет нам создавать поведение «обтекания». Тем не менее, это очень громоздко, когда я хочу использовать его, чтобы создать видимость "подпрыгивания" между двумя стенами. График функции "bounce" ( ) выглядит следующим образом:
Период графика есть . Период графика равен , потому что он перемещается вверх на единиц, а затем движется вниз на другие единиц, прежде чем вернуться к тому, с чего начал. Для обеих функций минимальное значение для равно 0, а максимальное равно (на самом деле для функции модуля со встроенными входами это ). Кроме того, для обеих функций значение равно 0.k y = отскок ( x , k ) 2 k k k y k k - 1 x = 0
Соревнование
Если задано целое число и положительное целое число , вернуть целочисленное значение или приближение с плавающей запятой для .к у = отказов ( х , к )
Это код-гольф , поэтому выигрывает самая короткая действительная заявка (в байтах).
Тестовые случаи
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
источник
k % k = 0
k
.Ответы:
Машинный код x86-64, 18 байт
Этот код определяет функцию на машинном языке x86-64, которая вычисляет
bounce(x, k
). В соответствии с соглашением о вызовах AMD64 в System V, используемым в системах Gnu / Unix,x
параметр передается вEDI
регистр, аk
параметр передается вESI
регистр. Как и во всех соглашениях о вызовах x86, результат возвращается вEAX
регистр.Чтобы вызвать это из C, вы должны создать его следующим образом:
Попробуйте онлайн!
Неуправляемая сборка мнемоники:
Обратите внимание, что первый раздел (который принимает абсолютное значение) может быть эквивалентно написан:
что такое же количество байтов (6). Производительность должна быть схожей, возможно, немного быстрее (за исключением некоторых чипов Intel, где условные перемещения медленные )
XCHG
это, конечно, относительно медленно и не будет предпочтительнее,MOV
кроме как в кодовом гольфе (то, что первый является 1-байтовым, когда один из операндов является аккумулятором, тогда как регистр-регистрMOV
всегда равен 2 байта).источник
Желе , 3 байта
Попробуйте онлайн!
Встроенные модули
объяснение
æ%
полезный встроенный здесь. Я не знаю, как это описать, поэтому я просто предоставлю вывод для некоторых входных данных:Как
x
идет от0
бесконечности,xæ%4
идет0,1,2,3,4,(-3,-2,-1,0,1,2,3,4,)
туда , где часть в скобках повторяется до бесконечности в обоих направлениях.источник
Python 2 ,
2927 байтПопробуйте онлайн!
источник
Python 3 , 27 байт
Попробуйте онлайн!
источник
Рубин,
40 байтов32 байтаПопробуйте онлайн!
объяснение
Привет, это мой первый ответ на этом сайте! Этот код основан на наблюдении, что функция bounce ведет себя точно так же, как по модулю, когда ( n -1) k <= x < nk, и n нечетно, и ведет себя как обратная операция по модулю, когда n четно.
(x/k+1)
Наименьшее целое число больше, чем х / к (то есть х / к + 1, округленное до целого числа). Таким образом,(x/k+1)
находит п упомянуто выше.%2>0
проверяет, является ли n нечетным или четным. Если n mod 2> 0, то n нечетно. Если нmod 2 = 0, тогда n чётно. Если n нечетно, то функция bounce должна быть равна x mod k . Если n четное, функция отскока должна быть обратной, равной k - x mod k . Целое выражение(x/k+1)%2>0?x%k:k-x%k
находит n , затем выполняет x mod k, если оно нечетное, и в противном случае выполняет k - x mod k .Ответ был улучшен на основе предложения от Cyoce .
источник
def b(x,k) ... end
использования->x,k{...}
.to_i
этом нет необходимости.Mathematica, 19 байтов
источник
Pyth , 5 байт
Проверьте все тестовые случаи.
Вилка моего Python ответа .
источник
J, 25 байт
Подсказка:
Вот (еще не удачное решение) в J. Попробую улучшить завтра:
сжато:
[((|~#){])(i.@>:,}:@i.@-)@]
compressed2:
[((|~#){])(<:|.|@}.@i:)@]
Попробуйте онлайн!
источник
i:
можно использовать здесь, но я еще не попробовал решениеi:
. Просто не успел обновить основной и дать объяснение. Я ожидаю, что эксперт сможет сбрить еще 4 или 5 байтов как минимум ...((|~#){])]-|@}:@i:
за 18 байтQBIC ,
253027 байтовСделал немного реструктуризации ...
объяснение
источник
x
-13 иk
14.abs
оба раза?C89, 40 байт
AC-порт моего машинного кода ответа x86 , это определяет функцию
f
, которая вычисляет bounce-modulo для параметровx
иk
.Он использует правило неявного-int C89, так что оба параметра, глобальная переменная
t
и возвращаемое значение функции неявно имеют типint
. Глобальная переменнаяt
просто используется для хранения временного значения, которое в конечном итоге сохраняет байты, по сравнению с повторением вычислений по обе стороны от условного оператора.abs
Функция (абсолютное значение) обеспечивается в<stdlib.h>
заголовке, но мы не должны включить его здесь, опять - таки благодаря неявной-ИНТ правило C89 (где функция неявно объявлена и предполагается возвращениеint
).Попробуйте онлайн!
Безголовая версия:
Глядя на это в свете моего вручную настроенного машинного кода , компиляторы на самом деле генерируют довольно хороший результат для этого. Я имею в виду, они должны; это довольно простая функция для оптимизации! Однако я обнаружил небольшую ошибку в оптимизаторе GCC x86-64 , когда он с любопытством создает код большего размера, когда вы говорите ему оптимизировать код по размеру, и код меньшего размера, когда вы говорите ему оптимизировать скорость .
источник
m;f(x,k){m=abs(x%k);x=x/k%2?k-m:m;}
КорочеHaskell, 37 байт
Попробуйте онлайн!
Как использовать:
Вызовите как
15#14
для неотрицательных левых аргументов, так и(-13)#14
для отрицательных левых аргументов, потому что Haskell будет интерпретировать,-13#14
как-(13#14)
будто вы используете что-то подобноеghci
. TIO-ссылка просто принимает два аргумента командной строки.Объяснение:
Сначала переопределяем двоичный инфиксный оператор,
!
чтобы он был таким же, какmod
. Haskell'smod
всегда выдает неотрицательное значение, поэтому нам не нужно то,abs
что здесь делают другие решения. Затем он проверяет, является лиx/k
(целочисленное деление) нечетным, и если да, возвращаетk-x mod k
(то есть обратный отскок) или же возвращаетx mod k
.источник
!
так как это не экономит больше байтовx#k|odd$x`div`k=k-x`mod`k|1<2=x`mod`k
PHP,
4050 байтчертовы доллары чертовски импортные накладные расходы. :)
целочисленная версия:
или
версия с плавающей запятой, 56 байт:
Заменить
abs($x)%$k
наfmod(abs($x),$k)
.редактировать: исправлены отрицательные результаты
x
источник
€argv
или£argv
? Это выглядело бы неплохо: xJavaScript (ES6),
3632 байтаРекурсивно отскакивает
x
от0
иk
, очень сильно, в духе задачи.источник
Common Lisp, 41 байт
Попробуйте онлайн!
источник
C (gcc),
4353 байтаИзменить: Исправлена отрицательная проблема
Попробуйте онлайн!
источник
R, 28 байт
Который оценивает функцию:
Который, кажется, метод, который использует большинство решений. Я не смотрел на них, прежде чем сделать это.
источник