Cari tanpa pernyataan bersyarat

23

Tantangan ini diinspirasi oleh pemrograman mikrokontroler Arduino. Saya memiliki 6 LED dan 6 tombol yang terhubung ke berbagai pin di papan tulis. Dalam kode tersebut, setiap tombol dan LED diberi nomor ID (1-6). Nomor pin (mulai dari 0-13) yang sesuai dengan nomor ID dilihat dengan menggunakan switchpernyataan. Murni untuk hiburan, saya bertanya-tanya apakah switches ini bisa dielakkan dengan fungsi aritmatika / lainnya hanya untuk menakuti pemelihara kode masa depan.

Tantangan

Berikan fungsi / fungsi yang mengambil nomor ID (integer) sebagai parameter dan mengembalikan nomor pin (integer) untuk 6 LED dan / atau 6 tombol, tanpa menggunakan pernyataan kondisional (tidak if, tidak, switchdan tidak ada ternary).

Nilai pengembalian untuk LED:

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

Kembalikan nilai untuk tombol:

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

Tantangan bonus

Berikan fungsi tunggal yang mengambil nomor ID (integer) dan parameter kedua (tipe apa pun) yang menunjukkan apakah pin LED atau tombol diminta, dan mengembalikan pin yang sesuai (integer).

Aturan

Ini bukan tantangan khusus Arduino. Gunakan bahasa apa pun , lakukan apa pun yang Anda inginkan.

Sunting: atas saran steveverril , ini sekarang menjadi tantangan kode golf .

Semoga berhasil!

(Jika Anda masih membaca: meskipun jelas absurd dan sewenang-wenang oleh standar pemrograman, pemetaan didasarkan pada pinout Arduino Micro. Pin 0 dan 1 dicadangkan untuk komunikasi serial, LED ditugaskan ke 6 pin berkemampuan PWM dengan jumlah terendah , tombol ditetapkan untuk pin yang tersisa)


sumber
Selamat Datang di PPCG! Saya tidak downvote, tapi saya pikir ini akan lebih baik sebagai codegolf. Kontes popularitas sangat luas dalam situasi seperti ini. BTW, Anda dapat memposting pertanyaan di kotak pasir kami meta.codegolf.stackexchange.com/q/2140/15599 untuk ditinjau sebelum diposkan
Level River St
Ketika Anda mengatakan "tidak jika", dapatkah saya menggunakan ekspresi kondisional sebagai bilangan bulat? Misalnya 1+(1==1)?
kirbyfan64sos
Ya, itu baik-baik saja. Hanya tiga pernyataan yang disebutkan dalam tantangan ( if, switchdan ternary) yang terlarang.
Terkait
Peter Taylor
1
@steveverrill terima kasih atas sarannya, tantangan sekarang adalah kode golf. Seandainya saya memenuhi persyaratan reputasi +5 untuk meta, saya akan memposting di Sandbox :) Jadi terima kasih dua kali lipat untuk tidak downvoting +1 rep rendah kasual.

Jawaban:

10

C, masing-masing 28 byte

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

Ini pada dasarnya sama dengan jawaban oleh kirbyfan64sos, tetapi menggunakan array char bukan bilangan bulat, dan memiliki byte pertama dummy sehingga tidak perlu mengurangi 1 dari parameter fungsi.

osifrque melengking
sumber
9

Haskell, masing-masing 24 byte

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

untuk memeriksa:

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

.

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

untuk memeriksa:

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

bonus, Haskell, 36 byte

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

untuk memeriksa:

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

0 untuk tombol, 1 untuk LED.

Leif Willerts
sumber
1
Dalam bonus, Anda harus bisa menggunakan a f n=n+a f(n+f+div 1f+2).
dfeuer
Huek! Saya tahu ini bukan semangat codegolf, tapi ini sudah terlambat dan terlalu kecil untuk mengedit solusi yang sangat baik. Hargai perhatian (detail)
Leif Willerts
Bagaimana ini sudah terlambat?
dfeuer
7

C (matematika), 32 / 27 26 byte (45 untuk tantangan bonus)

