Buscar sin declaraciones condicionales

23

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 switchdeclaración. Solo para divertirme, me preguntaba si estos switcheses 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 switchy 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)


fuente
¡Bienvenidos a PPCG! No voté en contra, pero creo que esto iría mejor como un codegolf. El concurso de popularidad es muy amplio en una situación como esta. Por cierto, puede publicar preguntas en nuestro sandbox meta.codegolf.stackexchange.com/q/2140/15599 para que las revisen antes de publicarlas
Level River St
Cuando dices "no si", ¿puedo usar una expresión condicional como un entero? Por ejemplo 1+(1==1)?
kirbyfan64sos
Sí, esos están bien. Sólo los tres estados mencionados en el reto ( if, switchy ternario) están fuera de los límites.
Relacionado
Peter Taylor
1
@steveverrill gracias por la sugerencia, el desafío ahora es el código de golf. Si hubiera cumplido con el requisito de reputación de +5 para meta, habría publicado en el Sandbox :) Así que doble gracias por no votar a favor de un humilde +1 representante casual.

Respuestas:

10

C, 28 bytes cada uno

p(i){return"@cefijk"[i]&15;}
b(i){return"@bdghlm"[i]&15;}

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.

ossifrage aprensivo
fuente
9

Haskell, 24 bytes cada uno

l 1=3
l n=n+l(div(n+2)3)

verificar:

> map l [1..6]
[3,5,6,9,10,11]

.

b 1=2
b n=n+b(div(n+1)2)

verificar:

> map b [1..6]
[2,4,7,8,12,13]

bonificación, Haskell, 36 bytes

a f 1=f+2
a f n=n+a f(n+f+1`div`f+2)

verificar:

> map (a 0) [1..6]
[2,4,7,8,12,13]
> map (a 1) [1..6]
[3,5,6,9,10,11]

0 para botones, 1 para LED.

Leif Willerts
fuente
1
En el bono, deberías poder usarlo a f n=n+a f(n+f+div 1f+2).
dfeuer
¡Qué asco! Sé que no está en el espíritu de codegolf, pero esto es demasiado tarde y demasiado pequeño para editar una solución perfectamente buena. Sin embargo
Leif Willerts
¿Cómo es que es demasiado tarde?
dfeuer
7

C (matemáticas), 32 / 27 26 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:

p(i){return~i&1|i*2^i*!(i%5-1);}
b(i){return i/5*5+1^p(i);}

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:

b(i){return(i&1|i*2)+i/5-!(i/2);}

Bonus Challenge (45 bytes):

f(i,t){return(i&1|i*2)+i/5-!(i/2)^t+i/5*5*t;}

(pase t=0para botones, t=1para LED)

Foogod
fuente
5

C, 36 bytes cada uno (49 bytes para el desafío adicional)

p(i){return 3500459>>(4*(7+~i))&15;}
b(i){return 2390221>>(4*(7+~i))&15;}

Lo siento ... no pude evitarlo ... Ok, ahora pongo una solución real.

Bonus challenge, 49 bytes

f(i,t){return(2390221+t*1110238)>>(4*(7+~i))&15;}

Uso f(button,0)y f(pin,1).

Demostración en vivo en Ideone.

Captura de pantalla

Originales:

p(i){int a[]={3,5,6,9,10,11};return a[i-1];}
b(i){int a[]={2,4,7,8,12,13};return a[i-1];}
kirbyfan64sos
fuente
1
Si quisiera respuestas sensatas, no estaría publicando en PPCG ahora, podría: P Curiosamente, usar esto en el programa Arduino real resulta en un tamaño más grande para el binario compilado (que, dado ~ 28K de espacio de almacenamiento en el tablero, es algo a evitar)
¿Qué tal p(i){return"@cefijk"[i]&15;}b(i){return"@bdghlm"[i]&15;}?
aprensivo ossifrage
@squeamishossifrage Debes publicarlas como tu propia respuesta. Son mejores que los míos. :)
kirbyfan64sos
@ kirbyfan64sos Oh ok entonces
apretujado ossifrage
4

Pyth - 12 bytes cada uno

Base codifica la matriz.

@jC"Ý"14tQ (buttons)
@jC"\r'"12tQ (leds)

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 .

Maltysen
fuente
Creo que el OP pretendía que esto fuera una función ("Proporcionar la función / funciones"); con eso debería ser trivial obtener la bonificación: algo así M@jC@"\rÝ"H+12*G2, que usa 0 para pines y 1 para botones debería funcionar.
kirbyfan64sos
3

Pyth, solo bonificación: 20 bytes

M@jC"5i«$xÍ"16+*6HtG

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.

