기본 제공 기본 변환없이 기본 10에서 기본 2로 변환


16

배경 :

사전 제작 된 기본 변환 기능을 사용하지 않고 기본 10 개의 숫자를 기본 2로 변환하도록 지정되었습니다. 가져온 라이브러리도 사용할 수 없습니다.

문제 :

입력 문자열을 10 진수 10 진수를 2 진수 2 진수로 변환합니다. 사전 제작 된 기본 변환 코드 / 함수 / 방법 또는 가져온 라이브러리를 사용할 수 없습니다. 이것이 이므로 바이트 단위의 최단 답변이 이깁니다.

입력은 -32768에서 32767 사이입니다 (코드에 부호 바이트 처리 포함)


3
Q : "부호 바이트 처리"는 무엇을 의미합니까-음수에 대해 "-xxxx"를 출력해야합니까? 그렇다면 우리 중 일부는 잘못되었습니다. 나 -1에 대해 "11 ... 11"을 출력함에 따라 (일명 부호없는)
blabla999

부호 바이트 처리-부호있는 변수의 MSB가 음수인지를 제어합니다.
TheDoctor

1
물론, '-'기호로> print <다음에 크기를 표시해야합니까?
blabla999

@ blabla999-아니요 당신은하지 않습니다
TheDoctor

3
the MSB of signed variables controls if they are negative-부호 비트처럼 들리지만 범위에서 -32768..32767알 수 있듯이 2의 보수를 원합니다. 그래서 당신은 무엇을 원하십니까? ..
mniip

답변:


4

GolfScript-17 바이트

~{.1&\2/}16*;]-1%

내장보다 너무 장황하지 않습니다 ~2base.


1
나는 golfscript 모르지만 몇 가지 샘플 실행을 사용하여 제거해야한다는 결론을 내 인도~
user12205

@ace "37"예를 들어, 초기 입력은 string 이므로 연산 "37" & 1(중위)은 설정 작업입니다. ~전면 정수에 입력을 변환한다.
primo

여기 내 테스트 않았다 golfscript.apphb.com/...는 이이 통역이 잘못된 의미합니까? (죄송합니다. 저는 golfscript에 대해 전혀 몰랐습니다)
user12205

2
통역사는 정확합니다. 정수 값 10을 스택으로 푸시했기 때문에 평가할 필요가 없습니다. 그러나에서 읽을 때 stdin입력은 문자열이됩니다 ( test here ). 문제 설명은 또한 입력이 문자열임을 명시 적으로 나타냅니다.
primo

12

자바 스크립트, 46

for(x=prompt(o='');x;x>>>=1)o=(x&1)+o;alert(o)

롤, 나는 4 문자 연산자 ( >>>=)가 존재 한다는 것을 몰랐다 ! +1 (또한 ​​콘솔에서 실행하면 마지막 9자를 저장할 수 있습니다.)
Doorknob

1
4 문자가 아니며 두 연산자입니다. >>>는 0으로 채워지는 비트 오른쪽 시프트이며 할당이 뒤 따릅니다. : 시도 x=8; x>>>=1; x;하고 x=8; x>>>1; x;, 첫 번째 경우에, x의 값이 변경되었습니다 - 두 번째로는 그렇지 않았습니다.
Graham Charles

3
@GrahamCharles >>>=단일 연산자 입니다.
primo

잘보세요! 감사합니다, @primo ... 매일 무언가를 배웁니다!
Graham Charles

2
@ComFreek 이것은 숫자의 순서를 바꾸는 것입니다
복사

4

Brainf * ck, 98 77

분명히 이것은 승리의 목적이 아니지만 brainfk 솔루션이 없다면 경쟁은 무엇입니까?

++++[>++++<-]>>,<[->>++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]++++++[->++++++++<]>.[-]>[-<<<+>>>]<<<<]

brainfk는 8 비트 정수와 음수 만 처리 할 수 ​​있으므로 규칙을 완전히 준수하지는 않지만 이길 수는 없었습니다.

인터프리터가 지원하는 경우 실제로 16 비트 입력에서 작동합니다

심지어 ASCII 값으로 출력했습니다.

주석이 달린 코드는 다음과 같습니다.

++[>++++<-]                       preload 8 onto cell 1
>>,<                                input into cell 2
[-                                  iterate over cell 1
    >>++<                               put 2 in cell 3
    [->-[>+>>]>[+[-<+>]>+>>]<<<<<]      division algorithm: converts {n d} into {0 d_minus_n%d n%d n/d}
    >[-]++++++[->++++++++<]>           clears cell 4 and puts 48(ascii of 0) into cell 5
    .[-]                                output n%2 and clear it (the bit)
    >[-<<<+>>>]                         bring n/2 into cell 2 (to be used for division in next iteration)
<<<<]                               end iterate

