Tarea:
Dado el índice de muestra, x, calcule el valor de muestra f (x) de la onda triangular, con un período de 4 muestras y amplitud 1. La compensación puede ser negativa y el valor de la muestra podría ser {0, 1, -1}.
Casos de prueba:
-5 -> -1
-4 -> 0
-3 -> 1
-2 -> 0
-1 -> -1
0 -> 0
1 -> 1
2 -> 0
3 -> -1
4 -> 0
5 -> 1
Personalmente, conozco dos enfoques en C: el primero usa la tabla de búsqueda, el segundo usa las instrucciones condicionales. Para los puntos de brownie, ¿podría impresionarme con un enfoque puramente "matemático"? (Me refiero a un enfoque funcional puro, por ejemplo, no usar instrucciones condicionales o usar memoria para LUT). Pero esto no es una restricción. Si no puede o su idioma no lo admite, simplemente publique cualquier solución
Respuestas:
Mathematica, 8 bytes
Explicación
fuente
TI-Basic,
754 bytes(Modo de grado) -1 byte de @immibis de mi respuesta anterior.
Vieja respuesta
Enfoque matemático puro en una calculadora. :)
Solo por diversión, aquí hay otra solución de matemática pura (ish) para 9 bytes (en modo radianes) u 8 bytes (modo de grados)
fuente
imag()
es una función válida en TI-BASIC.sin(90Ans
? ¿Por qué necesitas el extra90-1sin-1
?Python 2 , 20 bytes
Pruébalo en línea!
Estoy ejecutando una búsqueda de fuerza bruta para expresiones aritméticas o bit a bit más cortas, veré si aparece algo. Este lo encontré a mano.
fuente
Julia 0.5 , 12 bytes
Me gusta este enfoque porque es poco probable que sea el más corto en cualquier otro idioma.
Pruébalo en línea!
Cómo funciona
La precedencia del operador de Julia es un poco inusual: a diferencia de la mayoría de los otros lenguajes, los operadores bit a bit tienen la misma precedencia que sus contrapartes aritméticas, por lo que
&
(multiplicación bit a bit) tiene la misma precedencia que*
.Primero,
n&3
toma el módulo de entrada 4 , con signo positivo.El resultado, 0 , 1 , 2 o 3 , se resta de 2 , produciendo 2 , 1 , 0 o -1 .
Finalmente, tomamos el resto firmado de la división por 2 , devolviendo 0 , 1 , 0 o -1 .
fuente
Jalea , 3 bytes
Pruébalo en línea!
Cómo funciona
fuente
dc, 13
No estoy seguro si cuenta el
%
operador de módulo como "matemática pura":Pruébalo en línea . Tenga en cuenta que se
dc
utiliza en_
lugar de-
para indicar números negativos.Explicación
Tenga en cuenta que
dc
el%
operador mod es la versión estándar de "CPU" que asigna valores negativos a valores negativos.fuente
abs((x+1)%4)-1
lugar?brainfuck , 136 bytes
Pruébalo en línea!
Probablemente haya una respuesta más trivial, pero esto esencialmente usa una tabla de valores. Aunque brainfuck toma de entrada como caracteres ASCII con valores positivos de 0 a 127, aún funciona como si fuera capaz de aceptar los valores negativos (a prueba, reemplazar el
,
conn
cantidad de-
caracteres).Cómo funciona
fuente
Python,
262421 bytes-2 bytes gracias a ValueInk por darse cuenta de que el método matemático es en realidad más largo que el enfoque trivial: P
-3 bytes gracias a Dennis por señalar que no necesito el
int(...)
, lo que lo hace más corto :)fuente
lambda x:[0,1,0,-1][x%4]
en realidad es más corto que su respuesta int-coerced lolint()
en primer lugar?.imag
da un valor de punto flotante y no estoy seguro si eso está permitido por las especificaciones. Ahora no importa :)Python , 20 bytes
Una función sin nombre que devuelve el resultado.
Pruébalo en línea!
fuente
Mathematica, 18 bytes
fuente
JacobiSymbol[-4,#]&
funciona y solo cuesta un byte más. ¡Buena idea!Pari / GP , 12 bytes
Pruébalo en línea!
fuente
PHP, 20 bytes
fuente
Haskell , 19 bytes
La solución Julia de Port of Dennis, solo porque dijo que no sería la más corta en ningún otro idioma. (Alguien aún podría demostrarme que estoy equivocado de que es el más corto en Haskell).
Pruébalo en línea!
Haskell tiene dos funciones restantes diferentes, una (
rem
) funciona como la de Julia, mientras que la otra (mod
) da un resultado positivo incluso cuando el primer argumento es negativo, por lo que es adecuado para traducir&3
. (Haskell real&
, llamado.&.
, por desgracia requiere unimport Data.Bits
.)fuente
Octava , 22 bytes
Pruébalo en línea!
fuente
Rubí, 20 bytes.
Simple y limpio.
fuente
C99, 27 bytes
Suponiendo que desea que la onda se centre en el origen:
de lo contrario
f(n){return cpow(1i,n);}
lo haré. Originalmente tenía uncimag
allí, pero aparentemente tratar de devolver unint
de un_Complex int
produce la parte real, así que lo usé. Tiene sentido, pero no es nada que hubiera predicho. El comportamiento es el mismo engcc
yclang
fuente
-std=c99 -lm
y debería funcionar. Funciona bien para mí con ambosgcc
yclang
sin ningún tipo de incluye. Bueno, bien, quiero decir que no hay errores, sino una gran cantidad de advertencias.05AB1E , 5 bytes
Pruébalo en línea!
La salida se invierte, pero por lo que entendí esto está permitido:
+1 byte para multiplicar la salida por -1 usando
(
.fuente
Pyth - 7 bytes (posiblemente 6)
Intentalo
Si la fase de la ola no es importante, 6 bytes:
Intentalo
Explicación:
fuente
AWK , 26 bytes
Pruébalo en línea!
Este es un enfoque alternativo que utiliza funciones trigonométricas sin el operador de módulo.
Pruébalo en línea!
fuente
Javascript ES6,
1817 bytesPrimero, verifique si la entrada es par o impar y devuelva 0 para todos los valores pares. Para todas las entradas impares, incremente y bit a bit con
0b10
para eliminar cualquier bit que no nos interese, luego devuelva la respuesta con un desplazamiento.fuente
? :0
con&&
JavaScript, 15 bytes
Bitwise y 3 es equivalente al módulo 4, excepto sin la extraña regla de los módulos de números negativos de JavaScript. Al principio hice una regresión polinómica en los primeros cuatro puntos, pero luego me di cuenta de que estaba siendo tonto porque (1, 1), (2, 0) y (3, -1) son solo 2-n.
fuente
R , 19 bytes
Pruébalo en línea!
Un puerto de respuesta Mathematica de JungHwan Min .
fuente