Фон
В математике хорошо известно, что целые числа могут быть приведены в однозначное соответствие с парами целых чисел. Есть много возможных способов сделать это, и в этой задаче вы реализуете один из них и его обратную операцию.
Задание
Ваш вход является положительным целым числом 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
Leaderboard
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам. Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## 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
источник
Ответы:
Желе ,
171615 байтПопробуйте онлайн!
Как это устроено
источник
Pyth,
1615 байт1 байт благодаря Денису
Тестирование
Объяснение:
источник
MATL , 22 байта
Попробуйте онлайн!
объяснение
источник
Q
для1+
(это было введено недавно) иq
для1-
. Это также экономит место (которое вы можете сохранить вH
любом случае). Смотрите здесьPython 2, 39 байт
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
.n & -n
.n=1;exec"c=n&-n;print n,':',2*len(bin(c))-5<<n/2/c;n+=1;"*100
, но за лучшее решение стоит два символа.n
.MATL , 25
26байтПри этом используется текущая версия (10.2.1) языка / компилятора.
Попробуйте онлайн!
объяснение
Довольно просто, основано на грубой силе. Пробует все комбинации a и b , выбирает подходящую и выполняет необходимые вычисления.
источник
Юлия, 41 байт
Это анонимная функция, которая принимает целое число и возвращает целое число. Чтобы вызвать его, присвойте его переменной.
Определим
a
как 1 + показатель степени 2 в простой факторизацииn
. Так какfactor
возвращаетDict
, мы можем использоватьget
значение по умолчанию 0 в случае , если на простые множители не содержит 2. Мы правильно битную сдвигn
поa
, и принять 2 к этой власти. Мы умножаем это2a-1
на результат.источник
Perl 5, 40 байт
38 байт плюс 2 для
-p
-p
читает STDIN в переменную$_
.$i++,$_/=2until$_%2
увеличивает$i
(который начинается с 0) и делится пополам$_
до$_
ненулевого мода 2. После этого$_
это нечетный множитель исходного числа и$i
показатель степени 2.$_=2*$i+1<<$_/2-.5
- Правая часть -=
это просто формула для искомого числа: {1 более чем вдвое больше показателя в 2} раза {2 в степени {половина нечетного множителя минус половина}}. Но «времена {2 к силе…}» обозначены как «сдвинутые влево на…». И эта правая часть назначена$_
.И
-p
печатает$_
.источник
C, 49 байтов
источник
JavaScript ES6,
3633 байтаЯ понимаю, что
Math.clz32
это будет короче, чем возиться сtoString(2).length
.Редактировать: 3 байта сохранены благодаря @ user81655.
источник
n&-n
переменную:n=>63-2*Math.clz32(x=n&-n)<<n/x/2
n&=-n
, но мне нужноn
снова ...PARI / GP , 38 байт
Обратите внимание, что
>>
и\
имеют одинаковый приоритет и вычисляются слева направо, поэтому последняя часть может быть,n>>k\2
а не(n>>k)\2
. Безгольфовская версия сделаетk
лексическую сmy
:источник