더 짧은 알고리즘 (77) :

+>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+>+>+>+>+>+<<<<<<<<]>[.>]

이것은 8 비트 정수만 처리 할 수 ​​있습니다.

이 알고리즘은 실제로 매우 짧은 이진 카운터를 사용하여 작동합니다 (한 증분은 >[->]++[-<+]-<-비트를 배치합니다. 문제는 모든 비트를 인쇄하는 것이 어렵다는 것입니다)

마지막 알고리즘은 바이트를 희생하여 임의의 수의 비트에 맞도록 조정될 수 있습니다. N 비트 정수를 처리 할 수 ​​있으려면 인코딩에 53 + 3 * N 바이트가 필요합니다.

예 :

(1 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+<]>[.>]
(2 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+<<]>[.>]
(3 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+<<<]>[.>]
etc

3

필수 APL 답변-21 22

"01"[1+2|⌊⎕÷2⋆⊖0,⍳15]

예 :

      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 0
0000000000000000
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 13
0000000000001101
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 9999
0010011100001111
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: -3
1111111111111101
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 32767
0111111111111111

을 사용 ⎕IO←0하고 문자열 대신 비트 배열을 반환하면 거의 50 %까지 줄일 수 있습니다 2|⌊⎕÷2*⊖⍳16.
Adám

3

튜링 머신 코드, 272 바이트

평소와 같이 여기에 정의 된 규칙 테이블 구문을 사용하고 있습니다. 해당 사이트에서 또는 이 Java 구현을 사용하여 테스트 할 수 있습니다 .

많은 코드가 여기의 10 진수 변환기 에서 복사 됩니다.

0 * * l B
B * * l C
C * 0 r D
D * * r E
E * * r A
A _ * l 1
A * * r *
1 0 9 l 1
1 1 0 l 2
1 2 1 l 2
1 3 2 l 2
1 4 3 l 2
1 5 4 l 2
1 6 5 l 2
1 7 6 l 2
1 8 7 l 2
1 9 8 l 2
1 _ * r Y
Y * * * X
X * _ r X
X _ _ * halt
2 * * l 2
2 _ _ l 3
3 * 1 r 4
3 1 0 l 3
4 * * r 4
4 _ _ r A

베이스 2의 0부터 카운트하는 동안베이스 10의 입력에서 카운트 다운합니다. 0을 줄이면 입력 블록이 지워지고 종료됩니다.


2

자바 스크립트 59

o='';i=parseInt(prompt());do{o=(i&1)+o}while(i>>=1)alert(o)

+x대신 사용할 수 있습니다parseInt(x)
Cyoce

2

펄, 44

이것은 나의 첫번째 Perl 프로그램이므로, 쉽게 넘어 질 수 있다면 용서해주십시오. 편집 : 내 대답에서 7자를 빼앗아 주셔서 감사합니다 @primo.

$x=<>;do{@s=($x&1,@s)}while($x>>=1);print@s

$x=<>;do{push@s,$x&1}while($x>>=1);print reverse@s

논리는 본질적으로 이전 C 솔루션과 동일합니다.

또한 64 비트를 사용합니다.


1
reverse배열을 거꾸로 구성하여를 저장할 수 있습니다 @s=($x&1,@s).
primo

1
대회가 끝났으므로, 내가 찾은 최고는 34 : $\=$_%2 .$\while$_=$_>>1||<>;print였습니다. 또는 명령 행 옵션이 각각 1 바이트를 계산하면 27 : 1while$\=$_%2 .$\,$_>>=1}{using -p.
primo

2

자바 스크립트 -56 48 및 36 28 자

  • 음수에는 작동하지 않습니다.

8자를 면도 해 주신 @Blender에게 감사드립니다.

이 양식은 48자를 입력하고 출력을 표시합니다.

x=prompt();for(a="";x;x=~~(x/2))a=x%2+a;alert(a)

변수에 변수를 넣는 명령 만 필요하면 변수 a의 이진 형식 x이 필요 x하며 부작용으로 값을 파괴하지 않아도 됩니다. 여기에는 28자가 있습니다.

for(a="";x;x=~~(x/2))a=x%2+a

1
당신은 대체 할 수 Math.floor~~숫자의 범위는 작으로.
Blender

@ 블렌더 감사합니다, 나는 어떤 방법이 있다는 것을 알았습니다.
Victor Stafusa

@ 빅터 나는 자바 스크립트를 모른다. 그래서 내가 잘못했을 수도 있지만 결국에는 a=x%2+a이것이 단축 될 수 있다고 말했을 때 a+=x%2? 내가 아는 모든 언어로 작동합니다.
Albert Renshaw

@AlbertRenshaw 아니요, 이것은 a=a+x%2같지만 +문자열 연결을위한 것입니다. 즉, 귀하의 제안은 숫자를 역순으로 나타냅니다.
Victor Stafusa

@ 빅터 아! 감사합니다!
Albert Renshaw

2

파이썬 -61 60 자

x=input();print"".join("01"[x>>i&1]for i in range(15,-1,-1))

2
print와 사이의 공백을 제거 할 수 있습니다 "".
Blender

난 그냥 :) 같은 일을 제안하고 있었다 @Blender
알버트 렌쇼