Beberapa orang telah memposting berbagai solusi pencarian tabel, tetapi bagi saya sepertinya mengambil jalan keluar yang mudah .. Saya ingin melihat seberapa baik yang dapat saya lakukan dengan operasi matematika murni:

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

Tidak jelas apakah satu fungsi memanggil yang lain dapat diterima atau tidak; jika tidak, seseorang dapat menggunakan definisi alternatif ini b(i)(33 byte) sebagai gantinya:

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

Tantangan Bonus (45 byte):

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

(lulus t=0untuk tombol, t=1untuk LED)

Foogod
sumber
5

C, masing-masing 36 byte (49 byte untuk tantangan bonus)

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

Maaf ... saya tidak bisa menahannya ... Ok, saya memberikan solusi nyata sekarang.

Tantangan bonus, 49 byte

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

Gunakan f(button,0)dan f(pin,1).

Demo langsung di Ideone.

Tangkapan layar

Aslinya:

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
sumber
1
Jika saya ingin jawaban yang masuk akal, saya tidak akan memposting di PPCG sekarang akan saya: P Menariknya, menggunakan ini dalam program Arduino yang sebenarnya menghasilkan ukuran yang lebih besar untuk biner yang dikompilasi (yang, memberikan ~ 28K ruang penyimpanan di papan tulis, adalah sesuatu yang harus dihindari).
Bagaimana dengan p(i){return"@cefijk"[i]&15;}b(i){return"@bdghlm"[i]&15;}?
squeamish ossifrage
@squeamishossifrage Anda harus mempostingnya sebagai jawaban Anda sendiri. Mereka lebih baik daripada milikku. :)
kirbyfan64sos
@ kirbyfan64sos Oh ok kalau begitu
squeamish ossifrage
4

Pyth - masing-masing 12 byte

Basis mengkodekan array.

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

Yang terakhir sebenarnya dua belas byte kecuali saya tidak bisa menulis carriage return jadi saya menghindarinya.

Suite Uji untuk Tombol .

Test Suite untuk LED .

Maltysen
sumber
Saya pikir OP dimaksudkan untuk ini menjadi fungsi ("Berikan fungsi / fungsi"); dengan itu seharusnya sepele untuk mendapatkan bonus: sesuatu seperti M@jC@"\rÝ"H+12*G2, yang menggunakan 0 untuk pin dan 1 untuk tombol harus berfungsi.
kirbyfan64sos
3

Pyth, Bonus saja: 20 byte

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

param # 2 adalah 0 untuk LED, 1 untuk Tombol. Untuk mendapatkan Pin # untuk LED4,g4 0

Saya akan memposting ini sebagai komentar untuk entri Maltysen, tapi saya baru saja mulai, jadi tidak memiliki reputasi yang diperlukan. Saya baru saja mulai menggunakan PYTH malam ini, dan mengakui bahwa saya tanpa malu-malu menyesuaikan metode penyandian daftar secara efisien.

Jika ini tidak pantas, permintaan maaf terdalam saya, dan saya akan menghapus entri saya.

Brian Tuck
sumber
1
Hei Brian Tuck! Saya senang Anda sudah mulai menggunakan bahasa saya. Penggunaan kembali ide Maltysen ini mungkin baik-baik saja, karena pengkodean basis bukan ide baru. Namun, memberi kredit, yang Anda lakukan, adalah penting. Ngomong-ngomong, Pyth tidak boleh ditulis dalam huruf kapital semua - itu bukan akronim, itu hanya nama.
isaacg
2

MIPS, 16 byte

Sedikit bergeser dan bitmask. Input masuk $a0, keluaran masuk $v0.

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

Untuk bonus, gunakan segera 0xdc87420

qwr
sumber
Bukankah kita seharusnya menghitung ukuran sumber saat bermain golf? :)
nitro2k01
2

F #, 28 + 28 byte

Saya ingin mencoba ini tanpa tabel pencarian.

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
Makanan Tangan
sumber
1

SWI-Prolog, masing-masing 34 byte

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 untuk LED, b/2 untuk tombol.

Bonus, 66 byte

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 untuk LED, apa pun untuk Buttons.

Fatalisasi
sumber
1

q / k (masing-masing 18 byte)

Cukup kasus pengindeksan:

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

Contoh:

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

