정수에서 가변 비트 수로의 형용사 매핑


11

가변 비트 수는 0 이상의 비트 배열입니다. 따라서 [0, 1]가변 개수의 비트들이지만 그렇다 [].

음이 아닌 정수가 주어지면 모든 정수가 배열과 일대일 (이승) 매핑을 갖도록 가변 비트 수를 리턴하는 함수 또는 프로그램을 작성하십시오.

그러한 매핑에는 무한한 양이 있으며 원하는대로 자유롭게 구성 할 수 있지만 일대일 이어야합니다 . 임의로 크기가 지정된 정수의 경우 개념적 으로 일대일로 매핑해야 하지만 원하는 언어의 유형 제한 (예 : C 's ) 으로 인해 큰 정수로 구현 하지 못하면 괜찮습니다 int.

일대일 매핑 이 아닌 것의 예로 , 정수의 이진수를 간단히 나열하는 것입니다. 이러한 시스템에서 (5)가된다 [1, 0, 1](또는 0b101)하지만 있기 때문에 일대일 아니다 0b0101또는 [0, 1, 0, 1]도 5를 의미한다.

정수를 건너 뛰면 매핑이 일대일이 아니라는 것이 분명해야합니다 (예 : 5에서는 작동하지 않음). 변수 비트 배열을 건너 뛰는 것도 하나가 아니라는 것을 분명히하고 싶습니다. 일대일. 를 포함하여 가능한 모든 가변 비트 배열에 매핑해야합니다 [].


바이트 단위의 최단 코드가 이깁니다.


0과 1의 문자열을 반환 할 수 있습니까?
xnor

@xnor 예, 0과 1의 문자열은 괜찮습니다.
orlp 2019

답변:


4

젤리, 3 바이트

‘BḊ

XNOR과 동일 아이디어는 :지도 0 1 2 3 4 ...[] [0] [1] [0 0] [0 1] ...; 코드는 기본적으로 increment → binary → remove first입니다.

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


10

파이썬, 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:]접두사 0b는 두 문자 문자 이므로 ). 양수는 이진수로 1로 시작하므로 이진 표현을 고유하게 제공합니다.

바이트 보완 대신 비트 보완 ~n을 사용하여 부정 -(n+1)을 저장하고 하나 이상의 기호를 잘라내어 음수 부호를 제거 하여 바이트를 저장합니다 .


1
역함 : lambda s:int('1'+s,2)-1.
orlp 2019

2

Pyth, 5 바이트

t.BhQ

xnor의 답변 을 Pyth로 번역 한 것입니다 .

Qeval () 'd input (), h증가, .B이진 문자열로 변환 t하고 "꼬리"(첫 번째 문자를 제외한 모든 것)를 사용합니다.


2

하스켈, 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"]제품이나 concat-map 으로 표현 하는 더 짧은 방법이 있어야한다고 생각 하지만 제품 표현 (:)<$>[0,1]<*>l은 잘못된 순서로 진행됩니다. 먼저 0을 모든 것에 추가하고 목록이 무한하므로 1이되지 않습니다. 당신은 어떤 아이디어가 있습니까?
xnor



1

하스켈, 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.