@ 블렌더 하 사실, 심지어 통지하지 않았다. 끝난!
C0deH4cker

명령 행에서 호출 print하면 결과를 자동으로 반환하므로 따로 남겨 둘 수 있습니다
paul.oderso

2

C, 55 자

여분의 선행 0을 인쇄합니다 (2 바이트를 위해).
내부의 재귀 printf는 인쇄 순서를 반대로하여 알고리즘은 오른쪽에서 왼쪽으로 비트를 추출하지만 왼쪽에서 오른쪽으로 인쇄합니다.

편집 : putchar대신을 사용하여 문자를 저장했습니다 printf.

f(x){(x*=x<0?-printf("-"):1)&&f(x/2);putchar(48+x%2);}

2

Dyalog APL , 11 바이트

2|⌊⎕÷2*⌽⍳16

2|입력
의 반올림 값을 각각 2로 나눈 값을 반으로 나눈 나머지 는

÷
2*
⍳16 {0, 1, 2, ..., 15}

⎕IO←0많은 시스템에서 기본값이 필요합니다 .

TryAPL 온라인!


1

C, 81

char b[17];i=15;main(x){scanf("%d",&x);while(i+1)b[i--]=(x&1)+48,x>>=1;puts(b);}

출력은 엄격하게 16 비트입니다 (패딩 제로 포함)


1

애플리케이션 스크립트 + Google 스프레드 시트를, 147 (144) 121 바이트

스크립트

function j(decNumb){var str='';do{str=String(decNumb%2)+str;decNumb=decNumb/2|0;}while(decNumb>=1);return parseInt(str);}

시트

=j(b1)

ZygD에 의해이 스크립트 의 수정 된 버전 .


공백을 제거 할 수 있습니까?
NoOneIsHere6

1

하스켈, 66 바이트

c 0=0
c n=c(div n 2)*10+mod n 2
b('-':r)='-':b r
b r=show.c.read$r

로 전화 하거나 전체 프로그램을 b "-1023"추가 main=interact b하거나 Ideon에서 사용해보십시오.

c양의 정수에 대한 변환을 수행합니다.
b r=show.c.read$r문자열을 숫자로 변환하고 적용 c하고 다시 문자열로 변환합니다.
b('-':r)='-':b r가능한 행간을 제거 -하고 결과에 다시 추가합니다.


1

PowerShell, 59 87 82 70 바이트

음수 지원을위한 +28 바이트
@ASCII 전용으로 -12 바이트

param($d)$m=$d-lt0;while($d){$n="01"[$d%2]+$n;$d=($d-$d%2)/2}'-'*$m+$n

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

이 코드 에서 채택되었습니다 . 명령 줄 매개 변수를 통해 입력을 -d받습니다.


부호가있는 숫자는 어떻습니까?
mazzy



oh wait 70
ASCII-only

1

APL (NARS), 17 자, 34 바이트

{2∣⌊⍵÷2*(⍺-1)..0}

그것은 비트 길이에 대한 매개 변수를 추가 할 수있는 방식으로 Adam 응답 /codegolf//a/90107 을 복사하고 수정 하며이 기능에 대한 ⎕IO (여기서는 ⎕IO = 1)입니다 중요하지 않다 ...

  f←{2∣⌊⍵÷2*(⍺-1)..0}
  16 f 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 
  32 f 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 
  32 f ¯1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
  16 f ¯1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
  64 f ¯12345678
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 

이 방법으로 비트 수를 쉽게 처리 할 수 ​​있습니다 (마지막 결과가 옳 아야한다는 것을 씹었습니다)


0

