Este desafío se inspiró en la programación de un microcontrolador Arduino. Tengo 6 LED y 6 botones conectados a varios pines en el tablero. En el código, a cada botón y LED se le asigna un número de identificación (1-6). Los números de PIN (que van del 0 al 13) correspondientes a los números de ID se buscan utilizando una switch
declaración. Solo para divertirme, me preguntaba si estos switch
eses podrían eludirse con una función aritmética / otra solo para horrorizar a los futuros mantenedores de código.
El reto
Proporcione la función / funciones que toman el número de ID (entero) como parámetro y devuelve el número de pin (entero) para los 6 LED y / o los 6 botones, sin usar declaraciones condicionales (no if
, no switch
y no ternary).
Valores de retorno para LED:
ID Pin
1 3
2 5
3 6
4 9
5 10
6 11
Valores de retorno para botones:
ID Pin
1 2
2 4
3 7
4 8
5 12
6 13
Desafío de bonificación
Proporcione una única función que tome un número de identificación (entero) y un segundo parámetro (cualquier tipo) que indique si se solicitan LED o pines de botón, y devuelva el pin correspondiente (entero).
Reglas
Este no es un desafío específico de Arduino. Usa cualquier idioma , haz lo que quieras.
Editar: a sugerencia de steveverril , este es ahora un desafío de golf de código .
¡Buena suerte!
(Si todavía está leyendo: aunque es evidentemente absurdo y arbitrario según los estándares de programación, los mapeos se basan en el pinout del Arduino Micro. Los pines 0 y 1 están reservados para la comunicación en serie, los LED se asignan a los 6 pines con capacidad PWM con el número más bajo , los botones se asignan a los pines restantes)
1+(1==1)
?if
,switch
y ternario) están fuera de los límites.Respuestas:
C, 28 bytes cada uno
Esto es básicamente lo mismo que la respuesta de kirbyfan64sos, pero usa una matriz de caracteres en lugar de enteros, y tiene un primer byte ficticio, por lo que no es necesario restar 1 del parámetro de la función.
fuente
Haskell, 24 bytes cada uno
verificar:
.
verificar:
bonificación, Haskell, 36 bytes
verificar:
0 para botones, 1 para LED.
fuente
a f n=n+a f(n+f+div 1f+2)
.C (matemáticas), 32 /
2726 bytes (45 para desafío extra)Varias personas han publicado varias soluciones de búsqueda de tablas, pero eso me pareció una solución fácil. Quería ver qué tan bien podría hacerlo con operaciones puramente matemáticas:
No estaba claro si una función que llamaba a la otra era aceptable o no; si no, uno puede usar esta definición alternativa de
b(i)
(33 bytes) en su lugar:Bonus Challenge (45 bytes):
(pase
t=0
para botones,t=1
para LED)fuente
C, 36 bytes cada uno (49 bytes para el desafío adicional)
Lo siento ... no pude evitarlo ...Ok, ahora pongo una solución real.Bonus challenge, 49 bytes
Uso
f(button,0)
yf(pin,1)
.Demostración en vivo en Ideone.
Originales:
fuente
p(i){return"@cefijk"[i]&15;}b(i){return"@bdghlm"[i]&15;}
?Pyth - 12 bytes cada uno
Base codifica la matriz.
El último es en realidad doce bytes, excepto que no puedo escribir un retorno de carro, así que escapé.
Test Suite para botones .
Test Suite para LEDS .
fuente
M@jC@"\rÝ"H+12*G2
, que usa 0 para pines y 1 para botones debería funcionar.Pyth, solo bonificación: 20 bytes
el parámetro # 2 es 0 para LED, 1 para botones. Para obtener el Pin # para LED4,
g4 0
Hubiera publicado esto como un comentario a la entrada de Maltysen, pero recién comencé, así que carece de la reputación requerida. Acabo de comenzar a usar PYTH esta noche, y admito que adapté descaradamente su método de codificar eficientemente una lista.
Si esto fue inapropiado, mis más sinceras disculpas, y eliminaré mi entrada.
fuente
MIPS, 16 bytes
Bit shifting y bitmask. Entrada
$a0
, salida en$v0
.Para obtener bonificaciones, use inmediatamente
0xdc87420
fuente
F #, 28 + 28 bytes
Quería probar esto sin una tabla de búsqueda.
fuente
SWI-Prolog, 34 bytes cada uno
l/2
es para LEDs,b/2
es para botones.Bonus, 66 bytes
S = 0
para LED, cualquier otra cosa para botones.fuente
q / k (18 bytes cada uno)
Simplemente un caso de indexación:
Ejemplo:
Bono (1 byte, dado que L y B están definidos)
Ejemplo:
fuente
CJam, 10 bytes cada uno
Estas son funciones anónimas. Los enlaces al intérprete en línea se muestran dentro de un pequeño arnés de prueba que ejecuta la función para todos los valores de entrada.
Función 1 (LED):
Pruébalo en línea
Función 2 (botones):
Pruébalo en línea
Escribí un pequeño programa que genera y evalúa estas expresiones. Para ambos, encontró una serie de soluciones con 8 caracteres (contando la expresión solo sin las llaves), pero ninguna con menos.
fuente
Javascript (ES6), 26/27 bytes
LEDs:
Botones:
Si lo anterior no funciona (lo que es probable), aquí hay un hexdump:
No pude conseguir que el segundo funcionara con un CR sin procesar, así que tuve que usar
\r
Bonus, 41 bytes
Hexdump
El segundo parámetro es 0 para los LED y 1 para los botones.
fuente
Brainf ** k, 107 bytes
Siendo este mi primer programa BF codificado a mano, no dudo que haya varias optimizaciones que hacer. Pero sigue siendo asombroso. :)
No estoy seguro si
[]
cuenta como condicional, aunque ...: /fuente
POWERSHELL - 27-27-72
LED usa 1..6 como args
botón use 1..6 como args
LED o BOTÓN uso b 1; l 2; b 6; l 5 etc. como args
fuente
Octava, 40 bytes (desafío adicional)
Usando una función anónima:
Después de definir esta función, llame a esta función como
ans(x,y)
, dondex
está el número de pin / botón ey
indica pin o botón con valores1
y2
respectivamente.Pruébalo en línea
fuente
JavaScript
1137466595233 (una función)Usando bit shift para obtener valores de 4 bits. Debe llamarse con p (n, 195650864 o 231240736).
Alterno.
fuente
Perl 4 (37 y 31 bytes)
LED (37 bytes):
... pero usa una tabla de búsqueda.
Botones (31 bytes, sin búsqueda):
fuente
JavaScript (ES6) 18,22,44
Editar más corto pero aburrido
fuente
Python, 31 bytes cada uno
No es exactamente creativo ni nada, ¡pero funciona!
Bonus, 44 Bytes
y
debe ser 0 para los LED y 1 para los botones.fuente
Python, 60 + 58 = 118 bytes
Estos son horribles Ni siquiera sé lo que estoy haciendo aquí ...
¡Pero son bastante interesantes! :RE
fuente
Rubí, 45 bytes
Entradas de prueba:
fuente
Adelante, 26 bytes cada uno, 34 para bonificación
Similar a la versión C de Squeamish.
Prima:
Use 0 para LED y 6 para botones. Y el orden de los parámetros no importa
fuente
Pyth, 19 bytes cada uno
Para alfileres y botones, respectivamente.
fuente