Бінарний готель Гільберта


18

У цьому виклику вам буде запропоновано реалізувати будь-яку функцію (або повну програму), яка відповідає двом властивостям. Ці властивості:

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

  • Ваша функція повинна зберігати загальну кількість "на біт" від її введення до виводу. Це означає, що якщо порахувати 1 біт кожного коефіцієнта многочлена, їх сума повинна бути такою ж, як кількість 1 біт у двійковому поданні виводу. Наприклад 9, 1001у двійковій формі, тому вона має 2 1біти.


IO

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

Ключовою відмінністю між поліномами та кінцевими списками є те, що додавання нуля до кінця списку змінить список:

Списки

Хоча додавання нуля до кінця многочлена не змінює його значення:

Поліноми

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

Представляючи многочлени як списки, ви можете представляти їх або з першим, або останнім записом, що представляють собою постійний доданок. Наприклад, ви можете мати одну з наступних можливостей:

Вперед або назад

У першому випадку додавання нулів до кінця списку не повинно змінювати результат; у другому випадку додавання нулів на передню частину списку не повинно змінювати результат.

Звичайно, якщо ваша мова підтримує поліноми, ви можете приймати їх як вхідні дані.

Вихід повинен бути невід'ємним цілим виведенням за допомогою будь-яких стандартних методів.


Це тому відповіді будуть набрані в байтах, менша кількість байтів буде кращою.


Це []чи [0]допустимий вхід?
JungHwan Min

1
@JungHwanMin Так, і те й інше, вони є нульовим многочленом.
Пост Рок Гарф Мисливець

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

1
@ l4m2 Вибачте, але я не розумію жодного з ваших коментарів. Що стосується вашого питання, що веде нулі на чому? Поліном, коефіцієнти? Я не впевнений, що ви маєте на увазі і під "нулями, не написаними".
Опублікувати Rock Garf Hunter

1
Чи справді потрібні зображення (тобто їх неможливо представити, використовуючи насичений текст) ??? Оскільки люди без можливості бачити зображення не можуть бачити ваш виклик у повному обсязі.
Міндвін

Відповіді:


6

Желе , 8 байт

BFṢḄæ«ÆẸ

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

Зліва обернено, 5 байт

Bċ0ÆE

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

Як це працює

BFṢḄæ«ÆẸ  Main link. Argument: A (array)

B         Binary; convert each integer in A to base 2.
 F        Flatten; concatenate the resulting binary arrays.
  Ṣ       Sort the resulting bit array.
   Ḅ      Convert from base 2 to integer, yielding an integer x with as much set
          bits as there are set bits in A.
      ÆẸ  Unexponents; convert A = [a1, a2, ...] to y = (p1**a1 + p2**a2 + ...),
          where pn is the n-th prime number.
          By the fundamental theorem of arithmetic, the resulting integer is unique
          for each array A without trailing zeroes.
    æ«    Bitshift left; compute x * 2**y.

6

Мова Вольфрама (Mathematica) , 36 20 байт

x#/.x->2^(#/.x->2)!&

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

Беруть поліном f (x) як вхідний. Оцінює y * f (y), де y = 2 ^ (f (2)!). На жаль, це означає, що виходи отримують досить великі.

Оцінюючи y * f (y), збережеться кількість 1-бітів кожного разу, коли y потужність на 2 більша за будь-який коефіцієнт, що справедливо для значення, обраного вище. Вибираємо y = 2 ^ (f (2)!), Щоб зробити результат ін'єктивним:

  • Два різні входи з однаковим значенням y даватимуть різні виходи, тому що ми по суті читаємо два різних числа в базі y.
  • Якщо ми зафіксуємо k = f (2) і, отже, y, то найменше значення y * f (y) досягається тоді, коли вхід є постійним многочленом, рівним k, і найбільше значення досягається, коли вхід є поліномом, що дає підставу -2 розширення k. У першому випадку y * f (y) = 2 ^ (k!) * K, а в другому випадку y * f (y) <2 ^ (k! * Ceil (lg k)), що менше ніж 2 ^ ((k + 1)!) * (k + 1).
  • У результаті для двох многочленів f і g з f (2) <g (2) ціле число, яке ми отримаємо від f, буде меншим за ціле число, яке отримаємо від g.

5

Мова Вольфрама (Mathematica) , 61 байт

