Вивчення xorspace


14

Xorspace з набору цілих чисел є безліч всіх цілих чисел , які можуть бути отримані шляхом об'єднання вихідних цілих чисел зі звичайним оператором побітового виключає АБО ( ^). Наприклад, xorspace з (8, 4)IS (0, 4, 8, 12): 0 4 ^ 4, 12 4 ^ 8, і ніякі інші числа не може бути досягнуто. Зауважте, що початкові числа завжди включаються в це визначення (наприклад, 4 - 4 ^ 4 ^ 4).

Ваша мета полягає в тому, щоб написати найкоротшу програму, яка приймає список невід’ємних цілих чисел у якості вхідних даних і виводить кількість елементів у їх просторі xors.

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

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

Input: 0
Output: 1

Input: 6
Output: 2

Input: 8 4
Ouput: 4

Input: 0 256
Output: 2

Input: 256 259 3
Output: 4

Input: 60 62 94 101 115
Output: 32

Input: 60 62 94 101 115 40 91
Output: 32

Input: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
Output: 64

Input: 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384
Output: 32768

Відповіді:


2

Pyth, 8 байт

lu{+xM*Q

Тестовий набір

Пояснення:

Щоб генерувати xorspace, ми знаходимо точну точку взяття xor кожної пари чисел, додавання кожного числа та дедублікації. Потім беремо довжину результату. Це працює за 20 секунд (лише в режимі офлайн) на останньому тестовому випадку.

lu{+xM*Q
lu{+xM*QGGQ    Implicit variable introduction
 u        Q    Find the fixed point of the following, starting with the input,
               where the current value is G.
      *QG      Form the Cartesian product of Q (input) and G (current)
    xM         Take the xor of every pair
   +           Add the current values
  {            Deduplicate
l              Output the length of the result.

Запакований Pyth , 7 байт

Hexdump:

0000000: d9d7 dabf 1355 51                        .....UQ

Те саме, що вище, із 7-бітним кодуванням ASCII.

Покладіть вище у файл із xxd -rта запустіть його так:

py packed-pyth.py xorspace.ppyth '[256, 259, 3]'

Я думаю, ти можеш зробити l{mxFdy.
xnor

@xnor, yзастосований до тестового випадку від 1 до 63, є занадто повільним. У мене немає пам'яті 2 ^ 63.
isaacg

10

MATL , 11 байт

t"G!Z~Ghu]n

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

Останній тестовий випадок не працює в онлайн-перекладачі через обмеження пам’яті, а працює в автономному режимі менше ніж за 2 секунди на сучасному комп’ютері.

Пояснення

Для введення розміру nце робиться наступним чином:

  1. Початковий результат для введення.
  2. Повторення nразів:
    1. Застосовувати побіжно XOR до всіх пар записів з поточного результату та введення.
    2. До результату додайте вхідні значення.
    3. Дублікат.
  3. Вихід - кількість елементів кінцевого результату.

Коментований код.

t      % Implicit input: row vector. Duplicate
"      % For each (i.e. do as many times as the input size)
  G!   %   Push input as a column vector
  Z~   %   Bitwise XOR with broadcast, i.e. for all pairs of entries of the
       %   two arguments. The first argument is the accumulated result
       %   from the previous iteration, the second is the input vector
  G    %   Push input again
  h    %   Postpend
  u    %   Unique values. Gives a row vector
]      % End
n      % Number of entries. Implicitly display

Приклад

Проміжними результатами (кроки 2.1 та 2.3) для введення [256 259 3]є:

Перша ітерація: [256 259 3]з [256 259 3]: обчислення всіх пар порозрядних XOR дає матрицю

  0   3 259
  3   0 256
259 256   0

Прикріплення [256 259 3]та дедуплікація

0 3 259 256

Друга ітерація: поточний результат [0 3 259 256]з [256 259 3]. Після дедуплікації це знову дає

0 3 259 256

Третя ітерація: знову

0 3 259 256

Отже, вихід 4(кількість записів результату).


Пояснення, будь ласка? Ви не можете використовувати O (2 ^ n).
Ерік Аутгольфер

Я поняття не маю, як це працює, але це точно не O (2 ^ n). Він фактично вирішує тест-тест (1 2 3… 63) досить швидко, навіть якщо це найгірший спосіб для грубої сили.
Grimmy

2
Як це так швидко? Я намагався зробити те ж саме в Jelly, але перша спроба була вбита через 19 хвилин ... (зараз намагаюся з більшою кількістю оперативної пам’яті.)
Dennis

2
Я вважаю , що це є O (2ⁿ) в гіршому випадку; це просто тест, який його виконує, n лише 15, тому програма все ще працює досить швидко.

2
@ ais523 Проміжні числа, отримані з побітових XOR, ніколи не можуть отримати більше максимального числа на вході, викликайте це M. Тож розмір вектора проміжних результатів ніколи не перевищує M, а складність - O ( M*M). ОП заявила, що точне визначення значення nне має значення, тому, якщо я визначу, nяк Mя можу заявити, що це O ( n*n).
Луїс Мендо

8

Haskell , 64 байти

f приймає список цілих чисел і повертає ціле число.

import Data.Bits
f l|m<-maximum l,m>0=2*f(min<*>xor m<$>l)|0<1=1

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

Це не обробляє порожній список, для цього ви можете, але $0:замість місця після maximum.

Як це працює

  • Якщо максимум mсписку дорівнює нулю, повертається 1.
  • В іншому випадку, xors кожен елемент з максимумом.
    • Якщо результат менший за елемент, елемент замінюється ним.
    • Це обов'язково дорівнює нулю найзначнішого біта, встановленого в будь-якому місці списку.
    • Потім повторюється за отриманим списком, подвоюючи результат рекурсії.
  • Цей процес, по суті, виконує усунення Гаусса (хоча викидає кінцеві рядки, встановлюючи їх на 0) за модулем 2, на матриці, рядки якого є бітовими поданнями списку чисел. Сукупність бітових зображень "xorspace" - це векторний простірний модуль 2, що охоплюється рядками цієї матриці, і кількість елементів яких 2 до потужності рядка матриці.
  • Цей алгоритм є поліномним часом, тому, безумовно, повинен бути кращим, ніж O (2 ^ n).

Це в основному алгоритм, про який я думав (для подолання меж складності), хоча це особливо елегантний спосіб його представити. Приємно бачити це у правильній відповіді на гольф.

4

Математика, 52 байти

2^MatrixRank[PadLeft@IntegerDigits[#,2],Modulus->2]&

Чому ви видалили відповідь Pari / GP? Здавалося, це працює добре. EDIT: незважаючи ні на що, фактично не вдалося виконати деякі тестові випадки.
Grimmy

@Grimy Чому ти прийняв мою відповідь? Це код-гольф, виграє найкоротший код.
алефальфа

Вибачте, я змінив прийняту відповідь на 7 байт, запакований Pyth.
Гриммі

3

05AB1E , 8 байт

vDy^ìÙ}g

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

Усі тестові справи закінчуються протягом 1 хвилини на TIO.


Це не відповідає останньому критерію: «Ваш код повинен мати можливість обробляти всі тестові справи менше ніж за добу (без O (2 ** n) матеріалів). »
Grimmy

@Grimy: Не читав 2^nчастину: /
Emigna

@Grimy: Тепер оновлено, щоб закінчити всі тестові справи менше ніж за 1 хвилину (і з меншою кількістю байтів)
Emigna

Думав, âü^Ùgпоки я не побачив, що ти можеш створити не раз, приємне рішення.
Чарівний восьминога Урна

@carusocomputing: Це економить байт, але я не впевнений у складності.
Емінья

3

Python 2 , 55 байт

r={0}
for n in input():r|={x^n for x in r}
print len(r)

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

Відбиває функції:

f=lambda l,r={0}:l and f(l[1:],r|{x^l[0]for x in r})or len(r)
f=lambda l:len(reduce(lambda r,n:r|{x^n for x in r},l,{0}))

Прекрасний метод усунення рядків Йохансена на один байт коротший.

Python 2 , 54 байти

f=lambda l:1-any(l)or 2*f([min(x,x^max(l))for x in l])

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


2

Желе , 9 8 байт

0œ|⁺^¥/L

Завершує всі тестові справи менше 8 секунд на TIO, з незначними вимогами до пам'яті.

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

Як це працює

0œ|⁺^¥/L  Main link. Argument: A (array)

0œ|       Perform multiset union with 0, prepending 0 if A doesn't contain it.
      /   Reduce A by the link to the left.
     ¥      Combine the previous two links into a dyadic chain.
            Left argument: V (array). Right argument: n (integer)
    ^           Bitwise XOR each element in V with n.
   ⁺            This quick refers to the previous link, making it a shorthand for
                the link 'œ|'. Thus, it performs multiset union on V and the array
                of bitwise XORs.
       L  Compute the length of the result.

1

Пітон, 113 байт

def f(x):
 u,s=[0],{0}
 while u:
	a=u.pop()
	for b in x:
	 c=a^b
	 if c not in s:u+=[c]
	 s.add(c)
 return len(s)

Це працює, але я рахую 113 байт; я щось пропустив?
Grimmy

@totallyhuman це, мабуть, тому, що ви рахуєте таблиці 8 байтів, а не один байт.
Grimmy

Якщо перший відступ - пробіл, наступний - вкладка, а останній - вкладка + пробіл (або 2 вкладки), то це 113 байт
daniero

@Grimy Насправді кожна вкладка - це 4 місця, а не 8.
Ерік Аутгольфер

Повна програма була б коротшою, оскільки це економить кілька відступів. Також цикл for може бути зведений в один рядок, що u+=[c][c in s:]еквівалентно вашій ifзаяві.
Денніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.