Знайдіть максимум 3 числа без розгалуження


17

Цього разу навколо вашої мети - знайти максимум 3 цілих числа (від - (2 ^ 31) до 2 ^ 31 - 1 у додатку двійкових 2) без використання розгалуження чи циклів.

Ви тільки дозволено використовувати

  • Нерівність / Рівність ( ==, >, >=, <, <=, !=) Ці кількості , як 2 - маркерів.

  • Арифметика ( +, -, *, /)

  • Логічні оператори ( !не &&, || або або)

  • Побітові оператори ( ~ні, &і, |або, ^що виключає, <<, >>, >>>арифметичні і логічні ліві і праві зрушення)

  • Константи. 0 жетонів

  • Змінне призначення. 0 жетонів

Введіть 3 змінні як a, bі c. Виведіть максимальну кількість.

Застосовуються стандартні правила атомного коду-гольфу. Якщо у вас є якісь питання, залиште їх у коментарях. Один жетон - це будь-який із перерахованих вище зі спеціальними правилами.


Що з визначенням додаткової функції? Якщо це дозволено, скільки жетонів він вважається?
невдалий

@voidpigeon У вас може бути лише одна функція, яка бере 3 входи та виходи.
qwr

1
На перший погляд я подумав: нас це було раніше " , але я думаю, що компаратори вартістю 2 змінили гру досить сильно.
примо

@primo Я спеціально попросив 3 входи, оскільки це насправді дозволяє зробити деякі цікаві вдосконалення
qwr

2
Чи можемо ми використовувати вбудовані функції?
Зареєстрований користувач

Відповіді:


7

Javascript 10 лексем

Редагувати Використовуючи <і * замість біт-фідінгу - як зазначено в коментарях, бітові операції можуть не вдатися для введення в межах межі діапазону (понад 30 біт)

function Max(x,y,z)
{
  var d=y-x;
  x=y-d*(d<0);
  d=x-z;
  return x-d*(d<0);
}

C 8 жетонів

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

У C (і C ++, C # і Java я думаю) ми можемо легко впоратися з проблемами переповнення, використовуючи більші тимчасові значення:

int Max(int x, int y, int z)
{
    long long X = x;
    long long Y = y;
    long long Z = z;
    long long D = Y-X;
    X=Y-((D>>63)&D);
    D=X-Z;
    return (int) (X-((D>>63)&D));
}

1
Я вибагливий, але за допомогою C ints ваш код не працює для x = 2147483647, y = -2, z = 0. Ваш вибір, якщо ви хочете змінити його
qwr

10

Javascript

6 жетонів

function maxOf3(a, b, c) {
    (b>a) && (a=b);
    (c>a) && (a=c);
    return a;
}

6
+1 Я бачу оцінку ярликів як тип розгалуження, але це не заборонено в правилах
edc65

11
Я б вважав це розгалуженням, ха-ха
половина

2
@ edc65 Це так. Дозвіл &&і, ||швидше за все, недогляд, який слід вказати, а не використовувати.
прим

@primo Це було цікавим питанням. Я вважаю, що деякі архітектури CISC мають вказівки, які включають умовні висловлювання, тому я не впевнений, як би їх вважали.
qwr

2
Я думаю, це має бути 4 лексеми, тобто 2 &&, <і >. =Використовується як завдання і розраховує як 0
Клайд Лобо

6

C: 10 жетонів

int max(int a, int b, int c)
{
    a += (b > a) * (b - a);
    a += (c > a) * (c - a);
    return a;
}

Натхненний відповіддю @ openorclose, але перетворений на C і зроблений без гілок, використовуючи множення, а не булеві оператори короткого замикання.


3

Javascript

14 жетонів

function max (a, b, c)
{
    var ab = (a >= b) * a + (a < b) * b;
    return (ab >= c) * ab + (ab < c) * c;
}

1
Вам не дозволяється створювати нові функції
qwr

:( 14 жетонів тоді
Fabricio

2

Багато мов (Python) (10 лексем)

def max3(x,y,z):
    m = x ^ ((x ^ y) & -(x < y))
    return m ^ ((m ^ z) & -(m < z))

print max3(-1,-2,-3) # -1
print max3(-1,2,10) # 10

https://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax

О, хтось уже розмістив це :)


Вам не дозволяється створювати нові функції
qwr

Ах гаразд! Не читав коментарів :)
Mardoxx

@qwr Я не розумію, ви сказали: You are only allowed to have one function, the one that takes the 3 inputs and outputs.саме ця відповідь має. 2 відбитки - це лише тестові справи
Cruncher

1
@Cruncher Я відредагував відповідь, яку я зробив max2(max2(x,y),z)спочатку :)
Mardoxx

@Mardoxx ах. Ну +1
Cruncher

1

C ++ 11: 15 лексеми

Використання лише арифметичних та бітових операторів (оскільки оператори рівності та логічної логіки роблять це занадто просто) ...

#include <iostream>

auto max(int32_t a, int32_t b, int32_t c)->int32_t {
  return c - ((c - (a - ((a - b) & (a - b) >> 31))) & (c - (a - ((a - b) & (a - b) >> 31))) >> 31);
}

