Обчисліть n% 12


27

Обчисліть nмодуль 12для непідписаного 32-бітного цілого числа.

Правила:

  • Має працювати для всіх nвід 0 до 23. Інші номери необов’язково.
  • Необхідно використовувати тільки будь-який з операторів +-*, ~&^|або <<, >>як це зазвичай визначається на 32 - бітних uints.
  • Може використовувати довільну кількість постійних утінок.
  • Забороняється використовувати будь-яку форму покажчиків, включаючи масиви чи будь-які ifоператори, включаючи речі, що компілюються, якщо оператори, такі як потрійні оператори чи оператори "більше".

Оцінка:

  • Оператори + -та бітові оператори ~ & ^ | << >>(НЕ, І, XOR, АБО, зсуви бітів) дають оцінку 1, *дає бал 2.
  • Виграє найнижчий загальний бал.

6
Ви можете визначити операторів для користувачів інших мов, крім C / Java. Я розумію +-*, додають, віднімають, множать; ~&^|розрядні НЕ, І, XOR, АБО; і << >>є розрядними.
Рівень річки Св.

@steveverrill - спасибі Це справді наміри.
nbubis

Чи можу я використовувати for i in x:y:z, .dostuff?
Οurous

Чи можна встановити змінну, рівну значенню, яке слід використовувати у виразі?
xnor

4
Більшість компіляторів оптимізуються n % 12до множення та зміни, як у захваті від хакера, тож це тривіально, просто виведіть збірку і подивіться
phuclv

Відповіді:


29

4

(Мова не має значення)

n-((48&(11-n))>>2)

Ву! Перейшов до 4.

11-n забезпечить встановлення всіх бітів високого порядку, якщо і лише тоді, якщо n> = 12.

48&(11-n) == якщо n> 11, то 48 інших 0

(48&(11-n))>>2 == якщо n> 11, то 12 ще 0

n-((48&(11-n))>>2) це відповідь


1
Aww shucks, ти побив мене до цього підходу! Мені були лише хвилини від допису n - (((11 - n) & 0xC0000000) >> 28). Молодці, я не думаю, що це можна зробити менше ніж за чотири.
Runer112

1
@ Runner112 Так, я сподівався, що ніхто не поб'є мене, коли я його розмістив. Молодці, як знайти це для себе, хоча
isaacg

1
Awesome :) 4 - це справді досягнення.
nbubis

11

4

Рішення з таблицею пошуку (вона шукає i ^ (i % 12)):

i ^ (0x1d4c000 >> (i & 0xfc) & 30)

4

Ось ще одне рішення з 4-х операцій:

i - ((0xffff >> (i - 12)) & 12)

Він передбачає, що операнд підрахунку бітзмінів неявно приймається mod 32, тобто x >> -1такий же, як x >> 31.

5

Ще один підхід із використанням таблиці пошуку:

i - (16773120 >> i & 1) * 12

7

баш - 1

echo `seq 0 11` `seq 0 11` | awk '{print $(number+1)}'

напр

$ echo `seq 0 11` `seq 0 11` | awk '{print $(0+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(11+1)}'
11

$ echo `seq 0 11` `seq 0 11` | awk '{print $(12+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(23+1)}'
11

1
Це невірно, оскільки він використовує покажчики.
курйозданні

@curiousdannii На які вказівки ви посилаєтесь? Ці stdinта stdoutпотоки? Звичайно, всередині вони є вказівниками, але тоді ми можемо також дискваліфікувати Java, оскільки вона використовує Integerклас внутрішньо для багатьох речей.
Коул Джонсон

Чи не $ () ефективно еквівалентний покажчику?
цікаводанні

@curiousdannii - документація awk говорить, що вони вбудовані змінні.

5

С, мало-ендіанський - 2

Це, мабуть, обман, але я думаю, що він відповідає правилам ...

union {
    int i;
    struct {
        int a:4;
        int b:2;
        int c:10;
    } s;
    struct {
        int a:2;
        int b:14;
    } t;
} u;

u.i = 11-n;
u.s.a = 0;
u.s.c = 0;
result = n-u.t.b;

Як це працює?
nbubis

