Tamsayılardan değişken sayıda bite iki yönlü eşleme


11

Değişken bit sayısı, 0 veya daha fazla bitlik bir dizidir. Yani [0, 1]bit değişken sayıdır, ama böyledir [].

Negatif olmayan bir tamsayı verildiğinde, her tamsayı bir dizi ile bire bir (iki yönlü) eşleme olacak şekilde değişken sayıda bit döndüren bir işlev veya program yazın.

Bu tür eşlemelerin sonsuz bir miktarı vardır, istediğiniz gibi bir tane oluşturmakta özgürsünüz, ancak bire bir olmalıdır . Eşlemeniz isteğe bağlı boyutta bir tamsayı için kavramsal olarak bire bir olmalıdır , ancak tercih ettiğiniz dilde (örn . C'ler) türlerin sayısal sınırları nedeniyle uygulamanız büyük tamsayılar için başarısız olursa sorun olmaz int.

Bire bir eşleme olmayan şeyin bir örneği olarak, tamsayının ikili rakamlarını listelemek basittir. Böyle bir sistemde, 5 olur [1, 0, 1](ya da 0b101), ancak, çünkü bire bir değil 0b0101ya [0, 1, 0, 1]da 5 anlamına gelir.

Bir tamsayıyı atlarsa (örneğin 5 için işe yaramazsa) bir eşlemenin bire bir olmadığı oldukça açık olmalıdır, ancak değişken bir bit dizisini atlamanın da bir tane olmadığını açıkça belirtmek isterim. -birine. Dahil olmak üzere olası her değişken bit dizisine eşlemelisiniz [].


Bayt cinsinden en kısa kod kazanır.


0 ve 1'lerden oluşan bir dize döndürebilir miyiz?
xnor

@xnor Evet, 0 sn ve 1 sn'lik bir dize iyidir.
orlp

Yanıtlar:


4

Jöle, 3 bayt

‘BḊ

XNOR aynı fikir: eşler 0 1 2 3 4 ...için [] [0] [1] [0 0] [0 1] ...; kod temelde increment → binary → remove first.

Çevrimiçi deneyin .


10

Python, 20 bayt

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

Ölçek:

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

Bunu yapmak lambda n:bin(n+1)[3:]girişi artırır, ardından ilk sembolü kaldırılmış olarak ikili temsili alır ( [3:]önek 0biki karakter karakteri olduğu için). Herhangi bir pozitif sayı ikili değerde 1 ile başladığından, bu benzersiz bir şekilde ikili gösterim sağlar.

Bir bayt, ~nolumsuzlamayı elde etmek için bit tamamlayıcısı kullanılarak ve -(n+1)bir sembol daha keserek negatif işaretini kaldırarak kaydedilir.


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

2

Pyth, 5 bayt

t.BhQ

Sadece xnor'un cevabının Pyth'e çevirisi .

Qeval () 'd input (), honu artırır, .Bbir ikili dizgiye dönüştürür ve t"tail" i alır (ilk karakter hariç her şeydir).


2

Haskell, 41 38 30 29 bayt

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

Kullanım örneği: (l!!) 4-> "10".

Boş liste ile ilk öğe olarak başlayarak, listeden tembel bir şekilde yürüyün ve geçerli öğeyi önüne 0ve 1önüne ekleyin .

Düzenleme: @xnor 3 11 bayt kaydetti . Teşekkürler!


İlginç fikir. Yinelenen işlev yazılabilir[(0:),(1:)]<*>
xnor

@xnor: Oh, bana daha <*>önce hile yaptın , ama unuttum. Tekrar teşekkürler!
nimi

Ooh, tembel tüm listeyi tanımlayabilirsiniz: l=[]:[b:x|x<-l,b<-[0,1]];(l!!).
xnor

@xnor: Harika! Çok teşekkürler! Oh, dizelere geçmek bir bayt daha kazandırır.
nimi

[b:x|x<-l,b<-"01"]Bir ürün veya akraba haritasıyla ifade etmenin daha kısa bir yolu olması gerektiğini hissediyorum , ancak ürün ifadesi (:)<$>[0,1]<*>lyanlış sıraya giriyor, ilk önce her şeye 0 koyarak, asla 1'e ulaşmadığından liste sonsuz. Hiç fikrin var mı?
xnor



1

Haskell, 35 bayt

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

Haskell'in yerleşik bir ikili dosyası olmadığından, (ters çevrilmiş) dönüşüm manuel olarak yapılır. İlk 1'i kaldırmak için temel durum 1boş listeye dönüştü.

Düzenle: Yerine konjuge ederek bir bayt kaydetti +1.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.