이진 이진 확장


9

일반적으로, 우리는 2의 거듭 제곱으로 계수 0또는 1각 항에 대해 숫자를 대입하여 이진수로 숫자를 분해합니다 .

25 = 1*16 + 1*8 + 0*4 + 0*2 + 1*1

0and 의 선택 1은 ... 이진이 아닙니다. 우리는 2의 거듭 제곱으로 계수를 사용 하거나 대신 계수를 사용하여 실제 이진 확장을 수행합니다 .1-1

25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1

이제 진 보인다.

양수가 주어지면 다음을 알 수 있습니다.

  • 모든 홀수에는 무한히 많은 이진 확장이 있습니다
  • 모든 짝수에는 진정한 이진 확장이 없습니다

진정한 바이너리 확장이 잘 정의 된 것이어야하기 때문에, 우리는로 확장을 필요 이상 짧은 길이 즉,.


양수, 홀수 정수가 주어지면 n가장 큰 자릿수에서 가장 작은 자릿수로 (또는 역순으로) 이진 확장을 반환합니다.

규칙 :

  • 이대로 가능한가장 짧은 바이트 수로이 작업을 수행해야 합니다. 내장이 허용됩니다.
  • 계수를 나타내거나 나열 할 수있는 모든 출력은 허용됩니다 : 배열, 분리자가있는 계수 문자열 등.
  • 표준 골프 허점이 적용됩니다.
  • 프로그램은 언어의 표준 정수 크기 내의 값에 대해 작동해야합니다.

테스트 사례

25 -> [1,1,1,-1,-1]
47 -> [1,1,-1,1,1,1]
1 -> [1]
3 -> [1,1]
1234567 -> [1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1]

관련이 있지만 상당히 다릅니다.
주세페

4
간단한 알고리즘 :베이스 2로 변환하고 0을 -1로 바꾸고 LSD를 앞에 놓습니다.
Josiah Winslow

Voile : 나는 다운 보트를 설명하지 않고, 언어로 기본 변환 명령을 가진 사람들을위한 알고리즘을 간략하게 설명하고있었습니다.
Josiah Winslow

당신은 진정으로 이진법에 관심이 있기 때문에 값을 일반적인 자리 값과 함께 두 비트의 새로운 해석으로 묶은 비트로 반환 할 수 있습니까? 즉, 전기적으로는 고전압 또는 저전압 (또는 무엇이든)이며 표준 디버거 가 저전압 상태 0대신 인쇄되는 경우 내 잘못이 아닙니다 -1. 비트를 수신 한 발신자는 그 의미를 알고 있습니다. (이것은 32 비트의 유효 비트가있는 경우에만 오른쪽 회전이 작동하기 때문에 여전히 사소한 비트 조작 연습입니다. 예를 들어 5 비트 숫자는 5의 회전 너비가 필요합니다.)
Peter Cordes

출력에 구분 기호가 포함되어야합니까? 에 111-1-1대한 유효한 출력 25입니까?
Oliver

답변:



3

Pyth ,  12  11 바이트

|R_1.>jQ2 1

여기 사용해보십시오!


어떻게?

| R_1.> jQ2 1 전체 프로그램.

      jQ2 입력을 이진 목록으로 변환합니다.
     .> 1 주기적으로 위 목록을 오른쪽으로 1 곳씩 회전시킵니다.
| R_1 0을 -1로 대체하십시오.
               암시 적으로 출력됩니다.

우선, 우리는 그 작업이 단지 " 0이진수로 -1s 를 s로 바꾸고 오른쪽으로 1 자리 이동 "한다는 것을 알 수 있습니다. — 바로 우리가해야 할 일입니다! 이진 변환은 0s와 1s의 목록을 제공합니다 . 여기서해야 할 일은로 변환하는 골치 아픈 방법을 찾는 0-1입니다. 비트 연산자 |(비트 OR)는 우리의 친구입니다. 이진 표현에 대한지도가 |및 로 이동했습니다 -1. 현재 숫자가 0인 경우로 변환됩니다 -1.


더 좋은 방법은 없다고 생각합니다. ;)
Josiah Winslow

@JosiahWinslow I do ... 찾으려고 노력 중
Mr. Xcoder

흠? 알고리즘은 최적 인 것 같습니다. 아마도 Pyth를 모르기 때문일 수 있습니다.
Josiah Winslow

@JosiahWinslow 더 나은 방법을 찾았습니다. 알고리즘 적으로 더 나은 방법이 아니라 구문 적으로 더 나은 방법입니다.
Mr. Xcoder

@ Mr.Xcoder 그리고 지금은 나에게 적어도 아무것도 없습니다.
Outgolfer Erik


3

자바 스크립트 (ES6), 35 34 바이트

f=n=>n?[...f(n>>=1),!n|n%2||-1]:[]

테스트 스 니펫


2

펄 6 , 72 바이트

더 좋은 방법이 있지만 이것이 내가 가진 것입니다 ...

->$a {grep {$a==[+] @^a.reverse Z+< ^∞},[X] (1,-1)xx $a.base(2).chars}

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

