Codegolf - Что Такое Обратный (Двоичный) Битовый Номер?

  • Автор темы Nuchim
  • Обновлено
  • 22, Oct 2024
  • #1

Итак, вам дан ПОЗИТИВНО десятичное число по основанию 10. Ваша задача — перевернуть двоичные цифры и вернуть число по основанию 10.

Примеры:

 1 => 1 (1 => 1)
2 => 1 (10 => 01)
3 => 3 (11 => 11)
4 => 1 (100 => 001)
5 => 5 (101 => 101)
6 => 3 (110 => 011)
7 => 7 (111 => 111)
8 => 1 (1000 => 0001)
9 => 9 (1001 => 1001)
10 => 5 (1010 => 0101)
 

Это сложная задача, поэтому побеждает решение, использующее наименьшее количество байтов.

Это А030101 в ОЭИС.

#code-golf #code-golf #number #base-conversion #binary

Nuchim


Рег
12 Dec, 2004

Тем
86

Постов
203

Баллов
663
  • 26, Oct 2024
  • #2

Питон, 29 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 k){2/:|X@&|\X:0b\:x}6
3
 

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

Это анонимная безымянная функция, возвращающая результат.


Первый, {2/:|X@&|\X:0b\:x} converts the argument to a binary string. We would ordinarily reverse this with the slice notation _2/ When the program starts out, this doesn't really do anything, because it just divides an implicit zero by 2. ?+ Read an integer N from STDIN and add it to the implicit zero on top of the stack. The main loop starts here: : Duplicate what's left of N. This is also used as the conditional to end the loop. Once this reaches zero, the IP moves straight ahead, exiting the loop. Otherwise, the IP turns south which continues the loop. # Push the stack depth, 2. % Take N modulo 2, i.e. get its least significant bit. { Fetch the intermediate result R from the auxiliary stack. :+ Double it (shifting its existing bits left by one position). + Add the bit we just extracted from N to R. } Put R back on the auxiliary stack. _2/ Divide N by 2, dropping its least significant bit. ?+ We're at EOF, so ? just pushes zero and the + gets rid of that zero. Then the main loop starts over. When we exit the loop (once N is zero), this bit is run: { Retrieve R from the auxiliary stack. ! Print it. The IP hits a dead end and turns around. {:+? Various shenanigans which simply leave a zero on top of the stack. / Terminates the program due to the attempted division by zero. . Это читает строку с шагом -1, то есть назад. Однако двоичные строки в Python имеют префикс _2/?+:{! } " ++:{%# , and therefore we give the slicing's second argument as 1, сообщая Python читать в обратном направлении, заканчиваясь на индексе 1, таким образом, не читая индексы 1 и 0.

Теперь, когда у нас есть обратная двоичная строка, мы передаем ее L:vK2*;OS# with the second argument as 2. При этом строка считывается как целое число по основанию 2, которое затем неявно возвращается лямбда-выражением.

 

Рotapich.misha


Рег
15 Apr, 2011

Тем
63

Постов
189

Баллов
504
  • 26, Oct 2024
  • #4

JavaScript (ES6), 30 28 байт

Сэкономлено 2 байта благодаря @Arnauld

0, 1, 0, 1

По сути, это вычисляет обратное побитно: мы начинаем с д = 0; пока н положительно, умножаем д на 2, отрезать последний бит от н с 1: [10] 2: [] 1: [5] 2: [0] 1: [2] 2: [0, 1] 1: [1] 2: [0, 1, 0] 1: [0] 2: [0, 1, 0, 1] , and add it to д с \ Implicit: Input is an integer on main stack. $ ; \ While i != 0: &2%v \ Put i % 2 on auxiliary stack 2/ \ i = i // 2 (integer division) F \ Swap stacks (so result is on main stack) . When н достигает 0, число успешно изменено, и мы возвращаем д.

Благодаря длинным встроенным именам JS, решение этой задачи простым способом занимает 44 байта:

$&2%v2/;F

Используя рекурсию и строку, вы можете получить 32-байтовое решение, которое делает то же самое:

$&2%v2/;FL:vK2*;OS# ||answer||

Java 8, 53 47 46 45 байт

  • -4 байта благодаря Титусу
  • -1 байт благодаря Кевину Круйссену

