Обратный и квадратный


19

В этом задании вы будете вычислять числа из любопытной последовательности.

Ваш ввод - одно десятичное неотрицательное целое число. Поменяйте местами биты в этом целом числе, а затем возведите в квадрат число, чтобы получить требуемый результат.

При обращении битов вы не должны использовать начальные нули на входе. Например:

26 (base 10) = 11010 (base 2) -> 01011 (base 2) = 11 -> 11*11 = 121

Первые 25 входов / выходов этой последовательности:

0: 0
1: 1
2: 1
3: 9
4: 1
5: 25
6: 9
7: 49
8: 1
9: 81
10: 25
11: 169
12: 9
13: 121
14: 49
15: 225
16: 1
17: 289
18: 81
19: 625
20: 25
21: 441
22: 169
23: 841
24: 9

Ваше решение должно работать для целых чисел произвольного размера. Если ваш язык не имеет удобного встроенного метода их использования, реализуйте свой ответ так, как будто он есть. Вы тогда извиняетесь, если ваш ответ разбивается на большие числа. Однако не используйте хитрости / ограничения, которые работают только для ограниченного домена (например, таблицы поиска).


Ваша оценка - это количество байтов исходного кода.

Бонус -50%, если вы никогда не конвертируете число в двоичный код. Это не ограничивается встроенными функциями. Если вы перебираете число по битам (с помощью сдвига, маскирования или любого другого метода), это также будет учитываться как преобразование. Я не знаю, возможно ли это на самом деле, но это дает стимул для определения паттерна в последовательности.

Наименьший счет выигрывает.



1
Если код вызывает метод, который приводит к символьной строке, которая представляет биты, имеет ли это право на бонус?
Брэд Гилберт b2gills

2
@ BradGilbertb2gills Нет.
orlp

Я предполагаю, что использование математики для извлечения битов также считается двоичным преобразованием?
lirtosiast

Ответы:


5

Par , 5 байт

✶Σ⌐Σ²

Это чтение-двоичный-обратный-двоичный-квадрат.



@ CᴏɴᴏʀO'Bʀɪᴇɴ Этот счетчик байтов предполагает UTF-8. Я считаю, что Маурис использует некоторую кодировку, которая не является UTF-8, для подсчета его байтов, но он не указал эту кодировку.
orlp

Par использует свое странное кодирование. Его каноническое представление представляет собой определенное подмножество <256 символов Юникода. Я не уверен, есть ли у него имя; Я должен ждать @Ypnypn, чтобы вмешаться.
Линн

А ну понятно. @orlp
Конор О'Брайен

Возможно, у него есть своя SBCS?
HyperNeutrino

19

Mathematica, 42 21 байт

Спасибо alephalpha за сокращение в два раза.

#~IntegerReverse~2^2&

Фактическая причина, по которой я сделал это в Mathematica, была в том, что я хотел посмотреть на сюжет ... это выглядит забавно:

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


11
Но мне нравится оценка! XD
Конор О'Брайен

1
почему этот ответ имеет больше голосов, чем ответ с наименьшим количеством байтов? o_O
Seadrus

27
@ Seadrus Вы знаете, что они говорят. Картинка стоит 7 байт.
Мартин Эндер

5
так что ваш счет 42 + 7 = 49 байт: P
Seadrus

3
Извините, @ CᴏɴᴏʀO'Bʀɪᴇɴ.
Мартин Эндер

8

Минколанг 0,14 , 43 байта

Спасибо Мего за то, что вдохновили меня.

