Esse desafio foi inspirado na programação de um microcontrolador Arduino. Tenho 6 LEDs e 6 botões conectados a vários pinos na placa. No código, cada botão e LED recebe um número de identificação (1-6). Os números dos pinos (variando de 0 a 13) correspondentes aos números de identificação são pesquisados usando uma switch
instrução. Puramente por diversão, eu queria saber se essas switch
es poderiam ser contornadas com uma função aritmética / outra apenas para horrorizar futuros mantenedores de código.
O desafio
Forneça a função / funções que tomam o número de identificação (número inteiro) como parâmetro e retorne o número do pino (número inteiro) para os 6 LEDs e / ou os botões 6, sem usar instruções condicionais (não if
, não switch
e não ternário).
Valores de retorno para LEDs:
ID Pin
1 3
2 5
3 6
4 9
5 10
6 11
Retorne valores para os botões:
ID Pin
1 2
2 4
3 7
4 8
5 12
6 13
Desafio de bônus
Forneça uma única função que use um número de identificação (número inteiro) e um segundo parâmetro (qualquer tipo) indicando se os pinos de LED ou botão são solicitados e retorne o pino correspondente (número inteiro).
Regras
Este não é um desafio específico do Arduino. Use qualquer idioma , faça o que quiser.
Edit: por sugestão de steveverril , este é agora um desafio de código de golfe .
Boa sorte!
(Se você ainda está lendo: apesar de claramente absurdo e arbitrário pelos padrões de programação, os mapeamentos são baseados na pinagem do Arduino Micro. Os pinos 0 e 1 são reservados para comunicação serial, os LEDs são atribuídos aos 6 pinos com capacidade PWM de número mais baixo botões são atribuídos aos pinos restantes)
1+(1==1)
?if
,switch
e ternário) estão fora dos limites.Respostas:
C, 28 bytes cada
Isso é basicamente o mesmo que a resposta de kirbyfan64sos, mas usa uma matriz de caracteres em vez de números inteiros e possui um primeiro byte fictício, portanto não é necessário subtrair 1 do parâmetro de função.
fonte
Haskell, 24 bytes cada
checar:
.
checar:
bônus, Haskell, 36 bytes
checar:
0 para botões, 1 para LEDs.
fonte
a f n=n+a f(n+f+div 1f+2)
.C (matemática), 32 /
2726 bytes (45 para desafio de bônus)Várias pessoas postaram várias soluções de pesquisa de tabela, mas isso me pareceu o caminho mais fácil. Eu queria ver o quão bem eu poderia fazer com operações puramente matemáticas:
Não ficou claro se uma função que chamava a outra era aceitável ou não; caso contrário, pode-se usar esta definição alternativa de
b(i)
(33 bytes):Desafio de bônus (45 bytes):
(passe
t=0
para botões,t=1
para LEDs)fonte
C, 36 bytes cada (49 bytes para o desafio do bônus)
Me desculpe ... eu simplesmente não pude evitar ...Ok, eu coloquei uma solução real agora.Desafio de bônus, 49 bytes
Use
f(button,0)
ef(pin,1)
.Demonstração ao vivo na Ideone.
Originais:
fonte
p(i){return"@cefijk"[i]&15;}b(i){return"@bdghlm"[i]&15;}
?Pyth - 12 bytes cada
Base codifica a matriz.
O último é na verdade doze bytes, exceto que eu não posso escrever um retorno de carro, então eu escapei dele.
Conjunto de teste para botões .
Conjunto de teste para LEDS .
fonte
M@jC@"\rÝ"H+12*G2
, que usa 0 para pinos e 1 para botões deve funcionar.Pitão, apenas bônus: 20 bytes
o parâmetro 2 é 0 para LEDs, 1 para botões. Para obter o Pin # para LED4,
g4 0
Eu teria postado isso como um comentário na entrada de Maltysen, mas acabei de começar, por isso não tenho a reputação necessária. Comecei a usar o PYTH hoje à noite e admito que adaptei descaradamente o método dele de codificar com eficiência uma lista.
Se isso foi inapropriado, peço desculpas mais profundas e removerei minha entrada.
fonte
MIPS, 16 bytes
Mudança de bit e máscara de bit. Entrada
$a0
, saída$v0
.Para bônus, use imediatamente
0xdc87420
fonte
F #, 28 + 28 bytes
Eu queria tentar isso sem uma tabela de pesquisa.
fonte
SWI-Prolog, 34 bytes cada
l/2
é para LEDs,b/2
é para botões.Bônus, 66 bytes
S = 0
para LEDs, qualquer outra coisa para botões.fonte
q / k (18 bytes cada)
Simplesmente um caso de indexação:
Exemplo:
Bônus (1 byte, considerando L & B definido)
Exemplo:
fonte
CJam, 10 bytes cada
Essas são funções anônimas. Os links para o intérprete online são exibidos em um pequeno equipamento de teste que executa a função para todos os valores de entrada.
Função 1 (LEDs):
Experimente online
Função 2 (botões):
Experimente online
Eu escrevi um pequeno programa que gera e avalia essas expressões. Para os dois, encontrou várias soluções com 8 caracteres (contando a expressão apenas sem chaves), mas nenhuma com menos.
fonte
Javascript (ES6), 26/27 bytes
LEDs:
Botões:
Se o acima não for executado (o que é provável), aqui está um hexdump:
Não consegui que o segundo trabalhasse com um CR bruto, então tive que usar
\r
Bônus, 41 bytes
Hexdump
O segundo parâmetro é 0 para LEDs e 1 para botões.
fonte
Brainf ** k, 107 bytes
Sendo este o meu primeiro programa BF codificado manualmente, não duvido que haja várias otimizações a serem feitas. Mas ainda é incrível. :)
Não tenho certeza se
[]
conta como condicional, no entanto ...: /fonte
POWERSHELL - 27-27-72
LED use 1..6 como args
botão use 1..6 como args
LED ou BOTÃO use b 1; 12; b 6; l 5 etc como args
fonte
Oitava, 40 bytes (desafio bônus)
Usando uma função anônima:
Depois de definir esta função, chame-a como
ans(x,y)
, ondex
é o número do pino / botão ey
indica o pino ou botão com valores1
e2
respectivamente.Experimente online
fonte
Javascript
1137466.59.5233 (uma função)Usando deslocamento de bits para obter valores de 4 bits. Deve ser chamado com p (n, 195650864 ou 231240736).
Alternar.
fonte
Perl 4 (37 e 31 bytes)
LEDs (37 bytes):
... mas usa uma tabela de pesquisa.
Botões (31 bytes, sem pesquisa):
fonte
JavaScript (ES6) 18,22,44
Editar Mais curto, mas chato
fonte
Python, 31 bytes cada
Não é exatamente criativo ou qualquer coisa, mas funciona!
Bônus, 44 bytes
y
deve ser 0 para LEDs e 1 para botões.fonte
Python, 60 + 58 = 118 bytes
Estes são horríveis. eu nem sei o que estou fazendo aqui ...
Mas eles são bem interessantes, no entanto! : D
fonte
Ruby, 45 bytes
Entradas de teste:
fonte
Quarto, 26 bytes cada, 34 para bônus
Semelhante à versão C por melindroso.
Bônus:
Use 0 para LEDs e 6 para botões. E a ordem dos parâmetros não importa
fonte
Pyth, 19 bytes cada
Para alfinetes e botões, respectivamente.
fonte