역 (바이너리) 비트 번호는 무엇입니까?


33

따라서 POSITIVE 10 진법 (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

veeeeery 유사하다.
Geobits


1
"base 10"특별한 이유가 있습니까?
CalculatorFeline

답변:


20

파이썬 , 29 바이트

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

온라인으로 사용해보십시오!

익명의 이름없는 함수로 결과를 반환합니다.


먼저 bin(n)인수를 이진 문자열로 변환합니다. 우리는 보통 이것을 슬라이스 표기법으로 뒤집을 것 [::-1]입니다. -1 단계 , 즉 거꾸로 문자열을 읽습니다 . 그러나 파이썬의 이진 문자열 앞에는 접두사가 붙 0b으므로 슬라이싱의 두 번째 인수를 1로 지정 하여 인덱스 1 에서 종료하여 뒤로 읽도록 인덱스 를 지정하므로 인덱스 10은 읽지 않습니다 .

이제 이진 문자열을 거꾸로 만들었으므로 int(...)두 번째 인수를 2 로 전달합니다 . 문자열을 기본 2 정수로 읽은 다음 람다 식에서 암시 적으로 반환합니다.


2
9 초 동안 당신을이기십시오.
mbomb007


6
@ mbomb007 그래서 9 초 전에 게시 버튼을 클릭했기 때문에 내 대답이 유효하지 않습니다. 동일한 골프장에 동시에 도달한다고해서 답변을 삭제해야하는 것은 아닙니다. 무엇이든, 노력 노력 문제를 비난하십시오.
FlipTack

3
유효하지 않지만 확실히 의미가 없습니다. 내가 느렸다면, 나는 단순히 내 것을 삭제하고 나도 생각 해낸 더 빠른 것에 대한 의견을 게시 할 것입니다.
mbomb007

1
@steenbergh 누가 신경 쓰나요? 같은 코드, 같은 점수.
mbomb007


13

자바 스크립트 (ES6), 30 28 바이트

@Arnauld 덕분에 2 바이트 절약

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

@Arnauld OP는 입력이 항상 양수인지 여부에 대해 아직 대답하지 않았지만 그렇다면 0을 처리 할 필요가 없습니다.
FlipTack

이것은 늦은 후속 조치이지만 입력은 항상 긍정적 인 것으로 알려져 있습니다.
Arnauld 2012 년

@Arnauld 감사합니다!
ETHproductions

10

자바 8, 53 47 46 45 바이트

  • Titus 덕분에 -4 바이트
  • Kevin Cruijssen 덕분에 -1 바이트

이것은 ETH의 대답 과 동일한 원칙을 가진 람다 식입니다 (재귀는 Java에서 너무 장황했지만 대신 반복합니다).

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

온라인으로 사용해보십시오!

을 사용하여 할당 IntFunction<Integer> f = ...한 다음을 사용하여 호출 할 수 있습니다 f.apply(num). 확장, ungolfed 및 주석을 달면 다음과 같습니다.

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
루프 헤드에서 루프 바디로 계산을 이동하여을 t*2대신하여 3 바이트를 절약하십시오 (t<<1). 조건 x대신에 사용할 수 있습니까 x>0?
Titus

2
@Titus는 부울에 대한 명시 적 캐스트가 아니라 다른 팁에 감사드립니다! 또한 자동으로 정수 나누기이므로 x>>=1바꿀 수 있음을 깨달았습니다 x/=2.
FlipTack

45 바이트 (변경 t=t*2+t+=t+.)
케빈 Cruijssen에게

@KevinCruijssen 좋은 하나!
FlipTack

9

J, 6 바이트

|.&.#:

|.

&. 아래에

#: 베이스 2




7

미로, 23 바이트

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

글쎄, 이것은 어색하다 ... 이것은 역 바이너리 숫자를 반환한다. 내 버그와 ID 10T 에러를 지적 해준 @Martin Ender에게 감사한다. 그래서 이것은 작동하지 않습니다. 나는 다른 해결책을 찾아야합니다.


1
PPCG에 오신 것을 환영합니다. 미로와 같은 언어로 도전하는 것은 매우 어려울 수 있습니다. 여기에서는 일반적으로 답변의 첫 번째 줄 앞에 하나 또는 두 개의 해시를 # Labyrinth, 89 bytes
붙여

1
실수로 두 번째 행에서 선행 공간을 생략 했습니까? 서있는 것처럼, 프로그램은 _교차점에 있기 때문에 첫 번째 줄에서 앞뒤로 튀어 오릅니다.
Martin Ender

불행히도, 나는 도전이 이진 표현이 아니라 역 숫자의 10 진 표현을 요구하기 때문에 이것이 관계없이 유효하지 않다는 것을 알았습니다.
Martin Ender

6

C, 48 44 43 42 바이트

gurka 덕분에 -1 바이트, anatolyg 덕분에 -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;}

