Что такое обратный (двоичный) номер бита?


33

Таким образом, вам дается положительное основание 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)

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

Это A030101 в OEIS.


2
Означает ли «инвертировать биты» обратные двоичные цифры? Иногда это также может означать инвертирование каждого бита .
ETHproductions

Да. Извините за то, что неясно.
JuniorRubyist

Это и это очень похоже.
Geobits


1
"база 10" какая-то конкретная причина почему?
CalculatorFeline

Ответы:


20

Python , 29 байт

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

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

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


Сначала bin(n)преобразует аргумент в двоичную строку. Мы обычно обращаем это вспять с помощью обозначения среза [::-1]. Это читает строку с шагом -1 , то есть в обратном направлении. Однако двоичные строки в Python начинаются с префикса 0b, и поэтому мы даем второму аргументу среза значение 1 , указывающее Python читать назад, заканчиваясь на индексе 1 , таким образом, не читая индексы 1 и 0 .

Теперь, когда у нас есть обратная двоичная строка, мы передаем ее int(...)со вторым аргументом как 2 . Это читает строку как целое число с основанием 2, которое затем является неявностью, возвращаемой лямбда-выражением.


2
Бить тебя на 9 секунд.
mbomb007


6
@ mbomb007, значит, мой ответ недействителен, потому что вы нажали кнопку записи за 9 секунд до раздачи? То, что мы одновременно достигаем одного и того же поля для гольфа, не означает, что мы должны удалять какие-либо ответы. Во всяком случае, вините вопрос 0 усилий.
FlipTack

3
Не недействительно, но определенно бессмысленно. Если бы я был медленнее, я бы просто удалил свой и разместил бы комментарий о более быстром, который я тоже придумал.
mbomb007

1
@steenbergh Кому интересно? Тот же код, тот же счет.
mbomb007


13

JavaScript (ES6), 30 28 байт

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

f=(n,q)=>n?f(n>>1,q*2|n%2):q

Это в основном вычисляет реверс по одному биту за раз: мы начинаем с q = 0 ; в то время как n положительно, мы умножаем q на 2, отрываем последний бит от n с помощью n>>1и добавляем его к q с помощью |n%2. Когда n достигает 0, число было успешно изменено, и мы возвращаем q .

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

n=>+[...n.toString(2),'0b'].reverse().join``

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

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

f=(n,q)=>n?f(n>>1,q*2|n%2):qпочти работает. Но, к сожалению, не для n=0.
Арно

@Arnauld OP еще не ответил, будет ли вход всегда положительным, но если это так, то 0 не нужно обрабатывать.
FlipTack

Это поздняя проверка, но сейчас известно, что вклад всегда положительный.
Арно

@ Arnauld Спасибо!
ETHproductions

10

Java 8, 53 47 46 45 байт

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

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

x->{int t=0;for(;x>0;x/=2)t+=t+x%2;return t;}

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

Это может быть назначено с IntFunction<Integer> f = ..., а затем вызвано с f.apply(num). Развернутое, разглаженное и прокомментированное, это выглядит так:

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
};

1
Сохраните 3 байта с помощью t*2вместо (t<<1), еще один с перемещением этого вычисления из заголовка цикла в тело цикла. Можете ли вы использовать xвместо x>0этого условия?
Тит

2
@ Titus не без явного приведения к логическому значению, но спасибо за другие советы! Также только что понял, что x>>=1может быть заменено, так x/=2как это будет автоматически целочисленное деление.
FlipTack

45 байтов (изменено t=t*2+на t+=t+.)
Кевин Круйссен,

@KevinCruijssen хороший!
FlipTack


8

Желе , 3 байта

BUḄ

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

B   # convert to binary
 U  # reverse
  Ḅ # convert to decimal

7
Это довольно коротко, BUB
Cyoce

Хм ... Это действительно 3 байта ?
aioobe

1
@aioobe Да. Jelly использует свою собственную кодовую страницу, где каждый из этих символов занимает 1 байт.
Райли

Хорошо, спасибо! <pad>
17


7

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

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

Ну, это неудобно ... это возвращает обратный двоичный номер ... Спасибо @Martin Ender за то, что указал и на мою ошибку, и на мою ошибку ID 10T. Так что это не работает, я должен найти другое решение.


