Tarefa:
Dado o índice amostral, x, calcule o valor amostral f (x) da onda triangular, com período de 4 amostras e amplitude 1. O deslocamento pode ser negativo e o valor da amostra pode ser {0, 1, -1}.
Casos de teste:
-5 -> -1
-4 -> 0
-3 -> 1
-2 -> 0
-1 -> -1
0 -> 0
1 -> 1
2 -> 0
3 -> -1
4 -> 0
5 -> 1
Pessoalmente, conheço duas abordagens em C - a primeira está usando a tabela de pesquisa, a segunda está usando instruções condicionais. Para pontos brownie, você poderia me impressionar com uma abordagem "matemática" pura? (Quero dizer uma abordagem funcional pura, por exemplo, não usar instruções condicionais ou usar memória para LUT.) Mas isso não é uma restrição. Se você não pode, ou o seu idioma não o suporta - basta postar qualquer solução
Respostas:
Mathematica, 8 bytes
Explicação
fonte
TI-Básico,
754 bytes(Modo Grau) -1 byte de @immibis da minha resposta antiga.
Resposta antiga
Abordagem de matemática pura em uma calculadora. :)
Apenas por diversão, aqui está outra solução de matemática pura (ish) para 9 bytes (no modo radiano) ou 8 bytes (modo Grau)
fonte
imag()
é uma função válida no TI-BASIC.sin(90Ans
? Por que você precisa do extra90-1sin-1
?Python 2 , 20 bytes
Experimente online!
Estou executando uma pesquisa de força bruta por expressões aritméticas ou bit a bit mais curtas, vou ver se algo aparece. Este eu encontrei à mão.
fonte
Julia 0,5 , 12 bytes
Eu gosto dessa abordagem porque é improvável que seja a mais curta em qualquer outro idioma.
Experimente online!
Como funciona
A precedência do operador de Julia é um pouco incomum: ao contrário da maioria dos outros idiomas, os operadores bit a bit têm a mesma precedência que suas contrapartes aritméticas, portanto
&
(multiplicação por bit) tem a mesma precedência que*
.Primeiro,
n&3
pega o módulo de entrada 4 , com sinal positivo.O resultado - 0 , 1 , 2 ou 3 - é subtraído de 2 , produzindo 2 , 1 , 0 ou -1 .
Finalmente, pegamos o restante assinado da divisão por 2 , retornando 0 , 1 , 0 ou -1 .
fonte
Gelatina , 3 bytes
Experimente online!
Como funciona
fonte
dc, 13
Não tenho certeza se você considera o
%
operador módulo como "matemática pura":Experimente online . Observe que
dc
usa em_
vez de-
para indicar números negativos.Explicação
Observe que
dc
o%
operador mod é a versão "CPU" padrão que mapeia valores negativos para valores negativos.fonte
abs((x+1)%4)-1
?brainfuck , 136 bytes
Experimente online!
Provavelmente há uma resposta mais trivial, mas isso essencialmente usa uma tabela de valores. Embora brainfuck leva entrada como caracteres ASCII com valores positivos de 0 a 127, ele ainda funciona como se fosse capaz de aceitar valores negativos (para teste, substitua o
,
comn
quantidade de-
caracteres).Como funciona
fonte
Python,
262421 bytes-2 bytes graças ao ValueInk por perceber que o método matemático é realmente mais longo do que a abordagem trivial: P
-3 bytes graças a Dennis por apontar que não preciso do
int(...)
, tornando assim mais curto :)fonte
lambda x:[0,1,0,-1][x%4]
é na verdade menor do que a sua resposta lol coagido-intint()
em primeiro lugar?.imag
fornece um valor de ponto flutuante e não tenho certeza se isso é permitido pelas especificações. Não importa agora :)Python , 20 bytes
Uma função sem nome que retorna o resultado.
Experimente online!
fonte
Mathematica, 18 bytes
fonte
JacobiSymbol[-4,#]&
funciona e custa apenas mais um byte. Boa ideia!Pari / GP , 12 bytes
Experimente online!
fonte
PHP, 20 bytes
fonte
Haskell , 19 bytes
A solução Julia do Porto da Dennis, só porque ele disse que não seria o mais curto em nenhum outro idioma. (Alguém ainda pode me provar que é o menor em Haskell.)
Experimente online!
Haskell tem duas funções remanescentes diferentes, uma (
rem
) funciona como a Julia, enquanto a outra (mod
) fornece um resultado positivo mesmo quando o primeiro argumento é negativo e, portanto, é adequado para a tradução&3
. (De Haskell reais&
, chamados.&.
, infelizmente requer umaimport Data.Bits
.)fonte
Oitava , 22 bytes
Experimente online!
fonte
Ruby, 20 bytes
Simples e limpo.
fonte
C99, 27 bytes
Supondo que você queira que a onda seja centralizada na origem:
caso contrário
f(n){return cpow(1i,n);}
, fará. Eu originalmente tinha umcimag
lá, mas aparentemente tentando retornar umint
de um_Complex int
produz a parte real, então usei isso. Faz sentido, mas não é nada que eu tenha previsto. O comportamento é o mesmogcc
eclang
fonte
-std=c99 -lm
e deve funcionar. Funciona bem para mim, comgcc
eclang
sem inclusão. Bem, quero dizer que não há erros, mas um grande número de avisos.05AB1E , 5 bytes
Experimente online!
A saída é invertida, mas pelo que entendi isso é permitido:
+1 byte para multiplicar a saída por -1 usando
(
.fonte
Pitão - 7 bytes (possivelmente 6)
Tente
Se a fase da onda não for importante, 6 bytes:
Tente
Explicação:
fonte
AWK , 26 bytes
Experimente online!
Essa é uma abordagem alternativa usando funções trigonométricas sem o operador de módulo.
Experimente online!
fonte
Javascript ES6,
1817 bytesPrimeiro, verifique se a entrada é par ou ímpar e retorne 0 para todos os valores pares. Para todas as entradas ímpares, incremente e bit a bit com
0b10
para remover os bits que não nos interessam e, em seguida, retorne a resposta com um deslocamento.fonte
? :0
por #&&
JavaScript, 15 bytes
Bitwise e 3 é equivalente ao módulo 4, exceto sem a regra estranha dos módulos de números negativos do JavaScript. Fiz uma regressão polinomial nos quatro primeiros pontos no início, mas depois percebi que estava sendo burro porque (1, 1), (2, 0) e (3, -1) são apenas 2-n.
fonte
R , 19 bytes
Experimente online!
Um porto da resposta Mathematica de JungHwan Min .
fonte