Tâche:
Étant donné l'indice d'échantillon, x, calculez la valeur d'échantillon f (x) de l'onde triangulaire, avec une période de 4 échantillons et une amplitude 1. Le décalage peut être négatif et la valeur d'échantillon peut être soit {0, 1, -1}.
Cas de test:
-5 -> -1
-4 -> 0
-3 -> 1
-2 -> 0
-1 -> -1
0 -> 0
1 -> 1
2 -> 0
3 -> -1
4 -> 0
5 -> 1
Personnellement, je connais deux approches en C - la première utilise une table de recherche, la seconde utilise des instructions conditionnelles. Pour les points brownie, pourriez-vous m'impressionner avec une approche "mathématique" pure? (Je veux dire une approche fonctionnelle pure, par exemple ne pas utiliser d'instructions conditionnelles ou utiliser de la mémoire pour LUT.) Mais ce n'est pas une restriction. Si vous ne le pouvez pas ou que votre langue ne le prend pas en charge, il vous suffit de poster une solution
Réponses:
Mathematica, 8 octets
Explication
la source
TI-Basic,
754 octets(Mode degrés) -1 octet de @immibis de mon ancienne réponse.
Ancienne réponse
Approche mathématique pure sur une calculatrice. :)
Juste pour le plaisir, voici une autre solution pure-math (ish) pour 9 octets (en mode radian) ou 8 octets (mode degré)
la source
imag()
est une fonction valide sur TI-BASIC.sin(90Ans
? Pourquoi avez-vous besoin du supplément90-1sin-1
?Python 2 , 20 octets
Essayez-le en ligne!
J'exécute une recherche par force brute pour des expressions arithmétiques ou au niveau du bit plus courtes, je vais voir si quelque chose se présente. Celui-ci, je l'ai trouvé à la main.
la source
Julia 0,5 , 12 octets
J'aime cette approche car il est peu probable qu'elle soit la plus courte dans une autre langue.
Essayez-le en ligne!
Comment ça fonctionne
La priorité des opérateurs de Julia est un peu inhabituelle: contrairement à la plupart des autres langues, les opérateurs au niveau du bit ont la même priorité que leurs homologues arithmétiques, donc
&
(multiplication au niveau du bit) a la même priorité que*
.Tout d'abord,
n&3
prend le module d'entrée 4 , avec signe positif.Le résultat - 0 , 1 , 2 ou 3 - est ensuite soustrait de 2 , ce qui donne 2 , 1 , 0 ou -1 .
Enfin, nous prenons le reste signé de la division par 2 , retournant 0 , 1 , 0 ou -1 .
la source
Gelée , 3 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
dc, 13
Vous ne savez pas si vous comptez l'
%
opérateur modulo comme "mathématiques pures":Essayez-le en ligne . Notez que
dc
utilise_
au lieu de-
pour indiquer des nombres négatifs.Explication
Notez que
dc
l'%
opérateur mod est la version standard "CPU" qui mappe les valeurs négatives aux valeurs négatives.la source
abs((x+1)%4)-1
place?brainfuck , 136 octets
Essayez-le en ligne!
Il y a probablement une réponse plus triviale, mais cela utilise essentiellement une table de valeurs. Bien que brainfuck accepte les entrées sous forme de caractères ASCII avec des valeurs positives de 0 à 127, cela fonctionne toujours comme s'il était capable d'accepter des valeurs négatives (pour tester, remplacer le
,
par unen
quantité de-
caractères).Comment ça fonctionne
la source
Python,
262421 octets-2 octets grâce à ValueInk pour s'être rendu compte que la méthode mathématique est en fait plus longue que l'approche triviale: P
-3 octets merci à Dennis d'avoir souligné que je n'ai pas besoin de la
int(...)
, ce qui raccourcit donc :)la source
lambda x:[0,1,0,-1][x%4]
est en fait plus court que votre réponse intolérée lolint()
en premier lieu cependant?.imag
donne une valeur à virgule flottante et je ne sais pas si cela est autorisé par les spécifications. Cela n'a plus d'importance maintenant :)Python , 20 octets
Une fonction sans nom qui renvoie le résultat.
Essayez-le en ligne!
la source
Mathematica, 18 octets
la source
JacobiSymbol[-4,#]&
cela fonctionne et ne coûte qu'un octet de plus. Bonne idée!Pari / GP , 12 octets
Essayez-le en ligne!
la source
PHP, 20 octets
la source
Haskell , 19 octets
La solution Julia de Port of Dennis, juste parce qu'il a dit qu'elle ne serait pas la plus courte dans une autre langue. (Quelqu'un pourrait encore me prouver que c'est le plus court à Haskell.)
Essayez-le en ligne!
Haskell a deux fonctions de reste différentes, l'une (
rem
) fonctionne comme la Julia, tandis que l'autre (mod
) donne un résultat positif même lorsque le premier argument est négatif, et convient donc à la traduction&3
. (Le réel&
, appelé.&.
, de Haskell nécessite hélas unimport Data.Bits
.)la source
Octave , 22 octets
Essayez-le en ligne!
la source
Ruby, 20 octets
Simple et propre.
la source
C99, 27 octets
En supposant que vous voulez que l'onde soit centrée à l'origine:
sinon
f(n){return cpow(1i,n);}
fera l'affaire. J'avais à l'origine unecimag
entrée là-dedans, mais apparemment, j'essaie de récupérer une partieint
de_Complex int
la partie réelle, alors je l'ai utilisée. C'est logique, mais ce n'est rien que j'aurais prévu. Le comportement est le même dansgcc
etclang
la source
-std=c99 -lm
et cela devrait fonctionner. Cela fonctionne bien pour moi avec les deuxgcc
etclang
sans aucun inclus. Eh bien, je veux dire par là qu'il n'y a pas d'erreurs, mais un grand nombre d'avertissements.05AB1E , 5 octets
Essayez-le en ligne!
La sortie est inversée, mais d'après ce que j'ai compris, cela est autorisé:
+1 octet pour multiplier la sortie par -1 en utilisant
(
.la source
Pyth - 7 octets (éventuellement 6)
Essayez-le
Si la phase de l'onde n'est pas importante, 6 octets:
Essayez-le
Explication:
la source
AWK , 26 octets
Essayez-le en ligne!
Il s'agit d'une approche alternative utilisant des fonctions trigonométriques sans l'opérateur de module.
Essayez-le en ligne!
la source
Javascript ES6,
1817 octetsTout d'abord, vérifiez si l'entrée est paire ou impaire et retournez 0 pour toutes les valeurs paires. Pour toutes les entrées impaires, incrémentez et au niveau du bit avec
0b10
pour supprimer tous les bits qui ne nous intéressent pas, puis renvoyez la réponse avec un décalage.la source
? :0
par&&
JavaScript, 15 octets
Bitwise et 3 est équivalent à modulo 4 sauf sans la règle bizarre sur les modules de nombres négatifs de JavaScript. J'ai d'abord fait une régression polynomiale sur les quatre premiers points, mais j'ai ensuite réalisé que j'étais stupide parce que (1, 1), (2, 0) et (3, -1) ne sont que 2-n.
la source
R , 19 octets
Essayez-le en ligne!
Un port de la réponse Mathematica de JungHwan Min .
la source