n1{d1`,2$3*&$z2zd2%-2l$Md1%-;z2%*z2:{+}2;N.

Протестируйте код здесь и проверьте все тесты здесь .

объяснение

Это использует это отношение повторения:

a(0) = 0
a(1) = 1
a(2n) = a(n)
a(2n+1) = a(n) + 2^(floor(log_2(n))+1)

Если nэто вход, то a(n)результирующее число после того, как его двоичная последовательность была перевернута. 0 и 1 очевидны. Для a(2n) = a(n), рассмотрим, что x0(где xлюбая последовательность двоичных цифр) перевернуто 0x, что совпадает с x. Потому a(2n+1)что рассуждения немного сложнее. x1перевернуто есть 1x, что равно x + 2^kдля некоторых k. Это kеще одно , чем число цифр в x, который является floor(log_2(n))+1. Далее следует полная формула, за исключением того, что она немного изменена. Это то, что я на самом деле код:

a(0) = 0
a(1) = 1
a(n) = a(n//2) + (n%2) * 2^(floor(log_2(n - n%2)))

Как Мего и я работали в чате floor(n/2) = (n - n%2)/2. Таким образом, log_2(floor(n/2))+1 = log_2(n - n%2). Кроме того, умножение на (n%2)объединяет нечетные и четные части в одно выражение.

Наконец, без лишних слов, вот код, объяснил.

n                                              Take number from input
 1{                                            Start recursion that takes only one element
   d1`,                                        1 if top of stack 0 or 1, 0 otherwise
       2$3*                                    26
           &                                   Jump if top of stack is not zero
            $z                                 Store top of stack in register (z)

               zd2%-                           n - n%2
                    2l$M                       log_2(n - n%2)
                        d1%-                   floor(log_2(n - n%2))
              2             ;                  2^floor(log_2(n - n%2))
                             z2%               n%2
                                *              Multiply
                                 z2:           n//2
                                    {          Recurse
                                     +         Add
                                      }        Return
                                       2;N.    Square it, output as number, and stop.

1
Я думаю, что повторение - это просто переформулировка итерации по отдельным битам.
Мартин Эндер

3
Боюсь, это не считается. Всякий раз, когда вы видите 2nи 2n+1в рекуррентном отношении вы должны немедленно думать об этом как о цикле по битам.
Orlp

1
@orlp: Ну, это облом. Теперь я уверен, что ваш бонус невозможен.
El'endia Starman

@ El'endiaStarman Я уже почти понял, я думаю.
Конор О'Брайен

8

Japt , 29 28 11 7 байт

(Вы можете сохранить программу в виде 7-байтового файла в формате IEC_8859-1, а затем загрузить его в интерпретатор .)

Japt - это сокращенный JavaScript, созданный ETHproductions .

¢w n2 ²

Попробуйте онлайн!

Объяснение:

  1. ¢это ярлык для Us2, который компилируется в U.s(2). Uявляется входным (неявным), .s(2)вызываемым числом, вызывает.toString(2) (конвертирует в двоичный файл, анализирует как строку).

  2. wкомпилируется в .w(), который переворачивает строку ( .split('').reverse().join('')).

  3. n2работает как parseInt(<number>,2), то есть преобразует двоичный код в десятичный.

  4. ²вызывает Math.pow(<number>,2), то есть возводит в квадрат число.


1
Есть строковая функция toNumber n, так что вы можете это сделать Us2 a w a n2 p2. Хорошая работа, хотя!
ETHproductions

1
Кроме того, wработает со строками так же, как и с массивами, так что вам не нужны две a
пары

1
И последнее: Us2 = ¢, и p2= ², ¢w n2 ²
уменьшив

3
Онлайн переводчик теперь принимает IEC_8859-1 закодированные файлы. (Хотя я не уверен, как сделать UTF-8 и UTF-16, а также ...)
ETHproductions

2
@ETHproductions - теперь я могу +1 это :)
Цифровая травма

5

Python, 32 байта

lambda x:int(bin(x)[:1:-1],2)**2

Попробуйте онлайн.

Код довольно прост: bin(6)например, дает 0b110, двоичное представление 6. [:1:-1]переворачивает строку и удаляет 0b. intпреобразует строку в двоичное целое число и **2возводит ее в квадрат


5

Джольф , 7 байт

Просто запустите это. Ввод на странице не работает.

^C_Bj22

объяснение

