Generar señal triangular

9

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

0 '
fuente
3
¿Qué quiere decir con "compensación puede ser negativa"? Además, esto es básicamente una función trigonométrica, por lo que me sorprendería si no es una tontería de algo.
FryAmTheEggman
@JungHwanMin Esto tiene reglas mucho más relajadas, por lo que no es realmente un engaño (aunque pide lo mismo).
Mego
@Mego bien. Retractando mi voto.
JungHwan Min
Relacionado: codegolf.stackexchange.com/q/5522/60043
JungHwan Min
¿Puede la onda estar fuera de fase en relación con el ejemplo?
Maria

Respuestas:

12

Mathematica, 8 bytes

Im[I^#]&

Explicación

Im[I^#]&
   I^#    (* Raise the imaginary unit to the input power *)
Im[   ]   (* Take the imaginary part *)
JungHwan Min
fuente
3
Ohh, hermoso enfoque. ¿Cómo no vi esto? : D
HyperNeutrino
no puedo ver algo cómo generar una unidad imaginaria en C .. = (soy hombre ensamblador ^^ usando builtins en idiomas exóticos no está a mi favor) sin embargo, es una respuesta ..
7

TI-Basic, 7 5 4 bytes

sin(90Ans

(Modo de grado) -1 byte de @immibis de mi respuesta anterior.


Vieja respuesta

imag(i^Ans

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)

2/πsin-1sin(πAns/2 # Radians
90-1sin-1sin(90Ans # Degrees
pizzapants184
fuente
Sí, pero te olvidas una implementación imag () .. pero el código usin demás está muy bien, aunque .. buena respuesta :)
2
@ xakepp35 No entiendo. imag()es una función válida en TI-BASIC.
JungHwan Min
¿Qué tiene de malo sin(90Ans? ¿Por qué necesitas el extra 90-1sin-1?
user253751
@immibis El 90 ^ -1sin ^ -1 lo convierte en una onda triangular para todos los valores, pero sin (90Ans funciona para lo que la pregunta pregunta.
pizzapants184
6

Python 2 , 20 bytes

lambda n:n%2-n%4/3*2

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.

xnor
fuente
2
¿Búsqueda de expresión de fuerza bruta? ¡Agradable!
Graviton
5

Julia 0.5 , 12 bytes

!n=(2-n&3)%2

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&3toma 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 .

Dennis
fuente
4

Jalea , 3 bytes

ı*Ċ

Pruébalo en línea!

Cómo funciona

ı*Ċ  Main link. Argument: n

ı*   Elevate i, the imaginary unit, to the n-th power.
  Ċ  Take the imaginary part of the result.
Dennis
fuente
4

dc, 13

No estoy seguro si cuenta el %operador de módulo como "matemática pura":

?1+d*v4%1-2%p

Pruébalo en línea . Tenga en cuenta que se dcutiliza en _lugar de -para indicar números negativos.

Explicación

?              # read input
 1+            # add 1
   d*v         # duplicate, multiply, square root (poor-mans abs())
      4%       # mod 4
        1-     # subtract 1
          2%   # mod 2
            p  # print

Tenga en cuenta que dcel %operador mod es la versión estándar de "CPU" que asigna valores negativos a valores negativos.

Trauma digital
fuente
¿Puedes hacer en su abs((x+1)%4)-1lugar?
Urna de pulpo mágico
2

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 ,con ncantidad de -caracteres).

Cómo funciona

>,                                   take input (X)
>++++<                               take second input for modulo (4)
[>->+<[>]>[<+>-]<<[<]>-]             calculate X mod 4
>>>>-[>+<-----]>--                   create initial '1' character
[-<+>>>+>>>+>>>+<<<<<<<<]            duplicate '1' four times as 1,1,1,1
<->>>>>>->--[>+<++++++]>++<<<<<<<<<< change 1,1,1,1 to 0,1,0,-1 
[[->>>+<<<]>>>-]>[.[-]]>.            move to the right X%4 * 3 times, then print the following two characters ( 0, 1, 0,-1)
Graviton
fuente
1

Python, 26 24 21 bytes

lambda x:(1j**x).imag

-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 :)

Hiperneutrino
fuente
lambda x:[0,1,0,-1][x%4]en realidad es más corto que su respuesta int-coerced lol
Value Ink
@ValueInk Oh ... esto es vergonzoso jajaja
HyperNeutrino
2
¿Por qué usarías int()en primer lugar?
Dennis
@Dennis porque .imagda un valor de punto flotante y no estoy seguro si eso está permitido por las especificaciones. Ahora no importa :)
HyperNeutrino
Si no se permiten las carrozas, JavaScript no podrá competir.
Dennis
1

Mathematica, 18 bytes

#~JacobiSymbol~46&
J42161217
fuente
55
Esto no funciona del todo: las entradas 9 y 11 dan 1 como salida, por ejemplo. El período de esta función es 184, no 4.
Greg Martin
1
Sin embargo, JacobiSymbol[-4,#]&funciona y solo cuesta un byte más. ¡Buena idea!
Greg Martin
de nuevo no puedo ver un algoritmo (solo mensajes escritos por otros y un par de código corto ... ah, todo como siempre.
1

PHP, 20 bytes

<?=2<=>($argn&3?:2);
usuario63956
fuente
1

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).

f n=rem(2-n`mod`4)2

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 un import Data.Bits.)

Ørjan Johansen
fuente
Por lo que puedo decir, un puerto de la solución Julia de Dennis también es óptimo para JavaScript (14 bytes). ¡Demuestra que incluso Dennis es falible!
Neil
0

Rubí, 20 bytes.

Simple y limpio.

->x{[0,1,0,-1][x%4]}
Tinta de valor
fuente
0

C99, 27 bytes

Suponiendo que desea que la onda se centre en el origen:

f(n){return cpow(1i,n)/1i;}

de lo contrario f(n){return cpow(1i,n);}lo haré. Originalmente tenía un cimagallí, pero aparentemente tratar de devolver un intde un _Complex intproduce la parte real, así que lo usé. Tiene sentido, pero no es nada que hubiera predicho. El comportamiento es el mismo en gccyclang

algmyr
fuente
cpow no está definido xD
algunos #incluye omitidos, no compila)))))
pero +1 solo para C
1
@ xakepp35 Eso no es culpa de las inclusiones, es un problema de enlace. Compilar con -std=c99 -lmy debería funcionar. Funciona bien para mí con ambos gccy clangsin ningún tipo de incluye. Bueno, bien, quiero decir que no hay errores, sino una gran cantidad de advertencias.
algmyr
0

05AB1E , 5 bytes

4%<Ä<

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 (.

   -5 -> 1
   -4 -> 0
   -3 -> -1
   -2 -> 0
   -1 -> 1
    0 -> 0
    1 -> -1
    2 -> 0
    3 -> 1
    4 -> 0
    5 -> -1

4%    # Amplitude of 4...
  <   # Period of 1...
   Ä  # Absolute value...
    < # Period of 1 centered at 0...
Urna de pulpo mágico
fuente
lo que entendí, esto está permitido
los casos de prueba no se pasan ;-)
pero +1 buen intento
0

Pyth - 7 bytes (posiblemente 6)

ta2%tQ4

Intentalo

Si la fase de la ola no es importante, 6 bytes:

ta2%Q4

Intentalo

Explicación:

ta2%tQ4
     Q    # The input
    t     # Subtract 1 to get the phase right (might not be necessary)
   %  4   # Take mod 4
 a2       # Absolute value of the result - 2
t         # Subtract 1 so the result is in [-1,0,1]
Maria
fuente
0

Javascript ES6, 18 17 bytes

n=>n&1&&(++n&2)-1

Primero, 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 0b10para eliminar cualquier bit que no nos interese, luego devuelva la respuesta con un desplazamiento.

const f = n=>n&1&&(++n&2)-1;

for (let i = -5; i < 6; i++) {
  document.body.appendChild(document.createElement('pre')).innerHTML = `f(${i}) => ${f(i)}`;
}

Liendre
fuente
1
Ahorre un byte reemplazándolo ? :0con&&
Steve Bennett
@ SteveBennett Gracias, ¡gran idea!
Nit
0

JavaScript, 15 bytes

n=>n&3&&2-(n&3)

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.

a=n=>n&1&&2-(n&3);
console.log([a(-5), a(-4), a(-3), a(-2), a(-1), a(0), a(1), a(2), a(3), a(4), a(5)])

Kuilin Li
fuente
¡muy bien! +1 por la respuesta