Brian Tuck
fuente
1
¡Hola Brian Tuck! Me alegra que hayas comenzado a usar mi idioma. Esta reutilización de la idea de Maltysen probablemente estuvo bien, ya que la codificación base no es exactamente una idea nueva. Sin embargo, dar crédito, lo que hiciste, es importante. Por cierto, Pyth no debería escribirse en mayúsculas: no es un acrónimo, es solo un nombre.
isaacg
2

MIPS, 16 bytes

Bit shifting y bitmask. Entrada $a0, salida en $v0.

sll     $t0, $a0, 2 
li      $t1, 0xba96530
srlv    $t0, $t1, $t0   
andi    $v0, $t0, 0xf

Para obtener bonificaciones, use inmediatamente 0xdc87420

qwr
fuente
¿No se supone que debemos contar el tamaño de la fuente? al jugar al golf? :)
nitro2k01
2

F #, 28 + 28 bytes

Quería probar esto sin una tabla de búsqueda.

let L x=1+x*2-x%4/3-x/5-x/6
let B x=x*2+x/3-x/4+x%6/5*2
Hand-E-Food
fuente
1

SWI-Prolog, 34 bytes cada uno

l(I,P):-nth1(I,[3,5,6,9,10,11],P).
b(I,P):-nth1(I,[2,4,7,8,12,13],P).

l/2 es para LEDs, b/2 es para botones.

Bonus, 66 bytes

a(I,S,P):-nth1(I,[3:2,5:4,6:7,9:8,10:12,11:13],A:B),(S=0,P=A;P=B).

S = 0 para LED, cualquier otra cosa para botones.

Fatalizar
fuente
1

q / k (18 bytes cada uno)

Simplemente un caso de indexación:

L:0N 3 5 6 9 10 11
B:0N 2 4 1 8 12 13

Ejemplo:

q) L[2]
5
q) B[6]
13

Bono (1 byte, dado que L y B están definidos)

@

Ejemplo:

q) @[`L;2]
5
q) @[`B;6]
13
skeevey
fuente
¡Este es un uso engañosamente inteligente de símbolos! +1
kirbyfan64sos
1

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

{5*3|4+3/}

Pruébalo en línea

Función 2 (botones):

{_6|5+*5/}

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.

Reto Koradi
fuente
0

Javascript (ES6), 26/27 bytes

LEDs:

a=>`0   
`.charCodeAt(a)

Botones:

a=>`0\r`.charCodeAt(a)

Si lo anterior no funciona (lo que es probable), aquí hay un hexdump:

00000000: 6C 3D 61 3D 3E 60 30 03 - 05 06 09 0A 0B 60 2E 63 |l=a=>`0      `.c|
00000010: 68 61 72 43 6F 64 65 41 - 74 28 61 29 0A 62 3D 61 |harCodeAt(a) b=a|
00000020: 3D 3E 60 30 02 04 07 08 - 0C 5C 72 60 2E 63 68 61 |=>`0     \r`.cha|
00000030: 72 43 6F 64 65 41 74 28 - 61 29                   |rCodeAt(a)|

No pude conseguir que el segundo funcionara con un CR sin procesar, así que tuve que usar \r

Bonus, 41 bytes

(a,b)=>`0   
\r`.charCodeAt(a+b*6)

Hexdump

00000000: 28 61 2C 62 29 3D 3E 60 - 30 03 05 06 09 0A 0B 02 |(a,b)=>`0       |
00000010: 04 07 08 0C 5C 72 60 2E - 63 68 61 72 43 6F 64 65 |    \r`.charCode|
00000020: 41 74 28 61 2B 62 2A 36 - 29                      |At(a+b*6)|

El segundo parámetro es 0 para los LED y 1 para los botones.

DankMemes
fuente
0

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 ...: /

kirbyfan64sos
fuente
Tenemos un desafío lleno de optimizadores de BF a su disposición si desea utilizar uno;)
Beta Decay
@BetaDecay Se ven geniales, pero ninguno de ellos hace que mi código sea más corto ...: /
kirbyfan64sos
Hm, es una pena: P
Beta Decay
0

POWERSHELL - 27-27-72

LED usa 1..6 como args

:\>wc -c LED.PS1 & cat LED.PS1 & echo.& powershell -nologo -f LED.PS1 1
27 LED.PS1
(0,3,5,6,9,10,11)[$args[0]]
3

botón use 1..6 como args

:\>wc -c button.PS1 & cat button.PS1 & echo.& powershell -nologo -f button.PS1 6    
27 button.PS1
(0,2,4,7,8,12,13)[$args[0]]
13