Это лямбда-выражение, которое имеет тот же принцип, что и Ответ ETH (хотя в Java рекурсия была бы слишком многословной, поэтому вместо этого мы используем цикл):

miscFuncs

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

Это можно назначить с помощью bin , and then called with sum(2^((length(y<-rev(miscFuncs::bin(scan()))):1)-1)*y) . В развернутом виде, без гольфа и с комментариями это выглядит так:

using System.Linq;using b=System.Convert;a=>b.ToInt64(string.Concat(b.ToString(a,2).Reverse()),2); ||answer||

Дж, 6 байт

r

n reverse

n under

% base 2

 

GregoryS


Рег
31 Jan, 2007

Тем
73

Постов
181

Баллов
576
  • 26, Oct 2024
  • #5

Желе, 3 байта

+%1

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

r ||answer||

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

%1 ||answer||

С, 48 44 43 42 байта

-1 байт благодаря гурке и -1 байт благодаря анатолику:

n

Предыдущее 44-байтовое решение:

%2

Предыдущее 48-байтовое решение:

%1

Ungolfed и использование:

@set/an=%1/2,r=%2+%1%%2 @if %n% gtr 0 %0 %n% %r%*2 @echo %r% ||answer||

Лабиринт, 23 байта

ri e# Read integer 2b e# Convert to binary array W% e# Reverse array 2b e# Convert from binary array to number. Implicitly display

Ну, это неудобно... это возвращает обратное ДВОИЧНОЕ число...

Спасибо @Martin Ender за указание на мою ошибку и ошибку с идентификатором 10T.

Так что это не работает, мне придется найти другое решение.

ri2bW%2b

 

Pompyqjl003skestSoky


Рег
08 May, 2020

Тем
86

Постов
204

Баллов
674
  • 26, Oct 2024
  • #6

Yanetta


Рег
16 Feb, 2009

Тем
61

Постов
213

Баллов
538
  • 26, Oct 2024
  • #7
2⊥∘⊖2∘⊥⍣¯1 # Main function; tacit. ⍣¯1 # invert 2∘⊥ # convert from base 2 (which is inverted to 'convert to base 2') ∘⊖ # flip, then 2⊥ # convert from base 2

Java (OpenJDK)

, 63 байта

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

Спасибо тыку за -12 байт и Cyoce за -8 байт!

f 2 ||answer||

 

Мирра


Рег
15 Feb, 2012

Тем
61

Постов
192

Баллов
527
  • 26, Oct 2024
  • #9
f←

Баш

/Утилиты Unix, 24 23 байта

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

2⊥∘⊖2∘⊥⍣¯1

 

Vanno


Рег
08 May, 2009

Тем
58

Постов
195

Баллов
495
  • 26, Oct 2024
  • #10
i => // create an anonymous function with a parameter i BigInt( //return a BigInt contructed from BigInt(i) //i converted to a BigInt toString 2 //converted to a binary string reverse //revered , 2 //interpreted as a binary string ) .

PHP, 33 байта

преобразовать в base2, перевернуть строку, преобразовать в десятичное число. Сохраните в файл и запустите как канал с помощью

val f:(Int=>Any)=i=>BigInt(BigInt(i)toString 2 reverse,2) f(10) //returns 5

нет встроенных функций: i=>BigInt(BigInt(i)toString 2 reverse,2) .

итеративный, 41 байт

i_.BQ2 Q eval(input()) .B convert to binary _ reverse i 2 convert from base 2 to base 10 ||answer||

Пока на входе установлены биты, вытащите немного из входа и передайте его на выход. Запустить как трубу срекурсивный, 52 байта

Япт

i_.BQ2

, 5 3 байта

-2 байта благодаря Шэгги

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

 

Playmamba


Рег
08 Feb, 2012

Тем
79

Постов
175

Баллов
590
  • 26, Oct 2024
  • #11
B % Input a number implicitly. Convert to binary array P % Reverse array XB % Convert from binary array to number. Display implicitly

МАТЛ

, 4 байта

BPXB ||answer||

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

¢ÔÍ

Объяснение

Пиф, 6 байт

function r($n,$r=0){return$n?r($n>>1,$r*2+$n%2):$r;} ||answer||

Набор тестов доступен здесь.

-nR

Объяснение

for(;$n=&$argn;$n>>=1)$r+=$r+$n%2;echo$r;

