Розділіть, переверніть і рекомбінуйте цілі числа


16

Фон

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

Завдання

Ваше введення - це натуральне число n > 0. Відомо, що існують унікальні невід’ємні цілі числа, a, b ≥ 0такі . Ваш вихід - це "перевернута версія"n == 2a * (2*b + 1)n додатного цілого числа .2b * (2*a + 1)

Ви можете припустити, що вхід і вихід вписуються в стандартний цілочисленний тип даних вашої мови.

Правила та оцінка

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

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

Вони задаються у форматі in <-> out, оскільки функція, яку потрібно реалізувати, є власною оберненою формою : якщо ви повернете висновок до нього, ви повинні отримати оригінальний ввід.

1 <-> 1
2 <-> 3
4 <-> 5
6 <-> 6
7 <-> 8
9 <-> 16
10 <-> 12
11 <-> 32
13 <-> 64
14 <-> 24
15 <-> 128
17 <-> 256
18 <-> 48
19 <-> 512
20 <-> 20
28 <-> 40
30 <-> 384
56 <-> 56
88 <-> 224
89 <-> 17592186044416

Таблиця лідерів

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

## Language Name, N bytes

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

## Ruby, <s>104</s> <s>101</s> 96 bytes

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат становить суму двох файлів або ви хочете окремо перерахувати штрафні санкції за перекладач), переконайтесь, що фактичний бал є останнім номером у заголовку:

## Perl, 43 + 2 (-p flag) = 45 bytes

Ви також можете зробити ім'я мови посиланням, яке потім відобразиться у фрагменті таблиці лідерів:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes



@feersum О, я не знав. Який збіг обставин.
Згарб

2
Обов’язковий xkcd.com/153
corsiKa

Відповіді:


11

Желе , 17 16 15 байт

BUi1µ2*³:2*×Ḥ’$

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

Як це працює

BUi1µ2*³:2*×Ḥ’$    Main link. Input: n

B                  Convert n to base 2.
 U                 Reverse the array of binary digits.
  i1               Get the first index (1-based) of 1.
                   This yields a + 1.
    µ              Begin a new, monadic chain. Argument: a + 1
     2*            Compute 2 ** (a+1).
       ³:          Divide n (input) by 2 ** (a+1).
                   : performs integer division, so this yields b.
         2*        Compute 2 ** b.
              $    Combine the two preceding atoms.
            Ḥ      Double; yield 2a + 2.
             ’     Decrement to yield 2a + 1.
           ×       Fork; multiply the results to the left and to the right.

Зачекайте, чи реалізуєте ви операторів в Jelly, щоб задовольнити проблему? У такому випадку LOL
Олександр Торстлінг

Я не. Тільки зробити , щоб желе після цього проблема була опублікована було оновлення документації, і весь оператор , який використовується в цій відповіді, був реалізована в протягом принаймні місяця. Не соромтеся перевіряти
Денніс

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


10

Pyth, 16 15 байт

*hyJ/PQ2^2.>QhJ

1 байт завдяки Деннісу

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

Пояснення:

*hyJ/PQ2^2.>QhJ
                    Implicit: Q = eval(input())
     PQ             Take the prime factorization of Q.
    /  2            Count how many 2s appear. This is a.
   J                Save it to J.
  y                 Double.
 h                  +1.
          .>QhJ     Shift Q right by J + 1, giving b.
        ^2          Compute 2 ** b.
*                   Multiply the above together, and print implicitly.

7

MATL , 22 байти

Yft2=XK~)pq2/2w^Ks2*Q*

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

Пояснення

Yf      % factor
t       % duplicate
2=      % compare to 2 (yields a logical array)
XK      % save a copy of that to variable K
~)      % keep only values != 2 in the factors array
p       % multiply that factors
q2/     % product - 1 / 2
2w^     % 2^x

K       % load variable K (the logical array)
s       % sum (yields the number of 2s)
2*Q     % count * 2 + 1

*       % multiply both values

Дуже хороша! Ви можете використовувати Qдля 1+(це було нещодавно представлено) та qдля 1-. Це також економить простір (який ви могли б заощадити Hбудь-яким чином). Дивіться тут
Луїс Мендо

@LuisMendo Дякую Не знав цієї функції.
Райнер П.

5
Молодці побили Луїса за допомогою MATL!
Стюі Гріффін

6

Python 2, 39 байт

