整数から可変ビット数への全単射マッピング


11

可変ビット数は、0ビット以上の配列です。だから、[0, 1]可変ビット数があるが、そうです[]

すべての整数が配列と1対1(全単射)でマッピングされるように、負でない整数が可変ビット数を返す関数またはプログラムを作成します。

そのようなマッピングは無限にあり、自由に作成できますが、1対1 でなければなりません。マッピングは概念的に任意のサイズの整数に対して1対1である必要がありますが、優先言語(Cなど)の型の数値制限のために大きな整数に対して実装が失敗しても問題ありませんint

1対1マッピングではないものの例として、整数の2進数をリストするだけです。このようなシステムでは5となる[1, 0, 1](又は0b101)、しかしので、一対一ではない0b0101か、[0, 1, 0, 1]また5を意味します。

整数をスキップするとマッピングが1対1ではないことはかなり明白なはずです(たとえば、5では機能しません)が、可変ビット配列のスキップも1ではないことを明確にしたいと思います一対一。を含むすべての可能な可変ビット配列にマップする必要があります[]


バイト単位の最短コードが優先されます。


0と1の文字列を返すことができますか?
xnor

@xnorはい、0と1の文字列で問題ありません。
orlp

回答:



10

Python、20バイト

lambda n:bin(~n)[4:]

テスト:

>> [bin(~n)[4:] for n in range(16)]
['', '0', '1', '00', '01', '10', '11', '000', '001', '010', '011', '100', '101', '110', '111', '0000']

アウトドアlambda n:bin(n+1)[3:](インクリメント入力を除去最初のシンボルとのバイナリ表現をとる[3:]プレフィックスがあるため0b2つの文字の文字です)。正の数は2進数で1から始まるため、これは一意に2進数表現を与えます。

代わりにビット補数~nを使用して否定を取得し、-(n+1)もう1つのシンボルを切り捨てることによって負の符号を削除することにより、バイトが保存されます。


1
逆:lambda s:int('1'+s,2)-1
orlp

2

Pyth、5バイト

t.BhQ

xnorの答えをPythに翻訳しただけです。

Qeval() 'd input()であり、hそれをインクリメント.Bし、バイナリ文字列に変換しt、「テール」(最初の文字以外のすべて)を取ります。


2

Haskell、41 38 30 29バイト

l="":[b:x|x<-l,b<-"01"]
(l!!)

使用例:(l!!) 4-> "10"

最初の要素として空のリストから開始し、リストをいい加減に歩くとして現在の要素を追加0し、と1その前に。

編集:@xnorは3 11バイトを保存しました。ありがとう!


面白いアイデア。反復関数は書くことができます[(0:),(1:)]<*>
-xnor

@xnor:ああ、あなたは<*>以前にトリックを見せてくれたが、私はそれを忘れていた。再度、感謝します!
-nimi

ああ、リスト全体を遅延的に定義できます:l=[]:[b:x|x<-l,b<-[0,1]];(l!!)
-xnor

@xnor:すばらしい!どうもありがとう!ああ、文字列に切り替えるともう1バイト節約できます。
nimi

[b:x|x<-l,b<-"01"]製品または連結マップで表現(:)<$>[0,1]<*>lするためのいくつかの短い方法があるはずだと思いますが、製品の表現は間違った順序になり、最初にすべてに0を追加します。あなたはなにか考えはありますか?
xnor



1

Haskell、35バイト

h 1=[]
h n=mod n 2:h(div n 2)
h.(+1)

Haskellにはバイナリが組み込まれていないため、(逆の)変換は手動で行われます。最初の1を削除するには、ベースケースが1空のリストに変換されます。

編集:+1代わりに活用してバイトを保存しました。

h 0=[]
h m=1-mod m 2:h(div(m+1)2-1)

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