Скала, 40 байт

-F ||answer||

Использование:Объяснение:

<?=bindec(strrev(decbin($argn)));

APL (Диалог Юникод)

, 10 байт

Попробуйте!

Спасибо @Adám за 2 байта. dc -e2i`dc -e2o?p|rev`p ) and then called over an input; for the test cases: 0!b=b a!b=div a 2!(b+b+mod a 2) (!0) , {:2(.base(2).flip)} , etc.

a->a.valueOf(new StringBuffer(a.toString(a,2)).reverse()+"",2); ||answer||

Как это работает:

bRC ||answer||

Это неявная функция. Чтобы использовать его, ему необходимо присвоить имя (например,

m=->n{("%b"%n).reverse.to_i 2} m[1] #=> 1 m[2] #=> 1 m[3] #=> 3 m[4] #=> 1 m[5] #=> 5 m[6] #=> 3 m[7] #=> 7 m[8] #=> 1 m[9] #=> 9 m[10] #=> 5 ||answer||

Математика, 38 байтОтличный, 46 байт

->n{("%b"%n).reverse.to_i 2}

CJam

, 8 байт

?_";:_2 : % @/2_"! ||answer||

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

r; f(n){ for( r=n&1; n/=2; r+=r+n%2 ); return r;} } main() { #define P(x) printf("%d %d\n",x,f(x)) P(1); P(2); P(3); P(4); P(5); P(6); P(7); P(8); P(9); P(10); }

Объяснение r;f(n){r=0;while(n)r=2*(r+n%2),n/=2;return r/2;} contains the input parameter while r;f(n){r=n&1;while(n/=2)r=2*r+n%2;return r;} Пакетный, 62 байта r;f(n){for(r=n&1;n/=2;r+=r+n%2);return r;} as half of #~IntegerReverse~2& Пояснение: При первом проходе B # convert to binary U # reverse Ḅ # convert to decimal as BUḄ пусто. Поэтому мы оцениваем #: operator has to be doubled to quote it). If &. и |. and an expression that gets evaluated on the next pass effectively doubling |.&.#: по модулю 2 (

не равно нулю, мы тогда называем себя хвостом, рекурсивно переходя

каждый раз.

x -> { int t = 0; // Initialize result holder while (x > 0) { // While there are bits left in input: t <<= 1; // Add a 0 bit at the end of result t += x%2; // Set it to the last bit of x x >>= 1; // Hack off the last bit of x } return t; // Return the final result }; ||answer||

 

Johnheslon


Рег
19 Dec, 2015

Тем
69

Постов
205

Баллов
560
  • 26, Oct 2024
  • #13

Напористый

f=(n,q='0b')=>n?f(n>>1,q+n%2):+q

, 19 байт

Никакой встроенной базовой конвертации!

Попробуйте онлайн! n=>+[...n.toString(2),'0b'].reverse().join`` , converts the number to its reverse binary representation:

|n%2

У Pushy есть два стека, и в этом ответе это широко используется.

n>>1

Эта программа состоит из двух частей. Первый, f=(n,q)=>n?f(n>>1,q*2|n%2):q has been created on the second stack - the reverse binary digits of 10, lambda n:int(bin(n)[:1:-1],2) .

В примере 10 стеки на каждой итерации будут выглядеть следующим образом: int(...) , is taken from my previous answer which converts Мы видим, что после последней итерацииВторая часть кода,

двоичный в десятичный

. Используя метод, описанный и объясненный в этом ответе, он преобразует двоичные цифры в стеке в целое число по основанию 10 и печатает результат.

 

Vungubocuound


Рег
06 Apr, 2020

Тем
74

Постов
207

Баллов
597
  • 26, Oct 2024
  • #14
0b

Лабиринт

, 22 байта

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

[::-1] ||answer||

Объяснение

bin(n)

Идея состоит в том, чтобы побитно разбирать входные данные, собирая выходные данные с другого конца. К счастью, проще всего разобрать число справа и построить его слева, поэтому биты автоматически переворачиваются. Обычно мы будем хранить то, что осталось от входных данных, поверх основного стека, а то, что мы уже вычислили из результата, поверх вспомогательного стека.

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

AmitsGoosyVot22


Рег
31 Aug, 2007

Тем
61

Постов
191

Баллов
506
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно