Wyszukiwanie bez instrukcji warunkowych

23

Wyzwanie to zostało zainspirowane zaprogramowaniem mikrokontrolera Arduino. Mam 6 diod LED i 6 przycisków podłączonych do różnych pinów na płycie. W kodzie każdemu przyciskowi i diodzie LED przypisany jest numer identyfikacyjny (1-6). Numery pinów (od 0–13) odpowiadające numerom identyfikacyjnym są wyszukiwane za pomocą switchinstrukcji. Czysto dla rozrywki zastanawiałem się, czy toswitch można je ominąć za pomocą funkcji arytmetycznej / innej, aby przerazić przyszłych opiekunów kodu.

Wyzwanie

Podaj funkcję / funkcje, które przyjmują numer identyfikacyjny (liczba całkowita) jako parametr i zwracają numer pinu (liczba całkowita) dla 6 diod LED i / lub 6 przycisków, bez użycia instrukcji warunkowych (nie if, nie switchi brak trójki).

Zwracane wartości dla diod LED:

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

Zwróć wartości dla przycisków:

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

Wyzwanie premiowe

Podaj jedną funkcję, która pobiera numer identyfikacyjny (liczba całkowita) i drugi parametr (dowolny typ) wskazujący, czy wymagane są styki diody LED lub przycisku, i zwraca odpowiedni pin (liczba całkowita).

Zasady

To nie Arduino specyficzne wyzwanie. Używaj dowolnego języka i rób co chcesz.

Edycja: na sugestię Steveverril , jest to teraz wyzwanie golfa kodu .

Powodzenia!

(Jeśli nadal czytasz: chociaż ewidentnie absurdalne i arbitralne według standardów programowania, mapowania są oparte na pinout Arduino Micro. Piny 0 i 1 są zarezerwowane do komunikacji szeregowej, diody LED są przypisane do 6 pinów o najniższym numerze PWM , przyciski są przypisane do pozostałych pinów)


źródło
Witamy w PPCG! Nie przegłosowałem, ale myślę, że lepiej by to wyglądało jak codegolf. Konkurs popularności jest bardzo szeroki w takiej sytuacji. BTW, możesz wysyłać pytania na naszej piaskownicy meta.codegolf.stackexchange.com/q/2140/15599, aby je przejrzeć przed opublikowaniem
Level River St
Kiedy powiesz „nie, jeśli”, czy mogę użyć wyrażenia warunkowego jako liczby całkowitej? Na przykład 1+(1==1)?
kirbyfan64sos
Tak, są w porządku. Tylko trzy oświadczenia wymienione w wyzwaniu ( if, switchi trójskładnikowych) są poza granice.
Powiązane
Peter Taylor
1
@steveverrill dziękuję za sugestię, wyzwanie jest teraz kod golfa. Gdybym spełnił wymaganie dotyczące reputacji +5 dla meta, napisałbym w piaskownicy :) Więc podwójnie dziękuję, że nie oddałeś głosu za mało repetytora +1.

Odpowiedzi:

10

C, po 28 bajtów

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

Jest to w zasadzie to samo co odpowiedź kirbyfan64sos, ale używa tablicy char zamiast liczb całkowitych i ma fikcyjny pierwszy bajt, więc nie ma potrzeby odejmowania 1 od parametru funkcji.

piskliwy kostuch
źródło
9

Haskell, 24 bajty każdy

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

sprawdzić:

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

.

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

sprawdzić:

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

bonus, Haskell, 36 bajtów

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

sprawdzić:

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

0 dla przycisków, 1 dla diod LED.

Leif Willerts
źródło
1
W premii powinieneś być w stanie użyć a f n=n+a f(n+f+div 1f+2).
dfeuer
Fuj! Wiem, że to nie w duchu codegolfa, ale jest o wiele za późno i zbyt mało, aby zredagować idealnie dobre rozwiązanie. Doceń jednak uwagę (do szczegółów)
Leif Willerts
Jak jest już za późno?
dfeuer
7

C (matematyka), 32 / 27 26 bajtów (45 na wyzwanie premiowe)

Kilka osób opublikowało różne rozwiązania wyszukiwania tabel, ale wydawało mi się, że to łatwe wyjście. Chciałem zobaczyć, jak dobrze sobie radzę z operacjami czysto matematycznymi:

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

Nie było jasne, czy jedna funkcja wywołująca drugą była akceptowalna, czy nie; jeśli nie, zamiast tego można użyć tej alternatywnej definicji b(i)(33 bajtów):

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

Wyzwanie bonusowe (45 bajtów):

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

(podać t=0dla przycisków, t=1dla diod LED)

Foogod
źródło
5

C, 36 bajtów każdy (49 bajtów na wyzwanie premiowe)

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

Przepraszam ... Po prostu nie mogłem nic na to poradzić ... Ok, teraz umieściłem prawdziwe rozwiązanie.

Wyzwanie bonusowe, 49 bajtów

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

Użyj f(button,0)i f(pin,1).

Demo na żywo w Ideone.

Screenshot

Oryginały:

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
źródło
1
Gdybym chciał sensownych odpowiedzi, nie publikowałbym teraz w PPCG. Chciałbym: P Co ciekawe, użycie tego w rzeczywistym programie Arduino daje większy rozmiar skompilowanego pliku binarnego (co przy ~ 28 KB miejsca na płycie, jest czymś, czego należy unikać).
Jak o p(i){return"@cefijk"[i]&15;}b(i){return"@bdghlm"[i]&15;}?
piskliwy ossifrage
@squeamishossifrage Powinieneś opublikować je jako własną odpowiedź. Są lepsze niż moje. :)
kirbyfan64sos
@ kirbyfan64sos Oh ok, a potem
skrzypliwy ossifrage
4

Pyth - 12 bajtów każdy

Baza koduje tablicę.

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

Ostatni ma w rzeczywistości dwanaście bajtów, tyle że nie mogę napisać powrotu karetki, więc go uniknąłem.

Pakiet testowy dla przycisków .

Pakiet testowy dla diod LED .

Maltysen
źródło
Myślę, że OP ma być funkcją („Zapewnij funkcję / funkcje”); dlatego uzyskanie bonusu powinno być trywialne: coś w stylu M@jC@"\rÝ"H+12*G2, które używa 0 dla pinów i 1 dla przycisków powinno działać.
kirbyfan64sos
3

Pyth, tylko bonus: 20 bajtów

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

parametr nr 2 wynosi 0 dla diod LED, 1 dla przycisków. Aby uzyskać numer PIN dla LED4,g4 0

Zamieściłbym to jako komentarz do wpisu Maltysena, ale dopiero zacząłem, więc brakuje mi wymaganej reputacji. Właśnie zacząłem dziś korzystać z PYTH i przyznaję, że bezwstydnie dostosowałem jego metodę skutecznego kodowania listy.

Jeśli to było nieodpowiednie, przepraszam i usunę mój wpis.

Brian Tuck
źródło
1
Cześć Brian Tuck! Cieszę się, że zacząłeś używać mojego języka. Ponowne użycie pomysłu Maltysena było prawdopodobnie w porządku, ponieważ podstawowe kodowanie nie jest zupełnie nowym pomysłem. Ważne jest jednak uznanie, które zrobiłeś. Nawiasem mówiąc, Pyth nie powinien być pisany wielkimi literami - to nie akronim, to tylko nazwa.
isaacg
2

MIPS, 16 bajtów

Przesunięcie i maska ​​bitowa. Wejście $a0, wyjście $v0.

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

Aby uzyskać bonus, użyj natychmiast 0xdc87420

qwr
źródło
Czy nie powinniśmy liczyć wielkości źródła podczas gry w golfa? :)
nitro2k01
2

F #, 28 + 28 bajtów

Chciałem tego spróbować bez tabeli odnośników.

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
źródło
1

SWI-Prolog, 34 bajty każdy

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/2dotyczy diod LED, b/2dotyczy przycisków.

Bonus, 66 bajtów

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 w przypadku diod LED, wszystko inne w przypadku przycisków.

Fatalizować
źródło
1

q / k (każdy 18 bajtów)

Po prostu przypadek indeksowania:

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

Przykład:

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

Premia (1 bajt, podane zdefiniowane L i B)

@

Przykład:

q) @[`L;2]
5
q) @[`B;6]
13
skeevey
źródło
To zwodniczo sprytne użycie symboli! +1
kirbyfan64sos
1

CJam, 10 bajtów każdy

To są anonimowe funkcje. Łącza do interpretera online pokazują następnie w małej wiązce testowej, która wykonuje funkcję dla wszystkich wartości wejściowych.

Funkcja 1 (diody LED):

{5*3|4+3/}

Wypróbuj online

Funkcja 2 (przyciski):

{_6|5+*5/}

Wypróbuj online

Napisałem mały program, który generuje i ocenia te wyrażenia. Dla obu z nich znaleziono szereg rozwiązań z 8 znakami (licząc wyrażenie tylko bez nawiasów klamrowych), ale żadne z mniejszym.

Reto Koradi
źródło
0

JavaScript (ES6), 26/27 bajtów

Diody LED:

a=>`0   
`.charCodeAt(a)

Guziki:

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

Jeśli powyższe nie działa (co jest prawdopodobne), oto zrzut heksowy:

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

Nie mogłem zmusić drugiego do pracy z surowym CR, więc musiałem go użyć \r

Bonus, 41 bajtów

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

Drugi parametr to 0 dla diod LED i 1 dla przycisków.

DankMemes
źródło
0

Brainf ** k, 107 bajtów

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

Jest to mój pierwszy ręcznie kodowany program BF, nie mam wątpliwości, że należy wprowadzić kilka optymalizacji. Ale wciąż jest niesamowity. :)

Nie jestem jednak pewien, czy []liczy się jako warunkowe ...: /

kirbyfan64sos
źródło
Mamy wyzwanie pełne optymalizatory BF do Państwa dyspozycji, jeśli chcesz korzystać z jednego;)
Beta Decay
@BetaDecay Wyglądają świetnie, ale żaden z nich tak naprawdę nie skraca mojego kodu ...: /
kirbyfan64sos
Hm, szkoda: P
Beta Decay
0

POWERSHELL - 27-27-72

Diody LED używają 1..6 jako argumentów

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

przycisk użyj 1..6 jako argumentów

:\>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 lub PRZYCISK używają b 1; 1 2; b 6; 5 itd. jako argumenty

:\>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
źródło
0

Oktawa, 40 bajtów (wyzwanie premiowe)

Korzystanie z funkcji premiowej:

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

Po zdefiniowaniu tej funkcji, wywołaj tę funkcję jako ans(x,y), gdzie xjest numerem pin / przycisku i ywskazuje pin lub przycisk z wartościami 1i2 odpowiednio.

Wypróbuj online

Luis Mendo
źródło
0

JavaScript 113 74 66 59 52 33 (jedna funkcja)

Korzystanie z przesunięcia bitowego w celu uzyskania wartości 4-bitowych. Należy wywołać za pomocą p (n, 195650864 lub 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}

Alternatywny.

/*
Using bitwise * 4 for bitwise only.    
function p(i,b){return b>>(i<<2)&15}
*/
wolfhammer
źródło
0

Perl 4 (37 i 31 bajtów)

Diody LED (37 bajtów):

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

... ale używa tabeli odnośników.

Przyciski (31 bajtów, bez wyszukiwania):

$c=pop;2*($c+($c==5))+($c%3==0)
msh210
źródło
0

JavaScript (ES6) 18,22,44

Edytuj Krótszy, ale nudny

// 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
źródło
0

Python, 31 bajtów każdy

Nie do końca kreatywne czy coś, ale działa!

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

Bonus, 44 bajtów

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

y powinno wynosić 0 dla diod LED i 1 dla przycisków.

Kade
źródło
0

Python, 60 + 58 = 118 bajtów

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)

Te są okropne. nawet nie wiem co tu robię ...

Ale mimo to są całkiem interesujące! :RE

kirbyfan64sos
źródło
0

Ruby, 45 bajtów

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

Wejścia testowe:

->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
źródło
0

Dalej, po 26 bajtów, 34 za bonus

Podobne do wersji C przez squeamish.

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

Premia:

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

Użyj 0 dla diod LED i 6 dla przycisków. Kolejność parametrów nie ma znaczenia

Zakipu
źródło
-1

Pyth, 19 bajtów każdy

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

Odpowiednio do szpilek i przycisków.

kirbyfan64sos
źródło