Tr[2^((2#2-1)2^#)&@@@Position[Reverse/@#~IntegerDigits~2,1]]&

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

Дві додатні цілі числа можна зіставити в одне додатне ціле число. Нехай a, bбудуть два натуральних числа. Тоді a, b -> (2a - 1) 2^(b-1)відбувається біекція від NxN до N.

Ця функція знаходить положення всіх 1бітів на вході (з місця 1s) і застосовує ін'єктивний варіант лише вищевказаної карти до кожної позиції. Потім кожне отримане число піднімається до потужності двох, і всі числа додаються разом (що нормально, оскільки ми застосували ін'єктивну карту NxN -> N).

Наприклад:

{1, 2, 3}
{{1}, {1, 0}, {1, 1}}             (* Convert to binary *)
{{1}, {0, 1}, {1, 1}}             (* Reverse each *)
{{1, 1}, {2, 2}, {3, 1}, {3, 2}}  (* Position of 1s *)
{2, 12, 8, 24}                    (* Inject to N *)
{4, 4096, 256, 16777216}          (* Raise to the power of 2 *)
16781572                          (* Add *)

Зворотна функція (124 байти)

##+#&~Fold~#&@*Reverse/@Normal@SparseArray[{Log2[j=#~BitAnd~-#],(#/j+1)/2}->1&@@@(Reverse[#~IntegerDigits~2]~Position~1-1)]&

Ось зворотна функція для перевірки ін'єктивності.

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


5

Пітон 2 , 118 117 114 103 100 байт

100 байт Джонатана Фреха:

a=input()
while a[0]<1:a.pop(0)
y="".join("2"+bin(v)[2:]for v in a)
print~-2**y.count("1")<<int(y,3)

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

103 байти з можливістю гольфу 1

a=input()
while a[0]<1:a.pop(0)
x="".join(map(bin,a))
print~-(1<<x.count("1"))<<int(x.replace(*"b2"),3)

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

-15 байт завдяки Джонатану Фреху

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

Тризначне число створюється перетворенням чисел у двійкові рядки ( 0bNNN), а потім заміною bна 2.

1 Я міг би зберегти 14 байт, перетворивши його на базове число 12, але TIO не вистачало пам’яті, тому я вирішив використовувати це.


@JonathanFrech Спасибі велике :)
fergusq

1

05AB1E , 14 байт

gÅpImPoIbS{2β*

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

Дає ті ж результати, що і рішення Jelnis Jelly, але техніка трохи відрізняється.

Як?

Спробуємо введення [1, 2, 3]:

gÅpImPoIbS{2β* | Full program.
               | STACK: [[1, 2, 3]]
               |
g              | Push the length.
               | STACK: [3]
 Åp            | Generate the first N primes.
               | STACK: [[2, 3, 5]]
   Im          | Push the input, and apply pairwise exponentiation.
               | STACK: [2, 9, 125]
     P         | Push the product.
               | STACK: 2250
      o        | Push 2 ** N.
               | STACK: 2 ** 2250 (way too large)
       Ib      | Push the input and convert to binary.
               | STACK: [2 ** 2250, ['1', '10', '11']].
         S{    | Sort all the characters.
               | STACK: [2 ** 2250, ['0', '1', '1', '1', '1']]
           2β  | Convert from binary.
               | STACK: [2 ** 2250, 15]
             * | Multiplication.
               | STACK: [2 ** 2250 * 15]
               | Implicitly print the top of the stack (2 ** 2250 * 15).


0

JavaScript 6, 96 83 байт

x=>(t=x.map(k=>(x[0]+=k)&&2+k.toString(2)).join``).replace(/0|2/g,'')+'0'.repeat(t)

виводить двійкове вираження

([1,2]) => 3*2^21210(Decimal)
([0,1,2]) => 3*2^21210
([1,2,0]) => 3*2^2121020
([1,2,3,4]) => 31*2^212102112100(Threotically)

нуль призведе до порожнього рядка, що представляє нуль
l4m2

replace(/0|2/g,0)Здається, теж працює, але важче розшифрувати
l4m2

Не впевнений x=>(t=x.map(k=>(x[0]+=k)&&2+k.toString(2)).join``).replace(/2/g,'0'.repeat(t)). Відчуваю себе добре, але не можу довести
l4m2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.