이진수를 음수로 변환


15

입력으로 0및 사이 1111111111111111(즉, 부호없는 16 비트 정수) 사이의 이진 정수가 주어지면 negabinary 의 동일한 정수를 출력합니다 .

입력은 귀하의 언어에 가장 편리한 형식이 될 수 있습니다. 예를 들어, 프로그램 0000000000000101이 단순히 16 자릿수가 아닌 16 자릿수의 입력을 처리하는 것이 더 쉬운 경우 101, 입력 방식 만 허용하도록 프로그램을 작성할 수 있습니다.

샘플 I / O

> 1
1
> 10
110
> 1010
11110
> 110111001111000
11011001110001000
> 1001001
1011001

음수 및 정수가 아닌 염기를 포함하여 염기 변환을 수행 하는 샘플 프로그램 은 다음과 같습니다 . 이를 사용하여 작업을 확인할 수 있습니다.


조금 더 명확히하기 위해 입력과 출력은 이진이어야합니다. 내 말은 : 0s와 1s의 문자열 . 나에게 분명해 보이지만 대답은 나를 의심하게한다.
Joanis

@ M.Joanis 입력은 이진수이고 출력은 음수입니다 (이진수는 0과 1로 구성된 문자열과 동일하지만 숫자가 해석되는 방식이 다릅니다)
Peter Olson

2
링크가 다운 된 것 같습니다. 이것이 요즘 질문이 포함 된 주요 이유입니다
Jo King

답변:


6

APL, 21 자

'01'[-(16/¯2)⊤-2⊥⍎¨⍞]

이를 위해 Dyalog APL ⎕IO을 0 으로 설정하여 1이 아닌 0에서 시작하는 배열을 색인화 할 수있었습니다.

오른쪽에서 왼쪽으로 설명 :

  • 사용자 입력을 문자형 벡터로 제공합니다.
  • ⍎¨실행 함수 ( )를 ¨앞에서 언급 한 각 문자 ( )에 적용하여 정수 1과 0으로 구성된 벡터를 만듭니다.
  • 2⊥ 밑이 2의 벡터를 10 진수로 해독합니다.
  • - 결과 10 진수 정수를 무효화합니다.
  • (16/¯2)⊤십진 정수를 밑으로 인코딩합니다 ¯2(음수 2). ( , 시간을 16/¯2복제 하여 음수 16 자릿수를 생성합니다.)¯216
  • - 새로 인코딩 된 숫자의 각 요소를 무효화하므로 (이전에 -1과 0으로 구성됨)이를 사용하여 문자형 벡터를 인덱싱 할 수 있습니다.
  • '01'[ ... ]'01'부정 된 음수 벡터의 0과 1을 사용하여 문자형 배열 ( )을 인덱싱합니다 . 그래서 우리는 더 예쁘게 출력합니다.

예:

      '01'[-(16/¯2)⊤-2⊥⍎¨⍞]
10111010001
0001101011010001

4

루비, 32 31 자

m=43690
'%b'%(gets.to_i(2)+m^m)

음의 계산 바로 가기를 사용합니다 .


입력이 하드 코딩되지 않았습니다. 0xAAAA는 입력이 아니며 입력을 변환하는 마스크입니다. 0xAAAA는 1010101010101010과 같으며 XOR 연산에서 2 진을 음수로 변환하는 데 사용됩니다. 입력 자체는 getsSTDIN에서 페치 하는 키워드에서 가져옵니다.
Stefano Diem Benatti

0xAAAA를 43690 (10 진수와 동일한 숫자)으로 변경하여 문자 수를 1 씩 줄였습니다. wtf가 발생하고 있음을 이해하기 어렵습니다.
Stefano Diem Benatti

아, 알았어요 나는 루비가 좋지 않아 확신하지 못했습니다. 미안합니다.
Rɪᴋᴇʀ

3

GolfScript, 34 29 27 자

n*~]2base{.2%\(-2/.}do;]-1%

명백한 stragt-forward 접근. 가장 짧은 버전이 먼저 숫자로 변환 된 다음 기본 -2로 돌아가는 버전이라는 것이 매우 흥미 롭습니다 (적어도 지금까지 찾을 수있는 가장 짧은 버전). 그러나 이것에 대한 좋은 점은 거의 15 %가 포함되어 있다는 것 %입니다.

편집 1 : 베이스 2의 경우 하나의 모듈로 연산을 저장하고 두 루프를 결합 할 수 있습니다.

편집 2 : 바이너리 문자열을 정수로 변환하는 훨씬 짧은 코드를 발견했습니다.


3

하스켈, 86 83 바이트

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=digits 2$xor(unDigits 2 n+m)m

c를 사용한 다음 숫자에 대한 정수 배열을 사용하여 호출하십시오. 예 :

c [1,1]

추신 : 나는 새로운, 나는 이것을 올바르게 제출 했습니까?

편집 : Laikoni 덕분에 바이트를 절약하고 오타도 수정했습니다.

EDIT2 : 또는 c :: String-> String :

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=concatMap show.digits 2$xor(unDigits 2(map(read.(:[]))n)+m)m

114 바이트 (하지만 문자열로 호출 : c "11")


네! 사이트에 오신 것을 환영합니다! 당신이 주위에 붙어 있기를 바랍니다!
Rɪᴋᴇʀ

PPCG에 오신 것을 환영합니다! undigits 2 n함수 응용 프로그램이보다 강하게 바인딩되므로 괄호를 묶을 수 있습니다 +m. m가드 에 바인딩 하여 일부 바이트를 저장할 수도 있습니다 c n|m<-0xAAAAAAAA= ....
Laikoni

2

Python (2.x), 77 자

(베이스를 수동으로 전환해야하기 때문에 다른 솔루션만큼 짧지 않습니다 ...) 요구 사항을 충족해야합니다.

i=input();d=""
while i:i,r=i//-2,i%-2;i+=r<0;d+=`r+[0,2][r<0]`
print d[::-1]

추가 개선을위한 제안은 환영합니다!

다음과 같은 시작 값으로 공급하십시오. 0b1001001


2

자바 스크립트, 68 바이트

function(b){for(r='',n=parseInt(b,2);r=(n&1)+r,n>>=1;n=-n);return r}

ES6에서는 52 바이트가되지만, 이는 날짜 이후의 과제입니다.

b=>eval(`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`)

2

젤리 , 4 바이트, 언어 날짜 도전 과제

Ḅb-2

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

입력을 받아 숫자 목록으로 출력합니다.

설명

Ḅb-2
Ḅ     Convert binary to integer
 b-2  Convert integer to base -2

이것은 스펙의 직접적인 번역 일뿐입니다.


비 경쟁적이지 않습니까? 이 문제는 ... '11에서입니다
NoOneIsHere

나는 그것을 놓쳤다. 헤더에 메모를하겠습니다.

1

k, 17 바이트 비경쟁

사용 된 기능 중 일부는 아마도 도전 과제를 마무리 짓습니다.

1_|2!{_.5+x%-2}\2/

입력은 1과 0의 목록이며 출력은 1과 0의 목록이기도합니다.

프로그램 작동의 예.





당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.