Задача:
Для заданного индекса выборки x рассчитайте значение выборки f (x) треугольной волны с периодом 4 выборки и амплитудой 1. Смещение может быть отрицательным, а значение выборки может быть равно {0, 1, -1}.
Тестовые случаи:
-5 -> -1
-4 -> 0
-3 -> 1
-2 -> 0
-1 -> -1
0 -> 0
1 -> 1
2 -> 0
3 -> -1
4 -> 0
5 -> 1
Лично я знаю два подхода в C - первый использует справочную таблицу, второй использует условные инструкции. Что касается очков брауни, не могли бы вы произвести на меня впечатление чисто математическим подходом? (Я имею в виду чисто функциональный подход, например, не использование условных инструкций или использование памяти для LUT.) Но это не ограничение. Если вы не можете или ваш язык не поддерживает это - просто опубликуйте любое решение
Ответы:
Mathematica, 8 байт
объяснение
источник
TI-Basic,
754 байта(Градусный режим) -1 байт из @immibis из моего старого ответа.
Старый ответ
Чисто-математический подход на калькуляторе. :)
Просто для удовольствия, вот еще одно чисто математическое (ish) решение для 9 байтов (в радианском режиме) или 8 байтов (в градусном режиме)
источник
imag()
является действительной функцией на TI-BASIC.sin(90Ans
? Зачем вам нужно лишнее90-1sin-1
?Python 2 , 20 байт
Попробуйте онлайн!
Я провожу поиск грубой силы для более коротких арифметических или побитовых выражений, посмотрю, появится ли что-нибудь. Этот я нашел вручную.
источник
Юлия 0,5 , 12 байт
Мне нравится этот подход, потому что он вряд ли будет самым коротким на любом другом языке.
Попробуйте онлайн!
Как это работает
Приоритет оператора Джулии немного необычен: в отличие от большинства других языков, побитовые операторы имеют тот же приоритет, что и их арифметические аналоги, поэтому
&
(побитовое умножение) имеет тот же приоритет, что и*
.Сначала
n&3
принимает вход по модулю 4 , с положительным знаком.Результат - 0 , 1 , 2 или 3 - затем вычитается из 2 , давая 2 , 1 , 0 или -1 .
Наконец, мы берем остаток от деления со знаком 2 , возвращая 0 , 1 , 0 или -1 .
источник
Желе , 3 байта
Попробуйте онлайн!
Как это работает
источник
дк, 13
Не уверен, если вы считаете
%
оператор по модулю «чистой математикой»:Попробуйте онлайн . Обратите внимание, что
dc
используется_
вместо-
обозначения отрицательных чисел.объяснение
Обратите внимание , что
dc
«S%
мод оператором является стандартной„CPU“версия , которая отображает отрицательные значения до отрицательных значений.источник
abs((x+1)%4)-1
вместо этого?брейкфук , 136 байт
Попробуйте онлайн!
Возможно, есть более тривиальный ответ, но в сущности он использует таблицу значений. Хотя Brainfuck принимает входные данные как ASCII символы с положительными значениями от 0 до 127, он все еще работает , как если бы он был в состоянии принять отрицательные значения (для тестирования, замены
,
сn
количеством-
символов).Как это работает
источник
Python,
262421 байт-2 байта благодаря ValueInk за понимание того, что математический метод на самом деле длиннее тривиального подхода: P
-3 байта, спасибо Деннису за то, что он указал, что мне не нужен
int(...)
, что делает его короче :)источник
lambda x:[0,1,0,-1][x%4]
на самом деле короче, чем ваш вынужденный ответ lolint()
в первую очередь, хотя?.imag
дает значение с плавающей точкой, и я не уверен, что это разрешено спецификациями. Неважно сейчас :)Python , 20 байт
Безымянная функция, которая возвращает результат.
Попробуйте онлайн!
источник
Mathematica, 18 байт
источник
JacobiSymbol[-4,#]&
не менее, работает, и просто стоит еще один байт. Хорошая идея!Пари / ГП , 12 байт
Попробуйте онлайн!
источник
PHP, 20 байт
источник
Haskell , 19 байтов
Решение Джулии из Port of Dennis только потому, что он сказал, что оно не будет самым коротким на любом другом языке. (Кто-то может доказать, что я ошибаюсь, что он самый короткий в Хаскеле.)
Попробуйте онлайн!
В Haskell есть две разные функции остатка: одна (
rem
) работает как функция Джулии, а другая (mod
) дает положительный результат, даже если первый аргумент отрицательный, и поэтому подходит для перевода&3
. ( Фактически&
, Haskell называется.&.
, увы, требуетimport Data.Bits
.)источник
Октава , 22 байта
Попробуйте онлайн!
источник
Рубин, 20 байтов
Просто и чисто.
источник
C99, 27 байт
Предполагая, что вы хотите, чтобы волна была центрирована в начале координат:
иначе
f(n){return cpow(1i,n);}
сделаем. Первоначально я былcimag
там, но , видимо , пытаясь возвращатьint
от А_Complex int
доходности вещественной части, так что я использовал это. Это имеет смысл, но я ничего не предсказал. Поведение же самое вgcc
иclang
источник
-std=c99 -lm
и это должно работать. Он отлично работает для меня с обоимиgcc
иclang
без каких-либо включает. Ну, хорошо, я имею в виду нет ошибок, но большое количество предупреждений.05AB1E , 5 байтов
Попробуйте онлайн!
Вывод обратный, но из того, что я понял, это разрешено:
+1 байт, чтобы умножить вывод на -1, используя
(
.источник
Pyth - 7 байт (возможно, 6)
Попробуй это
Если фаза волны не важна, 6 байтов:
Попробуй это
Объяснение:
источник
AWK , 26 байт
Попробуйте онлайн!
Это альтернативный подход с использованием тригонометрических функций без оператора модуля.
Попробуйте онлайн!
источник
Javascript ES6,
1817 байтВо-первых, проверьте, является ли вход четным или нечетным, и верните 0 для всех четных значений. Для всех нечетных входов увеличьте и поразрядно с,
0b10
чтобы удалить все биты, которые нас не интересуют, а затем верните ответ со смещением.источник
? :0
на&&
JavaScript, 15 байт
Побитовое и 3 эквивалентно модулю 4, за исключением без странного правила для модулей JavaScript отрицательных чисел. Сначала я выполнил полиномиальную регрессию по первым четырем точкам, но потом понял, что я тупой, потому что (1, 1), (2, 0) и (3, -1) просто 2-n.
источник
R , 19 байт
Попробуйте онлайн!
Порт ответа JungHwan Min's Mathematica .
источник