没有条件语句的查找


23

这项挑战的灵感来自对Arduino微控制器进行编程。我有6个LED和6个按钮连接到板上的各种引脚。在代码中,每个按钮和LED都分配有一个ID号(1-6)。使用switch语句查找与ID号对应的针号(范围为0-13)。纯粹出于娱乐目的,我想知道是否switch可以使用算术/其他函数规避这些ES,以使将来的代码维护人员感到恐惧。

挑战

提供以ID号(整数)为参数并返回6个LED和/或6个按钮的引脚号(整数)的功能,而无需使用条件语句(no if,no switch和no三元)。

LED的返回值:

ID    Pin
1      3 
2      5
3      6
4      9
5     10
6     11

返回按钮的值:

ID    Pin
1      2 
2      4
3      7
4      8
5     12
6     13

奖金挑战

提供一个具有ID号(整数)和第二个参数(任何类型)的单一功能,该参数指示是否请求LED或按钮引脚,并返回相应的引脚(整数)。

规则

不是特定于Arduino的挑战。使用任何语言,做任何你想要的。

编辑:在steveverril的建议下,这现在是高尔夫挑战赛。

祝好运!

(如果您仍在阅读:虽然按编程标准显然是荒谬的和任意的,但映射是基于Arduino Micro的引脚排列的。引脚0和1保留用于串行通信,LED分配给6个编号最小的PWM功能引脚,按钮将分配给其余的引脚)


欢迎来到PPCG!我没有拒绝投票,但我认为作为一个代码高尔夫,这样做会更好。在这种情况下,人气竞赛非常广泛。顺便说一句,你可以在我们的沙发布问题meta.codegolf.stackexchange.com/q/2140/15599接受审核之前发布
级圣河

当您说“否”时,我可以使用条件表达式作为整数吗?例如1+(1==1)
kirbyfan64sos

是的,那很好。挑战中仅提及了三个声明(ifswitch和三元)是关闭的限制。


1
@steveverrill谢谢您的建议,现在的挑战就是代码高尔夫。如果我满足meta对+5的声誉要求,我会在沙盒中发布:)非常感谢您不要低估+1代表随意。

Answers:


10

C,每个28字节

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

这基本上与kirbyfan64sos的答案相同,但是使用char数组而不是整数,并且具有一个虚拟的第一个字节,因此无需从功能参数中减去1。


9

Haskell,每个24个字节

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

去检查:

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

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

去检查:

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

红利,Haskell,36个字节

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

去检查:

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

0为按钮,1为LED。


1
在奖金中,您应该可以使用a f n=n+a f(n+f+div 1f+2)
dfeuer

!我知道这不符合codegolf的精神,但这为时已晚且太小而无法编辑完美的解决方案。赞赏(细节)的关注
Leif Willerts

怎么会太晚了?
dfeuer

7

C(数学),32 / 27 26个字节(奖励挑战为45个字节)

有几个人发布了各种表格查找解决方案,但是在我看来,这就像走简单的路。

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

尚不清楚一个函数调用另一个函数是否可以接受。如果不是,则可以使用此替代定义b(i)(33个字节):

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

奖励挑战(45个字节):

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

(通过t=0按钮,t=1用于LED)


5

C,每个36字节(奖励挑战为49字节)

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

对不起...我只是无能为力...好的,我现在提出一个真正的解决方案。

额外挑战,49个字节

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

使用f(button,0)f(pin,1)

Ideone现场演示。

Screenshot

原稿:

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];}

1
如果我想要一个明智的答案,那么我现在就不用发布在PPCG上了:P有趣的是,在实际的Arduino程序中使用它会导致编译后的二进制文件更大的大小(考虑到板上的〜28K的存储空间,是应避免的事情)。

怎么p(i){return"@cefijk"[i]&15;}b(i){return"@bdghlm"[i]&15;}
吱吱作响的ossifrage,2015年

@squeamishossifrage您应该将其发布为自己的答案。他们比我的好。:)
kirbyfan64sos

@ kirbyfan64sos好的,那么
吱吱作响的ossifrage

4

Pyth-每个12字节

Base对数组进行编码。

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

最后一个实际上是十二个字节,除了我不能写回车符,所以我转义了它。

按钮测试套件

LED的测试套件


我认为OP打算将此功能用作功能(“提供功能”);因此,获得奖金应该是微不足道的:类似的东西M@jC@"\rÝ"H+12*G2,可以使用0作为大头针,使用1作为大头针。
kirbyfan64sos 2015年

3

Pyth,仅奖励:20个字节

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

参数#2对于LED为0,对于按钮为1。要获取LED4的Pin号,g4 0

我会将其发布为对Maltysen的评论,但我才刚刚开始,因此缺少所需的声誉。我今晚刚刚开始使用PYTH,并承认我无耻地采用了他的有效编码列表的方法。

如果不合适,我深表歉意,并将删除我的内容。


1
嘿Brian Tuck!很高兴您开始使用我的语言。Maltysen想法的这种重用可能很好,因为基本编码并不是一个新想法。但是,给予您信誉是很重要的。顺便说一句,Pyth不应全部用大写字母书写-它不是首字母缩写词,而只是一个名字。
isaacg's

2

MIPS,16个字节

移位和位掩码。输入输入$a0,输出输入$v0

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

奖金,立即使用 0xdc87420


打高尔夫球时我们不应该计算来源的大小吗?:)
nitro2k01 2015年

2

F#,28 + 28字节

我想在没有查找表的情况下尝试此操作。

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

1

SWI-Prolog,每个34字节

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 用于LED, b/2用于按钮。

奖励,66个字节

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 用于LED,其他用于按钮。


1

q / k(每个18字节)

只是索引的一种情况:

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

例:

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

奖金(1个字节,已定义L和B)

@

例:

q) @[`L;2]
5
q) @[`B;6]
13

看似巧妙地使用符号!+1
kirbyfan64sos

1

CJam,每个10字节

这些是匿名函数。然后,在执行所有输入值功能的小型测试工具中显示在线解释器的链接。

功能1(LED):

{5*3|4+3/}

在线尝试

功能2(按钮):

{_6|5+*5/}

在线尝试

我写了一个小程序来生成和评估这些表达式。对于他们两个,它都找到了许多具有8个字符的解决方案(仅计算不带花括号的表达式),而没有一个解决方案。


0

Javascript(ES6),26/27字节

指示灯:

a=>`0   
`.charCodeAt(a)

纽扣:

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

如果上面的命令没有运行(可能),这是一个十六进制转储:

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

我无法获得第二个来处理原始CR,所以我不得不使用 \r

奖励,41个字节

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

十六进制转储

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

第二个参数对于LED为0,对于按钮为1。


0

Brainf ** k,107个字节

,>++++++++[>+>++++++<<-<------>]<[>+++<-[>++<-[>+<-[>+++<-[>>>+>+<<<[-]+<-]]]]]>>[<++++++>-]<.>>>[-[-]<-.>]

这是我的第一个手工编码的BF程序,我毫不怀疑要进行几个优化。但这仍然很棒。:)

我不确定是否[]算作有条件的,但是...:/


如果您想使用一台,我们将面对一个充满BF优化器的挑战;)
Beta Decay 2015年

@BetaDecay它们看起来不错,但实际上它们都没有使我的代码更短...:/
kirbyfan64sos 2015年

嗯,太可惜了:P
Beta Decay

0

POWERSHELL-27-27-72

LED使用1..6作为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

按钮使用1..6作为参数

:\>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或按钮使用b 1; l 2; b 6; l 5等作为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

0

八度,40字节(额外挑战)

使用匿名函数:

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

定义此功能后,将此功能称为ans(x,y),其中x是引脚/按钮编号,并分别y使用和指示引脚或按钮。12

在线尝试


0

的JavaScript 113 74 66 59 52 33(一个功能)

使用位移获得4位值。必须使用p(n,195650864或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}

备用。

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

0

Perl 4(37和31个字节)

LED(37字节):

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

...但是它使用查找表。

按钮(31字节,无查找):

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

0

JavaScript(ES6)18、22、44

编辑较短但无聊

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


0

Python,每个31字节

并非完全具有创造力或其他任何功能,但可以正常工作!

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

红利,44字节

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

y 对于LED,应为0,对于按钮应为1。


0

Python,60 + 58 = 118字节

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)

这些太可怕了。我什至不知道我在这里做什么...

但是它们仍然非常有趣!:D


0

Ruby,45字节

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

测试输入:

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

0

第四,每个26字节,奖金34

类似于C版本的squeamish。

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

奖金:

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

将0用于LED,将6用于按钮。而且参数顺序无关紧要


-1

Pyth,每个19字节

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

分别用于针脚和按钮。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.