組み込みのベース変換なしでベース10からベース2に変換します


16

背景

事前に作成されたベース変換関数を使用せずに、ベース10の数値をベース2に変換する割り当てが与えられました。インポートされたライブラリも使用できません。

問題点

入力文字列を基数10(10進数)から基数2(バイナリ)に変換します。事前に作成された基本変換コード/関数/メソッド、またはインポートされたライブラリを使用することはできません。これはであるため、バイト単位の最短回答が優先されます。

入力は-32768〜32767のいずれかになります(コードに符号バイト処理を含める)


3
Q:「符号バイト処理」とはどういう意味ですか-負の数に対して「-xxxx」を出力しますか?それから私たちの何人かは間違っています。私、-1に対して「11 ... 11」を出力したため(別名符号なし)
blabla999 14

サインバイトの取り扱い-署名済みの変数コントロールのMSB彼らは否定している場合
TheDoctor

1
確かに、記号「-」の後に大きさを続けて印刷する必要がありますか?
blabla999

@ blabla999 -いいえ、そうでない
TheDoctor

3
the MSB of signed variables controls if they are negative-これは符号ビットのように聞こえ-32768..32767ますが、範囲が示すように、2の補数が必要です。あなたはどちらを望みますか?..
mniip 14

回答:


4

GolfScript-17バイト

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

組み込みよりも冗長ではありません~2base


1
私はgolfscriptを知りませんが、いくつかのサンプルの実行には、削除すべきであるという結論に私を導く~
user12205

@aceたとえば、最初の入力は文字列"37"であるため、操作"37" & 1(中置)は集合ごとの操作です。~フロントでは、整数への入力に変換します。
プリモ14

ここでテストを行いましたgolfscript.apphb.com / ...これは、このインタープリターが正しくないということですか?(申し訳ありませんが、私は本当にgolfscriptについて何も知らない)
user12205

2
通訳は正しいです。整数値10をスタックにプッシュしたので、評価する必要はありません。ただし、から読み取る場合stdin、入力は文字列になります(ここでテストします)。問題の説明には、入力が文字列であることも明示的に記載されています。
primo 14

12

JavaScript、46

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

笑、4文字の演算子(>>>=)が存在することすら知りませんでした!+1(また、コンソールで実行すると、最後の9文字を保存できます。)
ドアノブ

1
これは4文字ではなく、2つの演算子です。>>>は、0で埋められたビット単位の右シフトで、その後に割り当てが続きます。:試みるx=8; x>>>=1; x;x=8; x>>>1; x;、最初のケースでは、xの値が変更されました- 第二に、そうではありません。
グラハムチャールズ14

3
@GrahamCharles >>>=単一の演算子です。
primo 14

それを見て!ありがとう、@ primo ...あなたは毎日何かを学びます!
グラハムチャールズ14

2
@ComFreek数字の順序が逆になる
コピー

4

Brainf * ck、98 77

明らかにこれは勝つためのものではありませんが、brainfkソリューションがなければ競争はどうなりますか

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

Brainfkは8ビット整数しか処理できず、ネガも処理できないため、ルールを完全に順守しているわけではありませんが、勝つためにそれを行ったことはありません。

インタープリターがサポートしている場合、これは実際には16ビット入力に対して機能します

私もアスキー値で出力しました

注釈付きのコードは次のとおりです。

++[>++++<-]                       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ビット整数のみを処理できます。

このアルゴリズムは、実際には非常に短いバイナリカウンターを使用して動作します(1増分で>[->]++[-<+]-<-ビットを配置します。問題は、すべてのビットを印刷することが難しいことです

その最後のアルゴリズムは、バイトを犠牲にして任意のビット数に適合するように適合させることができます。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
アダム

3

チューリング機械コード、272バイト

いつものように、ここで定義されているルールテーブルの構文を使用しています。そのサイトでテストすることも、このJava実装を使用してテストすることもできます。

多くのコードは、10進数から16進数へのコンバーターからコピーされています。

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

ベース10の入力からカウントダウンし、ベース2の0からカウントアップします。ゼロをデクリメントすると、入力ブロックを消去して終了します。



2

Perl、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)
プリモ14

1
コンテストが終わったので、私が見つけた最高のものは34:$\=$_%2 .$\while$_=$_>>1||<>;printでした。または、コマンドラインオプションがそれぞれ1バイトをカウントする場合、27:1while$\=$_%2 .$\,$_>>=1}{を使用し-pます。
primo

2

Javascript- 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~~数値の範囲が小さいと、。
ブレンダー14

@ブレンダーありがとう
ビクターStafusa 14

@Victor私はjavascriptを知らないので、私は間違っているかもしれませんが、最後にa=x%2+aこれを短縮できると言うときはa+=x%2?私が知っているすべての言語で動作します。
アルバートレンショー14

@AlbertRenshawいいえ、これはと同じa=a+x%2です+が、文字列の連結用です。すなわち、あなたの提案は逆順で数字になります。
ビクターStafusa 14

@Victor Ah!ありがとうございました!
アルバートレンショー14

2

Python- 61 60文字

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

2
printとの間のスペースを取り除くことができます""
ブレンダー14

@ブレンダー私はちょうど同じことを提案しようとしていた:)
アルバートレンショー14

@Blender Ha本当、気づかなかった。できた!
C0deH4cker 14

あなたは、コマンドラインから呼び出す場合は、脇に残すことができるprint、それが自動的に結果を返すよう
paul.oderso

2

C、55文字

余分な先行ゼロを出力します(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のそれぞれの{0、1、2、...、15} のべき乗で割った値を半分にしたときの除算の余り

÷
2*
⍳16

⎕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

Appsスクリプト+ 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によるこのスクリプトの修正バージョン。


スペースを削除できますか?
NoOneIsHere

1

Haskell、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



オハイオ州70
ASCIIのみ

1

APL(NARS)、17文字、34バイト

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

これは、長さ のビットのパラメーターを追加できる方法での/codegolf//a/90107のAdam回答のコピーと変更であり、この関数のforIO(ここでは⎕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(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

これはまた、と互換性がなければならないksh93zshする場合beに初期化され0、適切な算術拡張が使用されます。


1
これはn既に定義されていると仮定し、スニペットにしているためこれが有効だとは思わない入力をコマンドライン引数として受け取りn、スクリプトでそれを設定することで修正できます。
spaghetto

@quartataシェルの数学コンテキストの変数は暗黙的にゼロです。ゴルフの目的のためにするよりも意味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.Dump();

出力: 01111111111111111111111111111111111111111111111111000000000000000


仕様では、「入力文字列」が必要です。このメソッドはを受け入れるようintです。
ポケ

0

Java 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

Small Basic、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-絶対にできます。素晴らしいキャッチ!
テイラースコット

0

MATL15 17バイト

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

MATL Onlineでお試しください

TIO

(負の数の先頭の0を削除する+2バイト、符号ビットが最初のビットである必要があります。)

MATL Onlineの出力は、ボトムアップで読む必要があります(MSBは下部にあります)。

主な部分は非常に単純です:`2&\t=値が0より大きい間、2で除算し、剰余を累積します。

負の数を処理し、それらに2の補数表現を与えることは扱いにくい部分でした。最後に「から減算2N"数値の2の補数を取得する方法。-32768までの値を処理するだけでよいため、負の数値の場合はコードが作成します 216=65536with 16Wは、それに入力を追加します(例:65536 +(-42))。これは、MATLABが正の数と見なすものを与えますが、入力の符号付きバイナリ表現を16ビット形式で表します。




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.