auto main()->int {
  // test harness
  std::cout << max(9, 38, 7) << std::endl;
  return EXIT_SUCCESS;
}

Невдача для великих номерів (> 2 ^ 30), дивіться коментар codegolf.stackexchange.com/questions/32476/#comment68870_32477
edc65

Мені добре виглядає: ideone.com/pEsvG3
Бунт

Ви уважно прочитали коментар? Я думаю, що 2 мільярди більше, ніж 0 [ ideone.com/vlcnq9 ]
edc65

А, бачу; так, у вас є проблеми з цими номерами у вашому іншому коментарі, якщо йдеться про 0. Але не за 2 ^ 30, як ви сказали. ideone.com/LicmXa
Бунт

Це не 0. Проблема - велика кількість та переповнення, спробуйте макс. (2000000000, -200000000, 1111111111).
edc65

0

J (не змагається)

Мені було просто цікаво, як виглядатиме рішення в J. Для цього використовується значення a ,і #, тому воно не буде конкурувати.

((a<b),(b<c),(c<a))#b,c,a

Це змагалося б, але занадто довго, з 9 жетонами:

(b*a<:b)+(c*b<c)+(a*c<a)

0

у нас є такі припущення:

  • max (a; b) = (a + b + | ab |) / 2

  • max (a; b; c) = max (max (a; b); c)

  • abs (a) = (a + (a >> 31)) ^ (a >> 31)

ми можемо використовувати псевдо-код:

функція max (a, b, c)

{

out1 = ((a + b) + (((ab) + ((ab) >> 31)) ^ ((ab) >> 31))) div 2

out2 = ((out1 + c) + (((out1-c) + ((out1-c) >> 31)) ^ ((out1-c) >> 31))) div 2

повернутись2

}


Будь ласка, напишіть фактичний код та вкажіть кількість жетонів у своїй відповіді.
ProgramFOX

0

C # (друга спроба)

Я отримав це ... Без інтегрованих функцій ...

Але чи дозволяється використовувати інші інтегровані типи даних або просто звичайний int? Якщо це дозволить, я б запропонував:

int foo2(int a, int b, int c)
{
   var x = new SortedList<int,int>();

   x[a] = 1;
   x[b] = 1;
   x[c] = 1;

   return x.Keys[2];
}

0

javascript 8 лексем

хоча подібний до відповіді @ openorclose, я фактично використовую логічні оператори для самого призначення.

function max( a, b, c ) {
    x=( a > b && a) || b;
    return ( x > c && x ) || c;
}

скрипка


0

R (10 жетонів)

function max(a, b, c) {
  max <- a
  max <- max + (b - max) * (b > max)
  max <- max + (c - max) * (c > max)
  return(max)
}

0

Brainfuck (не змагається)

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

0

TIS-100, 8 операцій

MOV ACC UP #A
SUB UP     #B
SUB 999
ADD 999
ADD UP     #B
SUB UP     #C
SUB 999
ADD 999
ADD UP     #C
MOV ACC DOWN

Постачальник (UP) виконує лише MOV, так що вони не відображаються в коді


-1

VBA (6 жетонів)

 Function max3(a As Integer, b As Integer, c As Integer)
 i = IIf(a >= b And a >= c, a, IIf(b >= c, b, c))
 max3 = i
 End Function  

не впевнений, чи це не розгалуження.


Це розгалуження, тільки вбудоване. Зокрема, всюдисущий потрійний оператор (який це по суті є) не є однією з дозволених операцій.
tomsmeding

Дякую @tomsmeding, чи можу я запитати, що є всюдисущим потрійним оператором (це IIF () у моєму коді?)
Алекс,

так, вибачте, я мав на увазі, що він присутній майже всіма мовами, а термінальний оператор - ваш IIf, Inline-If. У більшості мов, наприклад, це a>=b ? a : b. Це справді розгалуження.
Томмедінг

-1

JavaScript: 4 лексеми (** на основі широкої інтерпретації "присвоєння"!)

Очевидно, моя оцінка 4 надзвичайно щедра / поблажлива!

Для досягнення цієї оцінки я припустив, що "присвоєння" (вартістю 0 лексем у запитанні) включає такі речі, як додаткове призначення, віднімання, мультиплікативне завдання та призначення XOR-ing ( ^=)

function f(a, b, c) {
  d = a;
  d -= b;
  d = d >= 0;

  a *= d;  //a = a if (a>=b), else 0
  d ^= true; //invert d
  b *= d;  //b = b if (b<a), else 0

  a += b;  //a is now max(a,b)

  d = a;
  d -= c;
  d = d >= 0;

  a *= d;  //a = a if (a>=c), else 0
  d ^= true; //invert d
  c *= d;  //c = c if (c<a), else 0
  a += c;  //a is now max(max(a,b),c)

  return a;
}

Якщо в цих завданнях насправді нараховується бал - 14 :)


Тому що d -= bнасправді те саме d = d - b, що я б сказав, що ви використовуєте арифметику і що ви повинні вважати це лексемою.
ProgramFOX

Так, я усвідомлюю це - я (жартома) намагався скористатися значенням "доручення". Я думаю, що я зробив це досить очевидно!
jcdude
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.