lambda n:2*len(bin(n&-n))-5<<n/2/(n&-n)

n & -nдає найбільшу потужність 2, яка ділиться n. Це працює , тому що в додатковому коді доповнюють арифметика -n == ~n + 1. Якщо nмає K кінцеві нулі, приймаючи його доповнення змусить його мати K завершальних одиниць. Тоді додавання 1 змінить усі проміжні на нулі та змінить біт 2 ^ k 0 до 1. Отже, -nзакінчується 1, а потім k 0 (точно так само n), маючи протилежний біт nу всіх вищих місцях.


Ви можете коротко пояснити, як n&-nпрацює? Я бачу, що робить цей трюк, але не як :(
Ерван

n&-nповертає найвищу потужність 2, що ділиться n.
Ніл

@Erwan, про який я пояснив n & -n.
feersum

Я отримав відповідну програму на «Anarchy golf» n=1;exec"c=n&-n;print n,':',2*len(bin(c))-5<<n/2/c;n+=1;"*100, але це два варіанти за найкращим рішенням.
xnor

@xnor Підказка: 59-байтне рішення (ну, принаймні, моє) працює не для всіх значень n.
feersum

6

MATL , 25 26 байт

:qt2w^w!2*Q*G=2#f2*q2bq^*

Для цього використовується поточний випуск (10.2.1) мови / компілятора.

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

Пояснення

Досить прямолінійна, заснована на грубій силі. Випробовує всі комбінації a і b , вибирає відповідне і виконує необхідні обчислення.

:q          % implicit input "n". Generate row vector [0,1,...,n-1], say "x"
t2w^        % duplicate and compute 2^x element-wise
w!2*Q       % swap, transpose to column vector, compute 2*x+1
*           % compute all combinations of products. Gives 2D array
G=2#f       % find indices where that array equals n
2*q2bq^*    % apply operation to flipped values

1
Га! :-P Бив своєю рідною мовою ... перший раз?
Стюі Гріффін

@StewieGriffin Так! Гарна віха :-)
Луїс Мендо

5

Джулія, 41 байт

n->2^(n>>(a=get(factor(n),2,0)+1))*(2a-1)

Це анонімна функція, яка приймає ціле число і повертає ціле число. Щоб викликати його, призначте його змінній.

Визначимо aяк 1 + показник 2 в основній факторизації n. Оскільки factorповертає a Dict, ми можемо використовувати getзі значенням за замовчуванням 0 у випадку, якщо проста факторизація не містить 2. Право біт зміщуємо nна a, і приймаємо 2 до цієї потужності. Помножимо це на, 2a-1щоб отримати результат.


4

Perl 5, 40 байт

38 байт плюс 2 for -p

$i++,$_/=2until$_%2;$_=2*$i+1<<$_/2-.5

-pчитає STDIN в змінну $_.

$i++,$_/=2until$_%2з кроком $i(який починається з 0) і наполовину, $_поки не $_буде нульовим модом 2. Після цього,$_ є непарний коефіцієнт вихідного числа і $iє показником 2.

$_=2*$i+1<<$_/2-.5 - Права частина = є просто формулою для шуканого числа: {1 більше, ніж удвічі більше показника в 2} рази {2 до сили {половина непарного коефіцієнта мінус половина}}. Але "раз {2 до потужності ...}" полюється як "трохи зміщений ліворуч на ...". І це праворуч призначено$_ .

І -pвідбитки $_.



2

JavaScript ES6, 36 33 байт

n=>63-2*Math.clz32(b=n&-n)<<n/b/2

Я розумію, що Math.clz32це буде коротше, ніж обманюватиtoString(2).length .

Редагувати: збережено 3 байти завдяки @ user81655.


Приємно. Ви також можете зберегти кілька байт, встановивши n&-nзмінну:n=>63-2*Math.clz32(x=n&-n)<<n/x/2
user81655

@ user81655 Дякую; Я хотів би лише використати n&=-n, але мені nзнову потрібно ...
Ніл,

1

PARI / GP , 38 байт

f(n)=k=valuation(n,2);(2*k+1)<<(n>>k\2)

Зверніть увагу , що >>і \мають однаковий пріоритет і обчислюються зліва направо, так що остання частина може бути , n>>k\2а не (n>>k)\2. Необоротна версія стане kлексичною з my:

f(n)=
{
  my(k=valuation(n,2));
  (2*k+1) << ((n>>k)\2);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.