Ce défi a été inspiré par la programmation d'un microcontrôleur Arduino. J'ai 6 LED et 6 boutons connectés à différentes broches de la carte. Dans le code, chaque bouton et LED reçoit un numéro d'identification (1-6). Les numéros de broche (allant de 0 à 13) correspondant aux numéros d'identification sont recherchés à l'aide d'une switch
déclaration. Par pur amusement, je me demandais si ces switch
es pouvaient être contournés avec une fonction arithmétique / autre juste pour horrifier les futurs responsables de code.
Le défi
Fournissez la fonction / les fonctions qui prennent le numéro d'identification (entier) comme paramètre et renvoient le numéro de broche (entier) pour les 6 voyants et / ou les 6 boutons, sans utiliser d'instructions conditionnelles (non if
, non switch
et pas ternaire).
Valeurs de retour pour les LED:
ID Pin
1 3
2 5
3 6
4 9
5 10
6 11
Renvoie les valeurs des boutons:
ID Pin
1 2
2 4
3 7
4 8
5 12
6 13
Défi bonus
Fournissez une fonction unique qui prend un numéro d'identification (entier) et un deuxième paramètre (n'importe quel type) indiquant si les broches de LED ou de bouton sont demandées, et renvoie la broche correspondante (entier).
Règles
Ce n'est pas un défi spécifique à Arduino. Utilisez n'importe quelle langue , faites ce que vous voulez.
Edit: à la suggestion de steveverril , c'est maintenant un défi de golf de code .
Bonne chance!
(Si vous continuez à lire: bien que manifestement absurdes et arbitraires selon les normes de programmation, les mappages sont basés sur le brochage de l'Arduino Micro. Les broches 0 et 1 sont réservées pour la communication série, les LED sont affectées aux 6 broches compatibles PWM les moins numérotées , les boutons sont affectés aux broches restantes)
1+(1==1)
?if
,switch
et ternaire) sont hors limites.Réponses:
C, 28 octets chacun
C'est fondamentalement la même que la réponse de kirbyfan64sos, mais utilise un tableau de caractères au lieu d'entiers, et a un premier octet fictif donc il n'est pas nécessaire de soustraire 1 du paramètre de fonction.
la source
Haskell, 24 octets chacun
vérifier:
.
vérifier:
bonus, Haskell, 36 octets
vérifier:
0 pour les boutons, 1 pour les LED.
la source
a f n=n+a f(n+f+div 1f+2)
.C (mathématiques), 32 /
2726 octets (45 pour le défi bonus)Plusieurs personnes ont publié diverses solutions de recherche de table, mais cela me semblait être une solution de facilité. Je voulais voir dans quelle mesure je pouvais faire avec des opérations purement mathématiques:
Il n'était pas clair si une fonction appelant l'autre était acceptable ou non; sinon, on peut utiliser cette autre définition de
b(i)
(33 octets) à la place:Challenge Bonus (45 octets):
(passer
t=0
pour les boutons,t=1
pour les LED)la source
C, 36 octets chacun (49 octets pour le défi bonus)
Je suis désolé ... je ne pouvais pas m'en empêcher ...Ok, j'ai mis une vraie solution maintenant.Défi bonus, 49 octets
Utilisez
f(button,0)
etf(pin,1)
.Démo en direct chez Ideone.
Originaux:
la source
p(i){return"@cefijk"[i]&15;}b(i){return"@bdghlm"[i]&15;}
?Pyth - 12 octets chacun
La base code le tableau.
Le dernier fait en fait douze octets, sauf que je ne peux pas écrire de retour chariot, donc je l'ai échappé.
Suite de tests pour les boutons .
Suite de tests pour LEDS .
la source
M@jC@"\rÝ"H+12*G2
, qui utilise 0 pour les broches et 1 pour les boutons devrait fonctionner.Pyth, Bonus uniquement: 20 octets
param # 2 est 0 pour les LED, 1 pour les boutons. Pour obtenir la broche # pour LED4,
g4 0
J'aurais posté cela comme un commentaire à l'entrée de Maltysen, mais je viens de commencer, donc je n'ai pas la réputation requise. Je viens de commencer à utiliser PYTH ce soir et j'avoue que j'ai sans vergogne adapté sa méthode d'encodage efficace d'une liste.
Si cela était inapproprié, mes plus sincères excuses et je supprimerai mon entrée.
la source
MIPS, 16 octets
Décalage de bits et masque de bits. Entrée
$a0
, sortie$v0
.Pour bonus, utilisez immédiatement
0xdc87420
la source
F #, 28 + 28 octets
Je voulais essayer ceci sans table de consultation.
la source
SWI-Prolog, 34 octets chacun
l/2
est pour les LED,b/2
est pour les boutons.Bonus, 66 octets
S = 0
pour les LED, rien d'autre pour les boutons.la source
q / k (18 octets chacun)
Un simple cas d'indexation:
Exemple:
Bonus (1 octet, étant donné le L & B défini)
Exemple:
la source
CJam, 10 octets chacun
Ce sont des fonctions anonymes. Les liens vers l'interpréteur en ligne s'affichent ensuite dans un petit faisceau de test qui exécute la fonction pour toutes les valeurs d'entrée.
Fonction 1 (LED):
Essayez-le en ligne
Fonction 2 (boutons):
Essayez-le en ligne
J'ai écrit un petit programme qui génère et évalue ces expressions. Pour les deux, il a trouvé un certain nombre de solutions avec 8 caractères (en comptant l'expression uniquement sans les accolades), mais aucune avec moins.
la source
Javascript (ES6), 26/27 octets
LED:
Boutons:
Si ce qui précède ne fonctionne pas (ce qui est probable), voici un hexdump:
Je n'ai pas réussi à faire fonctionner le second avec un CR brut, j'ai donc dû utiliser
\r
Bonus, 41 octets
Hexdump
Le deuxième paramètre est 0 pour les LED et 1 pour les boutons.
la source
Brainf ** k, 107 octets
Ceci étant mon premier programme BF codé à la main, je ne doute pas qu'il y ait plusieurs optimisations à faire. Mais c'est quand même génial. :)
Je ne sais pas si cela
[]
compte comme conditionnel, cependant ...: /la source
POWERSHELL - 27-27-72
Les LED utilisent 1 à 6 comme arguments
le bouton utilise 1..6 comme arguments
LED ou BOUTON utiliser b 1; l 2; b 6; l 5 etc comme args
la source
Octave, 40 octets (défi bonus)
Utilisation d'une fonction anonuyme:
Après avoir défini cette fonction, appelez cette fonction comme
ans(x,y)
, oùx
est le numéro de broche / bouton ety
indique la broche ou le bouton avec des valeurs1
et2
respectivement.Essayez-le en ligne
la source
Javascript
1137466595233 (une fonction)Utilisation du décalage de bits pour obtenir des valeurs de 4 bits. Doit être appelé avec p (n, 195650864 ou 231240736).
Alterner.
la source
Perl 4 (37 et 31 octets)
LED (37 octets):
... mais il utilise une table de recherche.
Boutons (31 octets, pas de recherche):
la source
JavaScript (ES6) 18,22,44
Modifier plus court mais ennuyeux
la source
Python, 31 octets chacun
Pas exactement créatif ou quoi que ce soit, mais ça marche!
Bonus, 44 octets
y
devrait être 0 pour les LED et 1 pour les boutons.la source
Python, 60 + 58 = 118 octets
Ce sont horribles. je ne sais même pas ce que je fais ici ...
Mais ils sont quand même assez intéressants! :RÉ
la source
Rubis, 45 octets
Entrées de test:
la source
Quatrième, 26 octets chacun, 34 pour le bonus
Similaire à la version C de squeamish.
Prime:
Utilisez 0 pour les LED et 6 pour les boutons. Et l'ordre des paramètres n'a pas d'importance
la source
Pyth, 19 octets chacun
Pour les broches et les boutons, respectivement.
la source