스몰 토크 (Smalltalk / X), 63/78

첫 번째 버전은 중간 문자열 (78)을 만듭니다.

t:=Number readFrom:Stdin.
((15to:1by:-1)collect:[:i|$0+(t>>i&1)]as:String)print

실제로는 문자열을 만들 필요가 없습니다. 그냥 문자를 출력하십시오 (63).

t:=Number readFrom:Stdin.
15to:1by:-1 do:[:i|($0+(t>>i&1))print]

mhmh-숫자를 읽는 더 짧은 방법이 있습니까?


0

Python 3.x : 65 자

b=lambda n:n<2 and'01'[n]or b(n//2)+b(n%2);print(b(int(input())))

0

배쉬, 44

f=b+=n/2**e%2*10**e,2**e++/n?f=b:f;echo $[f]

환경 변수를 통해 입력 값을 스크립트에 전달하십시오 n. 이진 결과의 10 진수 표현은 초과 할 수 없습니다LONG_MAX .

이것은 또한 호환되어야 ksh93하고 zsh경우 be초기화되고 0적절한 팽창 연산이 사용된다.


1
나는 이것이 n이미 정의 되어 있다고 가정 하고 스 니펫으로 만들기 때문에 이것이 유효하다고 생각하지 않습니다 . 명령 행 인수로 입력을 취하고 n스크립트에서 이를 설정 하여 해결할 수 있습니다 .
스파게티

@quartata 쉘의 수학 문맥에서 변수는 암시 적으로 0입니다. 골프의 목적 n=127 sh -c '...'보다 수행하는 것이 더 합리적 sh -c 'n=$1 ...' _ 127입니다. 이 경우 값을 전달하는 완벽한 방법이므로 둘 중 하나를 선호 할 이유가 없습니다.
ormaaj

0

C #-104

string p(int d){var r="";long i=1;while(r.Length<=64){var g=d&i;r=(g!=0)? "1"+r:"0"+r;i=i<<1;}return r;}

이 방법은 10 진수를 2 진수로 변환합니다. 64 비트에서 비트로 합니다.

Linqpad에서 위의 방법을 실행할 때-rr = p (-32768); rr. 덤프 ();

산출: 01111111111111111111111111111111111111111111111111000000000000000


스펙은 "입력 문자열"을 요구합니다. 이 메소드는을 허용하는 것 같습니다 int.
Poke

0

자바 8, 80 71 바이트

n->{String r="";for(int i=n<0?-n:n;i>0;i/=2)r=i%2+r;return n==0?"0":r;}

주석의 규칙으로 인해 -9 바이트. 음수 10 진수 입력은 양수 / 절대베이스 -2 값을 출력으로 표시 할 수 있습니다.

설명:

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

n->{                   // Method with integer parameter and String return-type
  String r="";         //  Result-String, starting empty
  for(int i=n<0?-n:n;  //  Start `i` at the absolute (non-negative) value of the input
      i>0;             //  Loop as long as `i` is not 0
      i/=2)            //    After every iteration: integer-divide `i` by 2
    r=i%2+r;           //   Prepend the result with `i` modulo-2
  return n==0?         //  If the input is 0:
          "0"          //   Return literal "0"
         :             //  Else:
          r;           //   Return the result-String


0

작은 기본 , 133 바이트

TextWindow콘솔 에서 입력하고 콘솔로 출력하는 스크립트입니다 .

n=TextWindow.Read()
While n>0
c=c+1
x[c]=Math.Remainder(n,2)
n=Math.Floor(n/2)
EndWhile
For i=0To c-1
TextWindow.Write(x[c-i])
EndFor

SmallBasic.com에서 사용해보십시오 Silverlight가 필요하므로 IE에서 실행해야합니다.

I / O는 검은 색 콘솔에서 가져 오거나 제공됩니다.

@Neil 덕분에 -22 바이트


사용할 수 없습니까 For i=0To c-1?
Neil

@ 닐-나는 절대적으로 할 수 있습니다. 대단하다!
Taylor Scott

0

MATL , 15 17 바이트

t0<?16Ww+]`2&\t]x

MATL Online에서 사용해보십시오

TIO

(음수의 선행 0을 제거하는 +2 바이트, 부호 비트는 첫 번째 비트 여야합니다.)

MATL Online의 출력은 상향식으로 읽습니다 (MSB는 아래쪽에 있음).

주요 부분은 매우 간단합니다. `2&\t = 값이 0보다 큰 동안 2로 나누고 나머지를 누적하십시오.

2216=6553616W




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