설명 : 하나의 인수 ( ->$a) 를 취하는 함수입니다 . 먼저 필요한 계수의 수 ( $a.base(2).chars= 밑이 2 인 표현의 문자 수)를 얻은 다음, 그 수의 카테 시안 곱 ( X) 을 만듭니다 (1,-1). ( [X]의미 : 다음 목록을으로 줄이십시오 X.) 따라서 가능한 모든 1과 -1의 조합 목록을 얻습니다. 그런 다음 grep주어진 숫자를 인코딩하는 목록 만 필터링 $a합니다. 하나만 있으므로 계수가있는 하나의 목록 목록을 얻습니다.

grep 블록은 다음을 수행합니다. 인수를 목록 ( @^a) 으로 취하고 이를 뒤집고 0,1,2,..."left bit shift"연산자를 사용하여 무한 목록으로 압축합니다 +<. 더 짧은리스트가 고갈 되 자마자 압축이 멈 춥니 다. .reverseOP는 계수가 가장 유의 한 순서에서 가장 중요하지 않은 순서를 요구 하기 때문에 사용해야 했습니다.




1

J, 11 바이트

1-~2*_1|.#:

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

알고리즘에 대한 @JosiahWinslow에게 감사합니다.

더 짧은 전환에 대한 생각이 있습니까? 내 생각은 !.-fit (nvm, 변환의 허용 오차를 변경하는 것)을 사용하는 것입니다.

{-take를 사용하면 1자가 길어집니다.

_1 1{~_1|.#:

1

자바 8, 101 바이트

n->{String s=n.toString(n,2);return(s.charAt(s.length()-1)+s.replaceAll(".$","")).replace("0","-1");}

포트 @Oliver 의 JAPT 대답 과 함께, 몇 가지 더 바이트 ..;)

이 문자열 방식 대신 수학 방식을 사용하여 확실히 골프를 칠 수 있습니다.

설명:

여기에서 시도하십시오.

n->{                             // Method with Integer parameter and String return-type
  String s=n.toString(n,2);      //  Convert the Integer to a binary String
  return(s.charAt(s.length()-1)  //  Get the last character of the binary String
    +s.replaceAll(".$","")       //   + everything except the last character
   ).replace("0","-1");          //  Then replace all zeroes with -1, and return the result
}                                // End of method

1

R , 90 88 46 바이트

function(n)c((n%/%2^(0:log2(n))%%2)[-1],1)*2-1

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

Oliver의 알고리즘을 구현 하지만 숫자를 역순으로 반환합니다. 우리 n는 결코 짝수를 보장 하지 않기 때문에 최하위 비트 (첫 번째 비트)는 항상 1이므로이를 제거 1하고 끝에 회전을 시뮬레이션하기 위해 끝에 a 를 추가합니다 . 수학을 수정하게 해준 Shaggy에게 감사합니다 .

간단히 넣어 rev( )바닥 글에 함수 호출을 값이 같은 순서로 반환됩니다.

원래 답변, 88 바이트 :

function(n,b=2^(0:log2(n)))(m=t(t(expand.grid(rep(list(c(-1,1)),sum(b|1))))))[m%*%b==n,]

익명의 기능; 열 이름이 첨부 된 값을 역순으로 반환합니다 .

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

설명:

function(n){
 b <- 2^(0:log2(n))         # powers of 2 less than n
 m <- expand.grid(rep(list(c(-1,1)),sum(b|1))) # all combinations of -1,1 at each position in b, as data frame
 m <- t(t(m))               # convert to matrix
 idx <- m%*%b==n            # rows where the matrix product is `n`
 m[idx,]                    # return those rows
}

그 출력이 유효한 것으로 생각하지 않습니다. 챌린지 작성자에게 확인을 요청하십시오.
Shaggy

@Shaggy 역순은 명시 적으로 허용 from the most significant digit to the least significant digit (or in reversed order).되므로 완벽하게 허용됩니다.
주세페

1
반대의 순서 가 아닌 표시를 반전. 25예를 들어,에 대한 유효한 출력은 [1,1,1,-1,-1]또는 [-1,-1,1,1,1]입니다.
얽히고 설킨

1
@Shaggy ah, 당신 말이 맞아, 방금 수학을 잘못 했어! 2*bits - 1대신에 있어야합니다 1-2*bits. 감사합니다.
주세페




0

골프 스크립트, 14 13 14 바이트

내가 잊어 버렸기 때문에 -1 바이트 %. 입력도 잊었 기 때문에 +1 바이트는 문자열입니다.

~2base{.+(}%)\

1
입력이 정수로 가정한다고 가정하면 코드를 감싸서 {}블록으로 만들어야합니다. 전체 프로그램은 문자열로만 입력 할 수 있습니다.
피터 테일러

음 ... 뭐? 나는 숫자가 포함 된 문자열 대신 숫자가 정수로 푸시되고 있음을 의미했습니다.
Josiah Winslow

이 경우 귀하의 답변은 완전한 프로그램이 아니므로 "function" 이거나 GolfScript의 경우 블록이어야합니다. 따라서 {2base{.+(}%\}15 바이트입니다. 마찬가지로 CJam 답변.
피터 테일러

이것은 전체 프로그램입니다. Golfscript의 입력은 프로그램 시작시 스택에 암시 적으로 푸시되며 CJam의 입력은 실행 전에 지정되고 q 명령으로 액세스됩니다.
Josiah Winslow

GolfScript에 대해 잘 알고 있습니다 . ( 그리고 CJam ). 전체 프로그램이라고 주장하려면 앞에 접두사를 붙여야합니다 ~.
피터 테일러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.