언 골프 및 사용법 :

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아직 0으로 초기화 되지 않았 습니까? r;f(n){r=0;예를 들어 r=0;불필요합니까? 사소한 오타 : "이전 48 바이트 솔루션"
simon

1
@gurka이 기능은 재사용 할 수 있어야합니다.
Karl Napf

1
나는 생각 for루프가 적어도 짧게 항상 while루프, 종종 짧은.
아나 톨릭

@anatolyg 같은 것 : r;f(n){for(r=n&1;n/=2;r=2*r+n%2);return r;}? 1 바이트 더 짧지 만 유효한 C (C99)인지 확실하지 않습니다.
simon

예; 또한 더 짧고 난독 화하기 위해 방향 =+=
바꾸십시오

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

@Titus 나는 당신이 답을 오해한다고 생각합니다. 2그가 전환하고있는 기본 n이며 입력입니다. ->args{return value}루비 람다 구문
Cyoce

에서 괄호를 제거 할 수 있습니까 .to_i(2)?
Cyoce

@Cyoce, 감사합니다.
Alexis Andersen


4

자바 (OpenJDK) , 63 바이트

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

온라인으로 사용해보십시오!

-12 바이트를 찌르고 -8 바이트를 Cyoce에 감사합니다!


REPL 제출이 허용 되더라도 입력이 사전 정의 된 변수에 있다고 가정 할 수없는 규칙을 따릅니다 ( a이 문맥에서 와 같이 )
FlipTack

@FlipTack 죄송합니다. 그것은 원래 존재했던 repl을 기억하기 전에 원래 기능이었습니다
Pavel

1
또한 앞으로 골프 print대신에 사용 println:)
FlipTack

1
StringBuffer바이트를 절약합니다StringBuilder
Poke

1
+""대신에 할 수 .toString()있습니까?
Cyoce

3

펄 6 , 19 바이트

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

입력은 어디에 있습니까?
Titus

이것은 하나의 매개 변수를 취하는 함수입니다 $_. 이름으로 언급되지는 않지만 base메소드가 호출됩니다.
Sean

2
Perl 6의 @Titus a Block은 코드의 한 유형으로, 호출 가능한 객체입니다. 위의 함수는 다른 언어로 된 함수 또는 람다와 같은 변수에 할당하거나 직접 호출 할 수있는 표현식입니다 {:2(.base(2).flip)}(10). REPL에서 5를 인쇄하면 함수의 표준 코드 골프 기준을 충족합니다.
hobbs

3

하스켈, 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로 변환, 역 문자열, 10 진수로 변환 파일로 저장하고로 파이프로 실행하십시오 -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. 그러나 나는 왜 내가 그것을 앞에 넣었는지 기억하지 못합니다.
Titus




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

배치, 62 바이트

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

설명 : 첫 번째 패스에서 비어있는 %1동안 입력 매개 변수를 포함합니다 %2. 따라서 우리는 평가 n의 절반 %1r같은 +%1(모듈로 2 %운영자가 그것을 인용 배가되어야한다). 경우 n0이 아닌, 우리는 반복적으로 꼬리를 전달 자신을 호출 n하고 효과적으로 배로 다음 패스에 평가됩니다 식 r마다.


1

C #, 98 바이트

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

1

R, 55 바이트

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

stdin에서 입력을 읽고 결과적으로 패키지 의 bin함수를 사용하여 miscFuncs10 진수에서 이진 벡터로 변환합니다.


1

Pushy , 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.

코드의 두 번째 부분은 이진을 decimalL: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 #에 대해 잘 모르지만 제거를 권장하는 추가 공백이 많이 있습니다. 또한이 제출에서 I / O가 어떻게 처리되는지 명확하지 않습니다. 함수를 작성하거나 사용하는 것이 표준입니다 STDIN(그렇다고 생각 console.Read()하지만 아마도 나보다 더 잘 알고있을 것입니다) STDOUT. 당신은 내가 추천 할 것입니다 C 번호를 골프에 경험이 많은 조언을하려면 어쨌든, 사이트에 오신 것을 환영합니다 codegolf.stackexchange.com/questions/173/...
밀 마법사

이 답변이 전혀 작동하지 않기 때문에이 답변을 downvoted했습니다. .Reverse()을 반환 IEnumerable<char>합니다. 으로는 Convert.ToInt32예외를 throw는 IEnumerable에 대한 과부하가 없습니다. 1) 아무 것도 지정하지으로 제출이되어야한다 : 또한 대답은 코드 골프의 규칙을 따르지 않는 모든 프로그램이나 기능 뿐 아니라 조각을. 2) using문장 은 바이트 수에 포함되어야합니다
raznagul

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 함수를 사용하여 입력에 사용되는 비트 수를 결정했습니다. 일련의 3 비트보다 전체 정수를 뒤집는 왼쪽 / 오른쪽, 내부 / 외부, 짝수 / 홀수. 마지막으로 비트 시프트는 숫자를 오른쪽으로 다시 이동시킵니다. 16 진수 대신 비트 시프트에 10 진수를 사용하는 것은 고통 스럽지만 몇 바이트를 절약했습니다.


함수 선언을 포함해야하므로 실제로는 163 바이트 입니다. 외부 공백을 제거하면 공백을 136으로 줄일 수 있습니다.
DJMcMayhem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.