1
Сортування шахрайства, оскільки ви використовуєте = 0 замість цього & 0x0, що має вважатися додатковими 2 операціями. Але +1 за творчість :)
nbubis

4

PHP - оцінка 0

Цікаво, як це можливо, що ніхто не прийшов з цим до мене !!!

$n = 18;
$s = str_repeat("a", $n);
$s2 = preg_replace('/aaaaaaaaaaaa/', '', $s);
echo strlen($s2);

2
Приємно. Я думаю, що може виникнути проблема, оскільки масиви заборонені. Дійсно приємно хоч.
AJMansfield

@AJMansfield Можна стверджувати, що це не масиви, а рядки (так, рядки на низькому рівні - це байтові масиви). :)
seequ

1
@seequ Можна також стверджувати, що цей недійсний через його використання оперативної пам’яті (так, на низькому рівні, ram технічно є індексованим масивом) ¯_ (ツ) _ / ¯
Stan Strum

2

C, оцінка 5

Працює до 23, не гарантовано вище.

( ((n+4)>>2)&4 ) + n & 15

((n+4)>>2)&4повертає 4 при n> = 12. Додайте його до n, і ви отримаєте правильну відповідь щонайменше значущими 4 бітами, а потім усічіть інші біти.


Молодці !! Тепер давайте подивимось, чи хтось може дістатися до 4 ..
nbubis

2

незалежно від мови: 5

не вигравати, але беручи участь, тому що це весело і, можливо, тому, що це легше зрозуміти, ніж інших:

n - ((n+20)>>5)*12

це рівнозначно

n - (n>11)*12

це рівнозначно, тому що, коли ви додаєте 20 до 12, ви отримуєте 32, таким чином 5-й біт стає 1. Це лише тоді, коли n> 1, оскільки 32 є найменшим числом, де 5-й біт стає 1.

також зауважте, що це легко розширюється для більш високого діапазону, як це можна зробити

n - ((n+20)>>5)*12 - ((n+41)>>5)*12

щоб досягти дальності до 35


1

Python 2.x - 4

j=input();m=lambda a,b:a*b;a=(m(j,357913942)>>32);print j-m(12,a)

Це =оператор?

У такому випадку оцінка 6.

j-12*(j*357913942>>32)

Рішення BTW @steveverrill можна безпосередньо використовувати і в Python.

Працює для діапазону 0 .. 23

Отже, що відбувається? Помножте на 357913942 і діліть на 2 ^ 32 (або зсув праворуч 32)


Мені подобається, як ви використовували функцію для множення лише один раз. але imho ви просто перейменували множення на функцію m (,), що для мене означає, що ви використовували її двічі.
Pinna_be

залежить від того, як правила трактуються, але у вас є дійсний пункт
Віллем,

1

С - 6

(n - (((n * 0xAAAB) >> 19)) * 12 )

Це має бути або частиною питання, або просто іншою відповіддю. Я пропоную останнє.
Jwosty

@Jwosty - змінено.
nbubis

0

Кобра - 2 (або 3)

def modulo12(n as uint32) as uint32
        for i in 11:n to int64:12,n-=12
        return n

Це може трохи зігнути правила, але я попросив і дозволено це використовувати.

Він також працює для будь-якої кількості.


0

Кона - 5

Це може бути недійсним, тому що я не впевнений, чи дозволений оператор підлоги, але у мене є два *мінуси:

mod:{x-(_0.08333*x)*12}

Яке має працювати для будь-якого цілого числа.


Я не впевнений у роботі підлоги, але я точно впевнений, що перше множення працює на щось інше, ніж 32-бітні цілі числа.
Runer112

@ Runer112: ОП говорить, що вхід повинен бути 32-бітовим, а оператори такі, як визначено, як правило, вони мають 32-бітні унітази; він нічого не говорить про нецілі значення в коді.
Кайл Канос

Якщо я щось не розумію, 0,08333 * x не здається множенням, як визначено для 32-бітних уніт, тому що 0,08333 не є 32-бітною модкою.
Runer112

1
"Може використовувати довільну кількість постійних уній." - тобто не може використовувати довільні поплавці.
nbubis

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