1
Добро пожаловать в PPCG и приятного первого поста! Просто выполнить вызов на таком языке, как Лабиринт, может быть очень сложно. Здесь мы обычно ставим перед первой строкой ответа один или два хэша, чтобы они отображались в виде заголовка:# Labyrinth, 89 bytes
ETHproductions

1
Вы случайно пропустили ведущий пробел во втором ряду? В нынешнем виде программа просто подпрыгивает вперед и назад по первой строке, потому что они _находятся на стыках.
Мартин Эндер

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

6

C 48 44 43 42 байта

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

r;f(n){for(r=n&1;n/=2;r+=r+n%2);return r;}

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

r;f(n){r=n&1;while(n/=2)r=2*r+n%2;return r;}

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

r;f(n){r=0;while(n)r=2*(r+n%2),n/=2;return r/2;}

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

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уже нет инициализации нуля r;f(n){r=0;, например, нет r=0;необходимости? Также незначительная опечатка: «Предыдущая 48 байт решения»
симон

1
@gurka Функция должна быть многоразовой.
Карл Напф

1
Я думаю, что forпетли всегда по крайней мере такие же короткие, как whileпетли, и часто короче.
Анатолий

@anatolyg что - то вроде: r;f(n){for(r=n&1;n/=2;r=2*r+n%2);return r;}? На 1 байт короче, но я не уверен, действительно ли это C (C99).
симон

Да; Кроме того , поворот =в , +=чтобы сделать его короче и более запутанным
anatolyg

5

Рубин, 29 28 байт

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

"% b"% n форматирует ввод n как двоичную строку, обратный, затем преобразует обратно в число

Использование / Тестовые случаи:

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

@ Я думаю, ты неправильно понял ответ. 2является базой, в которую он конвертирует, и nявляется входом. ->args{return value}такое рубиновый лямбда-синтаксис
Cyoce

Можете ли вы удалить скобки в .to_i(2)?
Cyoce

@ Конечно, спасибо.
Алексис Андерсен


4

Java (OpenJDK) , 63 байта

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

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

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


Несмотря на то, что представления REPL разрешены, они по-прежнему следуют правилу, согласно которому нельзя предполагать, что входные данные находятся в предопределенных переменных (как aв этом контексте)
FlipTack

@FlipTack Упс. Первоначально это была функция, прежде чем я вспомнил, что репл существовал
Павел

1
Также в будущем используйте printвместо игры printlnв гольф :)
FlipTack

1
StringBufferсохраняет байты болееStringBuilder
Poke

1
Не могли бы вы сделать +""вместо .toString()?
Cyoce

3

Perl 6 , 19 байт

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

Где вход?
Тит

Это функция, которая принимает один параметр $_. Это не упоминается по имени, но baseметод вызывается на нем.
Шон

2
@Titus в Perl 6 a Block - это тип кода, то есть вызываемый объект. Выше приведено выражение, которое вы можете взять и присвоить переменной, например, функции или лямбде на другом языке, или напрямую вызвать - {:2(.base(2).flip)}(10)в REPL будет напечатано 5. Таким образом, оно соответствует стандартным критериям кода-гольф для функции.
Хоббс

3

Haskell, 36 байт

0!b=b
a!b=div a 2!(b+b+mod a 2)
(!0)

Тот же алгоритм (и длина!), Что и в ответе ETHproductions на JavaScript .



3

PHP, 33 байта

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

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

нет встроенных

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

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

Пока на входе установлены биты, извлеките бит из ввода и подтолкните его к выводу. Беги как труба с -nR.

рекурсивный, 52 байта

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

@ JörgHülsermann 44 байта имеют $r+=$r. Но я на самом деле не помню, почему я поставил это перед собой.
Тит




2

Скала, 40 байт

i=>BigInt(BigInt(i)toString 2 reverse,2)

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

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

Объяснение:

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
  )


1

Groovy, 46 байт

{0.parseInt(0.toBinaryString(it).reverse(),2)}

Это принимает какой-либо вклад?
Тит

1
@Titus itотносится к аргументу, данному блоку IIRC
Cyoce

Мне нравится, что это такая же длина, как и мой ответ на Java - Java и отличные, объединяйтесь!
FlipTack

1
@ FlipTack Я пойду плакать сейчас.
Волшебная Осьминог Урна


1

Пакетная, 62 байта

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

