Пошук без умовних тверджень


23

Цей виклик був натхненний програмуванням мікроконтролера Arduino. У мене на дошці є 6 світлодіодів та 6 кнопок, підключених до різних штифтів. У коді кожній кнопці та світлодіоду присвоюється ідентифікаційний номер (1-6). Номери шпильок (від 0-13), що відповідають ідентифікаційним номерам, шукаються за допомогою switchоператора. Цілком для розваги мені було цікаво, чи можна ці switchес обходити арифметичною / іншою функцією просто для того, щоб жахнути майбутніх утримувачів коду.

Змагання

Надайте функцію / функції, які приймають ідентифікаційний номер (ціле число) як параметр та повертають штифтове число (ціле число) для 6 світлодіодів та / або 6 кнопок, не використовуючи умовні висловлювання (ні if, ні switchта не потрійні).

Повернені значення для світлодіодів:

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

Бонусний виклик

Надайте єдину функцію, яка приймає ідентифікаційний номер (ціле число) та другий параметр (будь-якого типу), що вказує, чи потрібно запитувати світлодіодні або кнопкові шпильки, і повертає відповідний штифт (ціле число).

Правила

Це не специфічний для Ардуїно виклик. Використовуйте будь-яку мову , робіть все, що завгодно.

Редагувати: за пропозицією steveverril , це тепер завдання з гольфним кодом .

Удачі!

(Якщо ви все ще читаєте: хоч явно абсурдні та довільні за стандартами програмування, відображення базуються на чіткості Arduino Micro. Штифти 0 і 1 зарезервовані для послідовного зв'язку , кнопки призначені для інших шпильок)


Вітаємо в PPCG! Я не виступав, але думаю, що це піде краще як кодегогоф. Конкурс популярності дуже широкий у такій ситуації. До речі, ви можете ставити запитання на нашому sand.box meta.codegolf.stackexchange.com/q/2140/15599, щоб переглянути їх перед публікацією
Level River St

Коли ви скажете "ні, якщо", чи можу я використовувати умовний вираз як ціле число? Наприклад 1+(1==1)?
kirbyfan64sos

Так, це добре. Тільки три твердження , згадані в запиті ( if, switchі потрійним) від меж.


1
@steveverrill дякую за пропозицію, виклик зараз є кодом гольфу. Якби я відповідав вимозі репутації +5 для мета, я б розмістив її в пісочниці :) Тож подвійне дякую за те, що ти не відмовився від низького +1 реферала.

Відповіді:


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 для світлодіодів.


1
У бонус ви повинні мати можливість використовувати a f n=n+a f(n+f+div 1f+2).
dfeuer

Гидота! Я знаю, що це не в дусі кодегольфа, але це занадто пізно і занадто незначно для редагування ідеально хорошого рішення. Вдячні за увагу (до деталей)
Лейф Віллерс

Як це коли-небудь пізно?
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для світлодіодів)


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 призводить до отримання більшого розміру для складеного бінарного файлу (що з огляду на ~ 28 Кб місця для зберігання на дошці, чогось уникати).

Як щодо p(i){return"@cefijk"[i]&15;}b(i){return"@bdghlm"[i]&15;}?
писклива косточка

@squeamishossifrage Ви повинні розмістити їх як власну відповідь. Вони кращі, ніж мої. :)
kirbyfan64sos

@ Kirbyfan64sos Ой добре тоді
гидливо грифа

4

Pyth - 12 байт кожен

База кодує масив.

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

Останній - насправді дванадцять байтів, за винятком того, що я не можу написати повернення каретки, тому я уникнув цього.

Тестовий набір для кнопок .

Тестовий набір для світлодіодів .


Я думаю, що ОП, призначений для цього, буде функцією ("Надати функцію / функції"); з цим слід отримати тривіальність, щоб отримати бонус: щось подібне M@jC@"\rÝ"H+12*G2, яке використовує 0 для шпильок і 1 для кнопок, має працювати.
kirbyfan64sos

3

Pyth, лише бонус: 20 байт

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

параметр №2 - 0 для світлодіодів, 1 - для кнопок. Щоб отримати контактний номер # для LED4,g4 0

Я б опублікував це як коментар до вступу Мальтісена, але я тільки почав, тому не вистачає потрібної репутації. Я щойно почав використовувати PYTH сьогодні, і визнаю, що я безсоромно адаптував його метод ефективного кодування списку.

Якщо це було невідповідно, мої найглибші вибачення, і я зніму свій запис.


1
Гей, Брайан Тук! Я радий, що ти почав використовувати мою мову. Повторне використання ідеї Мальтісена було, ймовірно, добре, оскільки базове кодування - це не зовсім нова ідея. Однак надавати кредит, який ви зробили, важливо. До речі, Pyth не слід писати всіма великими літерами - це не абревіатура, це лише назва.
isaacg

2

MIPS, 16 байт

Біт зміщення та бітмаска. Вхід $a0, вихід у $v0.

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

Для бонусу використовуйте негайно 0xdc87420


Хіба ми не повинні вважати розмір джерела при гольфі? :)
nitro2k01

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є для світлодіодів, 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 для світлодіодів, нічого іншого для кнопок.


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 (світлодіоди):

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

Другий параметр - 0 для світлодіодів, а 1 - для кнопок.


0

Brainf ** k, 107 байт

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

Це моя перша ручна програма з BF, я не сумніваюся, що потрібно зробити кілька оптимізацій. Але це все-таки приголомшливо. :)

Я не впевнений, чи []вважається це умовно, хоча ...: /


У нас є виклик повного BF оптимізаторів в вашому розпорядженні , якщо ви хочете використовувати один;)
бета -

@BetaDecay Вони виглядають чудово, але жоден з них насправді не робить мій код коротшим ...: /
kirbyfan64sos

Гм, це ганьба: P
Beta Decay

0

МОЛОДІСТЬ - 27-27-72

Використовуйте світлодіоди 1..6 як арг

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

Використовуйте світлодіодний або кнопковий b 1; l 2; б 6; l 5 тощо як арґі

:\>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позначає штифт або кнопку зі значеннями 1та2 відповідно.

Спробуйте в Інтернеті


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 байт)

Світлодіоди (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 для світлодіодів, а 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

Рубін, 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 - за бонус

Схожий на версію С по химерному.

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

Бонус:

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

Використовуйте 0 для світлодіодів та 6 для кнопок. І порядок параметрів не має значення


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.