^C_Bj22
    j   numeric input
   B    convert to binary (str)
  _     reverse
 C   2  parse as binary integer to base 10
^     2 square
        implicit output

Я добавил Qкоманду, которая делает это 6 байтов:QC_Bj2


4
Вычеркнуто 7 все еще выглядит как 7.
спагетто

2
@ quartata Не так плохо, как зачеркнуто 4.
orlp

4

TeaScript , 9 байт 11

TeaScript - это JavaScript для игры в гольф

®x÷v¤)**2

Будет ли гольф больше, как только я вернусь к своему компьютеру

Попробуйте онлайн!

Проверить все


Понимает ли переводчик какие-либо кодировки, кроме UTF8? Используя кодировку UTF8, я думаю, что ваша запись имеет длину 12 байт .
Цифровая травма

4

Серьезно , 8 7 байт

2;,¡R¿ª

Такие вызовы идеально подходят для серьезно :)

Попробуйте онлайн

Объяснение:

2;,¡    get a string representing the (decimal) input in binary, with a 2 on the bottom of the stack
R      reverse the string
¿    convert binary string to decimal int (using that extra 2 from earlier)
ª      square it

Хорошая работа, подходящая Джольфу!
Конор О'Брайен

+1 за то, что ваш переводчик принимает кодировку CP437 (или хотя бы шестнадцатеричное представление)
Digital Trauma

4

J 10 9 байт

2^~|.&.#:

Это молчаливый, монадический глагол. Попробуйте онлайн!

Спасибо @randomra за вывод 1 байта!

Как это устроено

2^~|.&.#:  Right argument: y

       #:  Convert y to binary.
   |.      Reverse the digits.
     &.    Dual; apply the inverse of #:, i.e., convert back to integer.
 ^~        Apply power (^) with reversed argument order (~)...
2          to 2 and the previous result.

Ссылка не работает, я получаю сообщение об ошибке 404 на странице Google, которая говорит: «Запрошенный URL /host/0B3cbLoy-_9Dbb0NaSk9MRGE5UEU/index.html не найден на этом сервере. Это все, что мы знаем».
Биджан


2

JavaScript, 64 63 56 53 байта

n=>parseInt([...n.toString(2)].reverse().join``,2)**2

Я понимаю, что я очень долго, но эй, я могу это сделать: P

демонстрация


вместо parseInt(тебя можно сделать+("0b"+
Downgoat

@ Downgoat хм, это не дает правильных результатов.
Никаэль

[...n.toString(2)]и.join``
Конор О'Брайен

1
Еще короче с ES7 (49 байт) n=>+("0b"+[...n.toString(2)].reverse().join``)**2. Пока не работает ни в одном
браузере

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Спасибо, это экономит несколько байтов.
Никель

2

Perl 6 , 21 байт

{:2(.base(2).flip)²}

Пример использования:

say {:2(.base(2).flip)²}(26); # 121

say (0..24).map: {:2(.base(2).flip)²};
# (0 1 1 9 1 25 9 49 1 81 25 169 9 121 49 225 1 289 81 625 25 441 169 841 9)

my &code = {:2(.base(2).flip)²};
say code 3; # 9

say chars code 10¹⁰⁰; # 140




1

Pyth, 9 байт

^i_.BQ2 2

Это очень простой ответ на основе Pyth, похожий на Python


1

𝔼𝕊𝕄𝕚𝕟, 12 символов / 21 байт

⦅`ᶀ`+ᴙ(ïß2)²

Try it here (Firefox only).

Неконкурентный ответ, 9 символов / 18 байт

⦅Յ+ᴙ(ïⓑ)²

Try it here (Firefox only).


1
Через этот счетчик байтов выдает 15 байтов (использует другую кодировку).
Никель

Я оцениваю, используя UTF-8 (пока не смогу заставить работать кодировку Mines).
Mama Fun Roll

... название языка ... это коробки?
CorsiKa

Это ESMin в два раза. Unicode-символы не полностью поддерживаются.
Mama Fun Roll


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.