ค้นหาโดยไม่มีข้อความสั่งแบบมีเงื่อนไข


23

ความท้าทายนี้ได้รับแรงบันดาลใจจากการเขียนโปรแกรมไมโครคอนโทรลเลอร์ Arduino ฉันมีไฟ LED 6 ดวงและปุ่ม 6 ปุ่มเชื่อมต่อกับหมุดต่าง ๆ บนกระดาน ในรหัสแต่ละปุ่มและ LED จะถูกกำหนดหมายเลข ID (1-6) หมายเลขพิน (ตั้งแต่ 0-13) ที่สอดคล้องกับหมายเลข ID จะค้นหาโดยใช้switchคำสั่ง เพื่อความสนุกฉันสงสัยว่าswitches เหล่านี้สามารถหลบเลี่ยงด้วยฟังก์ชันเลขคณิต / ฟังก์ชันอื่น ๆ เพื่อผู้ดูแลรหัสในอนาคตที่น่ากลัว

ความท้าทาย

จัดเตรียมฟังก์ชัน / ฟังก์ชั่นที่ใช้หมายเลข ID (จำนวนเต็ม) เป็นพารามิเตอร์และส่งกลับหมายเลขพิน (จำนวนเต็ม) สำหรับปุ่ม LED 6 ดวงและ / หรือปุ่ม 6 โดยไม่ต้องใช้คำสั่งแบบมีเงื่อนไข (no if, no switchand no ternary)

คืนค่าสำหรับไฟ 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 ใช้ภาษาใดก็ได้ทำในสิ่งที่คุณต้องการ

แก้ไข: ตามคำแนะนำของสตีฟเวอร์ริลตอนนี้เป็นความท้าทายของนักกอล์ฟ

โชคดี!

(หากคุณยังคงอ่าน: ถึงแม้ว่าจะไร้เหตุผลและไม่มีกฎเกณฑ์ตามมาตรฐานการเขียนโปรแกรม แต่การแมปจะขึ้นอยู่กับ pinout ของ Arduino Micro แต่ Pins 0 และ 1 นั้นสงวนไว้สำหรับการสื่อสารแบบอนุกรม ปุ่มถูกกำหนดให้กับหมุดที่เหลือ)


เราจะจ่ายต่อหนึ่งคลิก! ฉันไม่ได้ลงคะแนน แต่ฉันคิดว่านี่น่าจะเป็น codegolf การประกวดความนิยมแพร่หลายมากในสถานการณ์เช่นนี้ BTW คุณสามารถโพสต์คำถามได้ที่ sandbox meta.codegolf.stackexchange.com/q/2140/15599ของเราเพื่อให้พวกเขาได้ตรวจสอบก่อนโพสต์
Level River St

เมื่อคุณพูดว่า "ไม่ถ้า" ฉันสามารถใช้นิพจน์เงื่อนไขเป็นจำนวนเต็มได้หรือไม่ เช่น1+(1==1)?
kirbyfan64sos

ใช่พวกเขาสบายดี เฉพาะงบสามที่กล่าวถึงในความท้าทาย ( if, switchและ ternary) ปิดวงเงิน


1
@ สตีฟเวอร์ริลล์ขอบคุณสำหรับคำแนะนำความท้าทายคือตอนนี้โค้ดกอล์ฟ ถ้าฉันมีคุณสมบัติตรงตามความต้องการชื่อเสียงของ +5 สำหรับเมตาฉันจะโพสต์ในแซนด์บ็อกซ์ :) ดังนั้นขอขอบคุณอีกครั้งที่ไม่ได้ลงชม +1 ตัวแทนระดับต่ำ

คำตอบ:


10

C, 28 ไบต์ละ

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

นี่เป็นพื้นเดียวกันกับคำตอบโดย kirbyfan64sos แต่ใช้อาร์เรย์ char แทนจำนวนเต็มและมี dummy แรก dummy ดังนั้นไม่จำเป็นต้องลบ 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

yuck! ฉันรู้ว่ามันไม่ได้อยู่ในจิตวิญญาณของ 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

ภาพหน้าจอ

ต้นฉบับ:

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 คลื่นไส้

@squeamishossifrage คุณควรโพสต์สิ่งเหล่านั้นเป็นคำตอบของคุณเอง พวกเขาดีกว่าของฉันคือ :)
kirbyfan64sos

@ kirbyfan64sos โอเคแล้ว
ossifrage

4

Pyth - 12 ไบต์

ฐานเข้ารหัสอาร์เรย์

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

อันสุดท้ายจริง ๆ แล้วสิบสองไบต์ยกเว้นว่าฉันไม่สามารถเขียน carriage return ได้ดังนั้นฉันจึงหลบหนีไปได้

Test Suite สำหรับปุ่ม