Bonus (1 byte, diberikan L & B ditentukan)

@

Contoh:

q) @[`L;2]
5
q) @[`B;6]
13
skeevey
sumber
Ini adalah penggunaan simbol yang sangat cerdik! +1
kirbyfan64sos
1

CJam, masing-masing 10 byte

Ini adalah fungsi anonim. Tautan ke juru bahasa online menunjukkan kemudian di dalam test harness kecil yang menjalankan fungsi untuk semua nilai input.

Fungsi 1 (LED):

{5*3|4+3/}

Cobalah online

Fungsi 2 (tombol):

{_6|5+*5/}

Cobalah online

Saya menulis sebuah program kecil yang menghasilkan dan mengevaluasi ungkapan-ungkapan ini. Untuk keduanya, ia menemukan sejumlah solusi dengan 8 karakter (menghitung ekspresi hanya tanpa kawat gigi), tetapi tidak ada yang kurang.

Reto Koradi
sumber
0

Javascript (ES6), 26/27 byte

LED:

a=>`0   
`.charCodeAt(a)

Tombol:

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

Jika hal di atas tidak berjalan (yang kemungkinan), inilah 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)|

Saya tidak bisa mendapatkan yang kedua untuk bekerja dengan CR mentah sehingga saya harus menggunakannya \r

Bonus, 41 byte

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

Parameter kedua adalah 0 untuk LED, dan 1 untuk tombol.

DankMemes
sumber
0

Brainf ** k, 107 byte

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

Ini adalah program BF kode tangan pertama saya, saya tidak ragu bahwa ada beberapa optimasi yang harus dilakukan. Tapi ini masih mengagumkan. :)

Saya tidak yakin apakah []dianggap sebagai persyaratan, ...: /

kirbyfan64sos
sumber
Kami memiliki tantangan penuh pengoptimal BF yang Anda inginkan jika Anda ingin menggunakannya;)
Beta Decay
@ BetaDecay Mereka tampak hebat, tetapi tidak ada yang benar-benar membuat kode saya lebih pendek ...: /
kirbyfan64sos
Hm, itu memalukan: P
Beta Decay
0

POWERSHELL - 27-27-72

LED menggunakan 1..6 sebagai 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

tombol gunakan 1..6 sebagai 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 atau TOMBOL gunakan b 1; l 2; b 6; 5 dll sebagai 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
mengoceh
sumber
0

Oktaf, 40 byte (tantangan bonus)

Menggunakan fungsi anonuymous:

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

Setelah mendefinisikan fungsi ini, panggil fungsi ini sebagai ans(x,y), di mana xnomor pin / tombol dan ymenunjukkan pin atau tombol dengan nilai 1dan 2masing - masing.

Cobalah online

Luis Mendo
sumber
0

JavaScript 113 74 66 59 52 33 (satu fungsi)

Menggunakan bit shift untuk mendapatkan nilai 4bit. Harus dipanggil dengan p (n, 195650864 atau 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}

Bergantian.

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

Perl 4 (37 dan 31 byte)

LED (37 byte):

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

... tetapi menggunakan tabel pencarian.

Tombol (31 byte, tidak ada pencarian):

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

JavaScript (ES6) 18,22,44

Sunting Lebih pendek tapi membosankan

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

Python, 31 Bytes Masing-masing

Tidak sepenuhnya kreatif atau apa pun, tetapi berhasil!

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 harus 0 untuk LED, dan 1 untuk tombol.

Kade
sumber
0

Python, 60 + 58 = 118 byte

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)

Ini mengerikan. Saya bahkan tidak tahu apa yang saya lakukan di sini ...

Tapi mereka tetap sangat menarik! : D

kirbyfan64sos
sumber
0

Ruby, 45 Bytes

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

Input Tes:

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

Keempat, masing-masing 26 byte, 34 untuk bonus

Mirip dengan versi C oleh squeamish.

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

Bonus:

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

Gunakan 0 untuk LED dan 6 untuk tombol. Dan urutan parameter tidak masalah

Zakipu
sumber
-1

Pyth, masing-masing 19 byte

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

Untuk pin dan tombol, masing-masing.

kirbyfan64sos
sumber