LED o BOTÓN uso b 1; l 2; b 6; l 5 etc. como args

:\>wc -c ledbutt.PS1 & cat ledbutt.PS1 & echo.& powershell -nologo -f ledbutt.PS1 b 5
72 ledbutt.PS1
$a=@{"b"=(0,3,5,6,9,10,11);"l"=(0,2,4,7,8,12,13)};$a[$args[0]][$args[1]]
10
:\>powershell -nologo -f ledbutt.PS1 l 5
12    
:\>powershell -nologo -f ledbutt.PS1 b 3
6    
:\>powershell -nologo -f ledbutt.PS1 l 2
4
blabb
fuente
0

Octava, 40 bytes (desafío adicional)

Usando una función anónima:

@(x,y)[3 2;5 4;6 7;9 8;10 12;11 13](x,y)

Después de definir esta función, llame a esta función como ans(x,y), donde xestá el número de pin / botón e yindica pin o botón con valores 1y 2respectivamente.

Pruébalo en línea

Luis Mendo
fuente
0

JavaScript 113 74 66 59 52 33 (una función)

Usando bit shift para obtener valores de 4 bits. Debe llamarse con p (n, 195650864 o 231240736).

/*
  11   10    9    6    5    3
1011 1010 1001 0110 0101 0011 0000 = 195650864

  13   12    8    7    4    2
1101 1100 1000 0111 0100 0010 0000 = 231240736

                   b >> i * 4 xxxx
                         & 15 1111
                              yyyy (matching 1s)
*/
// Where b = 195650864 for pins and 231240736 for buttons.
function p(i,b){return b>>i*4&15}

Alterno.

/*
Using bitwise * 4 for bitwise only.    
function p(i,b){return b>>(i<<2)&15}
*/
martillo de lobo
fuente
0

Perl 4 (37 y 31 bytes)

LED (37 bytes):

$c=pop;$c*2+($c~~[1,2,4,6]&&5.5<=>$c)

... pero usa una tabla de búsqueda.

Botones (31 bytes, sin búsqueda):

$c=pop;2*($c+($c==5))+($c%3==0)
msh210
fuente
0

JavaScript (ES6) 18,22,44

Editar más corto pero aburrido

// LED 
l=i=>1-~' 134789'[i]
// Buttons
b=i=>[,2,4,7,8,12,13][i]

// bonus
f=(i,t)=>1-~[' 134789',[,0,2,5,6,10,11]][t][i]

//Test

out=x=>O.innerHTML+=x+'\n'

for(i=1;i<=6;i++) out(i +' -> '+l(i) + ' '+b(i) +' '+f(i,0)+' '+f(i,1))
<pre id=O></pre>

edc65
fuente
0

Python, 31 bytes cada uno

No es exactamente creativo ni nada, ¡pero funciona!

l=lambda x:int(" 3569AB"[x],16)
b=lambda x:int(" 2478CD"[x],16)

Bonus, 44 Bytes

k=lambda x,y:int("3569AB2478CD"[x-1+6*y],16)

y debe ser 0 para los LED y 1 para los botones.

Kade
fuente
0

Python, 60 + 58 = 118 bytes

p=lambda i:(2**i)*(i<3)+1+(i>2)*(5+3*(i-3))-(i>4)*(i-3+~i%2)
b=lambda i:2**i-(i>2)-(i>3)*(2**(i-1)-1)-4*(i>4)-15*(i==6)

Estos son horribles Ni siquiera sé lo que estoy haciendo aquí ...

¡Pero son bastante interesantes! :RE

kirbyfan64sos
fuente
0

Rubí, 45 bytes

->i,t{[3,5,6,9,10,11,2,4,7,8,12,13][t*6+i-1]}

Entradas de prueba:

->i,t{[3,5,6,9,10,11,2,4,7,8,12,13][t*6+i-1]}.call 1,0
=> 3

->i,t{[3,5,6,9,10,11,2,4,7,8,12,13][t*6+i-1]}.call 3,1
=> 7
Vasu Adari
fuente
0

Adelante, 26 bytes cada uno, 34 para bonificación

Similar a la versión C de Squeamish.

: P " CEFIJK" + C@ F AND ;
: B " BDGHLM" + C@ F AND ;

Prima:

: A " CEFIJKBDGHLM" + + C@ F AND ;

Use 0 para LED y 6 para botones. Y el orden de los parámetros no importa

Zakipu
fuente
-1

Pyth, 19 bytes cada uno

L.&.>3500459*4-6b15
L.&.>2390221*4-6b15

Para alfileres y botones, respectivamente.

kirbyfan64sos
fuente