Объяснение: На первом проходе %1содержит входной параметр, пока %2он пуст. Поэтому мы оцениваем nкак половину %1и rкак +%1по модулю 2 ( %оператор должен быть удвоен, чтобы заключить его в кавычки). Если nне ноль, мы тогда называем себя хвостом, рекурсивно передающим вход, nи выражение, которое вычисляется на следующем проходе, эффективно удваивается rкаждый раз.



1

R, 55 байт

sum(2^((length(y<-rev(miscFuncs::bin(scan()))):1)-1)*y)

Читает ввод из stdin и, следовательно, использует binфункцию из miscFuncsпакета для преобразования из десятичного в двоичный вектор.


1

Напористый , 19 байт

Нет встроенной базы преобразования!

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

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

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

Эта программа состоит из двух частей. Во-первых, $&2%v2/;Fпреобразует число в обратное двоичное представление:

            \ 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)

Учитывая пример 10, стеки будут выглядеть следующим образом на каждой итерации:

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]

Мы можем видеть , что после последней итерации, 0, 1, 0, 1был создан на втором ярусе - обратные двоичные цифры 10, 0b1010.

Вторая часть кода L:vK2*;OS#взята из моего предыдущего ответа, который преобразует двоичный код в десятичный . Используя метод, описанный и объясненный в этом ответе, он преобразует двоичные цифры в стеке в целое число 10 и печатает результат.



0

C #, 167 байт

 for(int i = 1; i <= 10; i++)
 {
 var bytes= Convert.ToString(i, 2);
 var value= Convert.ToInt32(byteValue.Reverse()); 
 console.WriteLine(value);
}

Объяснение:

Здесь я буду повторять n значений, и каждый раз итерированное целочисленное значение преобразуется в байтовое значение, а затем инвертировать это байтовое значение, и это байтовое значение преобразуется в целочисленное значение.


1
Добро пожаловать на сайт! Я не знаю много о C #, но у вас наверняка есть много лишних пробелов, которые я бы порекомендовал удалить. Также неясно, как происходит ввод-вывод в этом представлении. Стандартно либо написать функцию, либо использовать STDIN(я думаю, что это так, console.Read()но вы, вероятно, знаете об этом лучше, чем я) и STDOUT. В любом случае, добро пожаловать на сайт, если вам нужен более опытный совет по игре в гольф C #, я бы порекомендовал codegolf.stackexchange.com/questions/173/…
Wheat Wizard

Я отклонил этот ответ, потому что он не работает вообще. .Reverse()возвращается IEnumerable<char>. Поскольку Convert.ToInt32не имеет перегрузки для IEnumerable, он генерирует исключение. Кроме того, ответ не соответствует правилам для кода гольф: 1) Поскольку ничего не указано, представление должно быть полной программой или функцией, а не просто фрагментом. 2) usingоператоры должны быть включены в счетчик байтов
разнагул

0

c / c ++ 136 байт

uint8_t f(uint8_t n){int s=8*sizeof(n)-ceil(log2(n));n=(n&240)>>4|(n&15)<<4;n=(n&204)>>2|(n&51)<<2;n=(n&172)>>1|(n&85)<<1;return(n>>s);}

Это не победит, но я хотел использовать другой подход в c / c ++ 120 байтов в функции

#include <math.h>
#include <stdio.h>
#include <stdint.h>

uint8_t f(uint8_t n){
    int s=8*sizeof(n)-ceil(log2(n));
    n=(n&240)>>4|(n&15)<<4;
    n=(n&204)>>2|(n&51)<<2;
    n=(n&172)>>1|(n&85)<<1;
    return (n>>s);
}

int main(){
    printf("%u\n",f(6));
    return 0;
}

Чтобы уточнить, что я делаю, я использовал функцию log, чтобы определить количество бит, используемых входом. Чем последовательность трех битовых сдвигов влево / вправо, внутри / снаружи, четный / нечетный, который переворачивает все целое число. Наконец немного сдвинуть, чтобы сместить число обратно вправо. Использование десятичных чисел для битовых сдвигов вместо шестнадцатеричных - это боль, но это сэкономило несколько байтов.


Вам необходимо включить объявление функции, так что на самом деле это 163 байта . Хотя, если вы удалите посторонние пробелы, вы можете сократить его до 136.
DJMcMayhem
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.