Test Suite สำหรับไฟ LED


ฉันคิดว่า OP ตั้งใจให้สิ่งนี้เป็นฟังก์ชั่น ("เตรียมฟังก์ชั่น / ฟังก์ชั่น"); โดยที่มันควรจะเป็นเรื่องเล็กน้อยที่จะได้รับโบนัส: สิ่งที่คล้ายM@jC@"\rÝ"H+12*G2กันซึ่งใช้ 0 สำหรับพินและ 1 สำหรับปุ่มควรทำงาน
kirbyfan64sos

3

Pyth, โบนัสเท่านั้น: 20 ไบต์

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

param # 2 คือ 0 สำหรับ LED, 1 สำหรับปุ่ม ในการรับ Pin # สำหรับ LED4g4 0

ฉันจะโพสต์สิ่งนี้เป็นความคิดเห็นต่อรายการของ Maltysen แต่ฉันเพิ่งเริ่มต้นดังนั้นขาดชื่อเสียงที่ต้องการ ฉันเพิ่งเริ่มใช้ PYTH คืนนี้และยอมรับว่าฉันปรับวิธีการเข้ารหัสรายการได้อย่างมีประสิทธิภาพ

หากสิ่งนี้ไม่เหมาะสมขอโทษที่ลึกที่สุดของฉันและฉันจะลบรายการของฉัน


1
เฮ้ไบรอันทัค! ฉันดีใจที่คุณเริ่มใช้ภาษาของฉัน ความคิดของ Maltysen ที่นำมาใช้ใหม่อาจเป็นเรื่องที่ดีเนื่องจากการเข้ารหัสฐานไม่ใช่ความคิดใหม่ อย่างไรก็ตามการให้เครดิตที่คุณทำมีความสำคัญ โดยวิธีการที่ Pyth ไม่ควรเขียนในตัวพิมพ์ใหญ่ทั้งหมด - ไม่ใช่ตัวย่อมันเป็นเพียงชื่อ
isaacg

2

MIPS, 16 ไบต์

Bit shift และ bitmask การป้อนข้อมูลในการส่งออกใน$a0$v0

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

สำหรับโบนัสใช้ทันที 0xdc87420


เราไม่ควรนับขนาดของแหล่งที่มาเมื่อเล่นกอล์ฟ? :)
nitro2k01


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 ไบต์

ไฟ LED:

a=>`0   
`.charCodeAt(a)

ปุ่ม:

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

หากข้างต้นไม่ทำงาน (ซึ่งน่าจะเป็น) นี่คือ 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)|

ฉันไม่สามารถเอาอันที่สองมาทำงานกับ CR ดิบได้ดังนั้นฉันจึงต้องใช้ \r

โบนัส 41 ไบต์

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

พารามิเตอร์ที่สองคือ 0 สำหรับ LED และ 1 สำหรับปุ่ม


0

Brainf ** k, 107 ไบต์

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

นี่เป็นโปรแกรม BF ที่เขียนด้วยมือเป็นครั้งแรกของฉันฉันไม่สงสัยเลยว่าจะมีการเพิ่มประสิทธิภาพหลายอย่าง แต่มันก็ยังยอดเยี่ยม :)

ฉันไม่แน่ใจว่า[]นับเป็นเงื่อนไขหรือไม่ แต่ ... : /


เรามีความท้าทายที่เต็มไปด้วยผู้เพิ่มประสิทธิภาพ BF ในการกำจัดของคุณหากคุณต้องการใช้;)
Beta Decay

@BetaDecay พวกเขาดูดี แต่ไม่มีพวกเขาจริงๆที่ทำให้รหัสของฉันสั้นลง ... : /
kirbyfan64sos

หืมนั่นเป็นความอัปยศ: P
เบต้าสลายตัว

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 เป็น 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 หรือปุ่มใช้ 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 ไบต์ (โบนัสท้าทาย)

ใช้ฟังก์ชัน anonuymous:

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

หลังจากนิยามฟังก์ชั่นนี้ให้เรียกฟังก์ชั่นนี้ans(x,y)โดยที่xมีหมายเลขพิน / ปุ่มและyระบุพินหรือปุ่มที่มีค่า1และ2ตามลำดับ

ลองออนไลน์


0

JavaScript 113 74 66 59 52 33 (หนึ่งฟังก์ชั่น)

ใช้ bit shift เพื่อรับค่า 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 ควรเป็น 0 สำหรับ LED และ 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

ไปมา 26 ไบต์แต่ละ 34 สำหรับโบนัส

คล้ายกับเวอร์ชั่น C โดยคลื่นไส้

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

โบนัส:

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

ใช้ 0 สำหรับ LED และ 6 สำหรับปุ่ม และลำดับพารามิเตอร์ไม่สำคัญ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.