Ánh xạ phỏng đoán từ số nguyên đến số bit thay đổi


11

Số bit thay đổi là một mảng từ 0 bit trở lên. [0, 1]Số bit thay đổi là vậy , nhưng cũng vậy [].

Viết một hàm hoặc chương trình, với một số nguyên không âm sẽ trả về một số bit khác nhau sao cho mỗi số nguyên có ánh xạ một-một (tính từ) với một mảng.

Có vô số ánh xạ như vậy, bạn có thể tự do xây dựng một bản đồ theo ý muốn, nhưng nó phải là một đối một. Ánh xạ của bạn về mặt khái niệm phải là một đối một cho một số nguyên có kích thước tùy ý, nhưng sẽ ổn nếu việc triển khai của bạn không thành công cho các số nguyên lớn do giới hạn số lượng của các loại trong ngôn ngữ ưa thích của bạn (ví dụ: C int).

Như một ví dụ về những gì không phải là ánh xạ một-một, chỉ đơn giản là liệt kê các chữ số nhị phân của số nguyên. Trong một hệ thống 5 như vậy trở thành [1, 0, 1](hoặc 0b101), nhưng nó không phải là một đối một, bởi vì 0b0101hoặc [0, 1, 0, 1]cũng có nghĩa là 5.

Một điều khá rõ ràng là ánh xạ không phải là một đối một nếu nó bỏ qua một số nguyên (ví dụ: nó không hoạt động trong 5), nhưng tôi muốn làm rõ rằng bỏ qua một mảng bit biến cũng không phải là một -đến một. Bạn phải ánh xạ tới mọi mảng bit biến có thể, bao gồm [].


Mã ngắn nhất trong byte thắng.


Chúng tôi có thể trả về một chuỗi 0 và 1 không?
xnor

@xnor Có, một chuỗi 0 và 1 là ổn.
orlp

Câu trả lời:


4

Thạch, 3 byte

‘BḊ

Ý tưởng tương tự như xnor: maps 0 1 2 3 4 ...to [] [0] [1] [0 0] [0 1] ...; mã là về cơ bản increment → binary → remove first.

Dùng thử trực tuyến .


10

Python, 20 byte

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

Kiểm tra:

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

Thực hiện lambda n:bin(n+1)[3:]tăng đầu vào, sau đó lấy biểu diễn nhị phân với ký hiệu đầu tiên được loại bỏ ( [3:]vì tiền tố 0blà hai ký tự ký tự). Vì bất kỳ số dương nào cũng bắt đầu bằng 1 trong nhị phân, nên số này duy nhất đưa ra biểu diễn nhị phân.

Thay vào đó, một byte được lưu bằng cách sử dụng phần bù bit ~nđể lấy phần phủ định -(n+1)và loại bỏ dấu âm bằng cách cắt thêm một ký hiệu.


1
Nghịch đảo : lambda s:int('1'+s,2)-1.
orlp

2

Bình thường, 5 byte

t.BhQ

Đơn giản chỉ là bản dịch câu trả lời của xnor thành Pyth.

Qlà eval () 'd input (), htăng nó, .Bchuyển đổi nó thành một chuỗi nhị phân và tlấy "đuôi" (là tất cả mọi thứ trừ ký tự đầu tiên).


2

Haskell, 41 38 30 29 byte

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

Ví dụ sử dụng: (l!!) 4-> "10".

Bắt đầu với danh sách trống là phần tử đầu tiên, hãy lướt qua danh sách và nối phần tử hiện tại với 01phía trước nó.

Chỉnh sửa: @xnor đã lưu 3 11 byte. Cảm ơn!


Ý tưởng thú vị. Hàm lặp có thể được viết[(0:),(1:)]<*>
xnor

@xnor: Ồ, bạn đã chỉ cho tôi <*>mẹo trước đây, nhưng tôi đã quên nó. Cảm ơn một lần nữa!
nimi

Ồ, bạn có thể xác định toàn bộ danh sách một cách lười biếng : l=[]:[b:x|x<-l,b<-[0,1]];(l!!).
xnor

@xnor: Tuyệt! Cảm ơn rất nhiều! Oh, chuyển sang chuỗi tiết kiệm thêm một byte.
nimi

Tôi cảm thấy nên có một số cách ngắn hơn để thể hiện [b:x|x<-l,b<-"01"]với một sản phẩm hoặc bản đồ concat, nhưng biểu thức sản phẩm (:)<$>[0,1]<*>lđi sai thứ tự, trước tiên phải trả trước 0 cho mọi thứ, không bao giờ nhận được 1 vì danh sách là vô hạn. Bạn có bất cứ ý tưởng?
xnor



1

Haskell, 35 byte

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

Haskell không có tích hợp nhị phân, vì vậy việc chuyển đổi (đảo ngược) được thực hiện thủ công. Để loại bỏ 1 ban đầu, trường hợp cơ sở đã 1chuyển đổi sang danh sách trống.

Chỉnh sửa: Đã lưu một byte bằng cách chia bởi +1thay vào đó.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.