Mod 2 Коефіцієнти багаточлену


14

Кінтопія розмістила тут виклик для обчислення мультиноміальних коефіцієнтів (частина тексту тут скопійована звідти). Існує цікавий алгоритм для обчислення багаточленних коефіцієнтів mod 2.

Дано список чисел, k 1 , k 2 , ..., k m , виведіть залишок багаточленного коефіцієнта:

введіть тут опис зображення

наведеного по модулю 2. Наступний алгоритм робить це ефективно: для кожного до я , обчислити двоичное розкладання до я , тобто, знайти в Ij таким чином, що кожна IJ або 1 , або 0 і

введіть тут опис зображення

Якщо є j таке, що a т = а Sj = 1 при г ≠ с, то асоційованиммодулю 2 поліноміальний коефіцієнт дорівнює 0,іншому випадкумодулю 2 поліноміальний коефіцієнт дорівнює 1.

Завдання

Напишіть програму або функцію, яка приймає m чисел, k 1 , k 2 , ..., k m і виводить або повертає відповідний мультиноміальний коефіцієнт. Ваша програма може додатково приймати m як додатковий аргумент.

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

  • Вихід може бути будь-яким правильним значенням, якщо мультиноміальний коефіцієнт непарний, а будь-яке значення фальси, якщо мультиноміальний коефіцієнт парний.

  • Вбудовані модулі, призначені для обчислення мультиноміального коефіцієнта, не допускаються.

  • Застосовуються стандартні лазівки.

Оцінка балів

Це код гольфу: найкоротше рішення в байтах.

Приклади:

Щоб знайти мультиноміальний коефіцієнт 7, 16 та 1000, ми двійково розширимо кожен з них:

введіть тут опис зображення

Оскільки жоден стовпець не має більше одного 1, мультиноміальний коефіцієнт є непарним, а значить, ми повинні вивести щось правдоподібне.

Щоб знайти мультиноміальний коефіцієнт 7, 16 та 76, двійкові розширимо кожен з них:

введіть тут опис зображення

Оскільки і 76, і 7 мають 4 у бінарному розширенні, мультиноміальний коефіцієнт є рівним, тому ми виводимо значення фальси.

Тестові приклади:

Input: [2, 0, 1]
Output: Truthy

Input: [5,4,3,2,1]
Output: Falsey

Input: [1,2,4,8,16]
Output: Truthy

Input: [7,16,76]
Output: Falsey

Input: [7,16,1000]
Output: Truthy

Input: [545, 1044, 266, 2240]
Output: Truthy

Input: [1282, 2068, 137, 584]
Output: Falsey

Input: [274728976, 546308480, 67272744, 135004166, 16790592, 33636865]
Output: Truthy

Input: [134285315, 33849872, 553780288, 544928, 4202764, 345243648]
Output: Falsey

1
Ласкаво просимо до PPCG! Гарний перший пост!
Rɪᴋᴇʀ

Я думаю, що кілька мов з ==рівністю могли б врятувати байт, якби дозволено перевертати truthy та falsey.
Ørjan Johansen

@ ØrjanJohansen Це добре звучить.
Гуд

Відповіді:



7

Python 3 2, 55 43 42 байт

lambda l:sum(l)==eval(`l`.replace(*',|'))

-12 байт від містера Xcoder

-1 байт від Rod

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

Пояснення: Перевіряє, чи сума чисел дорівнює порозрядних чи чисел.


43 байти:lambda l:sum(l)==eval("|".join(map(str,l)))
Містер Xcoder

Ви можете досягти 42 байтів, щоб перейти на python2
Rod




2

JavaScript (ES6), 37 35 34 байт

Збережено 2 байти завдяки @ Mr.Xcoder
Збережено 1 байт завдяки @ETHproductions

Порівнюючи суму з побітною АБО (як, наприклад, pizzapants184 та Leaky Nun ), це на 1 3 4 байти коротше мого початкового підходу:

a=>(q=c=>eval(a.join(c)))`|`==q`+`

Тестові справи


Alt версія, 38 байт

a=>!a.some((x,i)=>a.some(y=>i--&&x&y))

Тестові справи


Технічно, pizzapants184 відповів на 14 секунд раніше, ніж я ...
Leaky Nun

-1 байт:a=>(q=c=>eval(a.join(c)))`|`==q`+`;
ETHproductions

@ETHproductions Приємно! Це добре працює в Node.js. Але чи вдалося вам це працювати в браузері?
Арнольд

Для мене добре працює у Firefox 57. Ви отримуєте помилку чи це просто не працює належним чином?
ETHproductions

@ETHproductions Насправді, так, це працює. Це просто відбувається збій на repl.it .
Арнольд

2

Хаскелл , 38 байт

(==).sum<*>foldl1 xorце анонімна функція, що повертає a Bool. Використовувати як ((==).sum<*>foldl1 xor) [2,0,1].

import Data.Bits
(==).sum<*>foldl1 xor

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

  • Приблизно той самий трюк, який користуються pizzapants184 та Leaky Nun, якими користуються всі, за винятком того, що з іменами операторів Haskell він заощаджує один байт, який слід використовувати (побіжно) xorзамість (.|.)(побіжно або).

  • (==).sum<*>foldl1 xorце безтокова версія \l->sum l==foldl1 xor l.


2

Java 8, 53 байти

a->{int i=0,j=0;for(int x:a){i+=x;j|=x;}return i==j;}

Порт відповіді желе @LeakyNun .

Пояснення:

Спробуйте тут.

a->{             // Method with integer-array parameter and boolean return-type
  int i=0,j=0;   //  Two integers, both starting at 0
  for(int x:a){  //  Loop over the array
    i+=x;        //   Add them to the first integer
    j|=x;}       //   And bitwise-OR it with the second integer
  return i==j;}  //  Return if both integers are the same after the loop




1

Червоний , 78 байт

f: func[x][b: :to-binary t: 0 s: b 0 foreach n x[t: t + n s: s or b n]s = b t]

Як це працює:

Безголівки:

Red []
f: func [x][         -  a function taking a block as an argument
    b: :to-binary    -  an alias for the to-binary function
    t: 0             -  set the sum of the numbers to 0
    s: b 0           -  set the "or" total to binary 0
    foreach n x[     -  for each number in the block
        t: t + n     -  add it to the sum
        s: s or b n  -  bitwise or of its binary representation with the total
    ]
    s = b t          - are the sum (binary) and the "or" total equal?
]

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



0

Пакетна, 73 байти

@set/as=o=0
@for %%i in (%*)do @set/as+=%%i,o^|=%%i
@if %s%==%o% echo 1

Вихідні дані 1для правди, нічого для фальшивих. Ще один очевидний порт алгоритму pizzapants184 / Leaky Nun.


0

J , 10 байт

+/=+./&.#:

Ще один порт піцарів184-х та рішень Leaky Nun.

Як це працює?

+/.&.#: - перетворити числа у двійкові, застосувати порозрядно або до повноважень двох і перетворити назад з двійкових у десяткові

+/ - зменшити введення додаванням

= - чи вищезгадані рівні?

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

Пряма альтернатива

J , 12 байт

2>[:>./+/@#:

Як це працює?

+/@#: - перетворіть кожне число у двійкове і знайдіть суму кожної потужності 2

>./ - знайти максимум

2>- це менше 2? -> truthy

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


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