무기한 크기 목록을 숫자로 매핑하십시오!


11

무한대를 연구하는 수학 분야에서, 유한 한 양의 셀 수있는 세트의 데카르트 곱도 셀 수 있음 이 잘 알려져 있습니다 .

당신의 임무는 이것을 구현하기 위해 두 개의 프로그램을 작성하는 것입니다. 하나는리스트에서 정수로, 하나는 정수에서리스트로 맵핑하는 것입니다.

함수는 형용적이고 결정 론적이어야합니다. 즉, 1항상 특정 목록에 2매핑되고 항상 다른 특정 목록에 매핑됩니다.

앞서 , 우리는 구성된 목록에 정수를 매핑 0하고 1.

그러나 이제 목록은 음수가 아닌 숫자로 구성됩니다.

명세서

  • 프로그램 / 기능, 합리적인 입출력 형식.
  • 맵핑 된 정수가 시작하는지 1또는 시작 하는지 0는 사용자가 선택하는 것입니다. 즉 , 맵핑 할 0필요가 없습니다.
  • 빈 배열 []은 인코딩해야합니다.
  • 입 / 출력은 모든베이스에있을 수 있습니다.
  • 두 기능간에 코드를 공유 할 수 있습니다.

채점

이것은 입니다. 최저 점수가 이깁니다.

점수는 두 프로그램 / 기능의 길이 합계 (바이트)입니다.


"그러나 이제 목록은 음수가 아닌 숫자로 구성됩니다."
Leaky Nun

분명히, 우리는 매핑하고 N^inf -> N있습니까?
Mego

@Mego N ^ inf는 계산할 수 없습니다. N ^ k 여기서 k는 유한 숫자입니다.
Leaky Nun

우리는 이것에 대해 이야기하고 있습니다.
Leaky Nun

1에서 시작하든 0에서 시작하든 선택하십시오. 단일 정수 및 목록의 정수에 적용됩니다.
Dennis

답변:


10

젤리 , 18 16 바이트

정수, 10 8 바이트로 나열

TṪạL;³ÆẸ

음이 아닌 정수 목록을 양의 정수로 매핑합니다. 온라인으로 사용해보십시오!

나열 할 정수, 8 바이트

ÆE©Ḣ0ẋ®;

양의 정수를 음이 아닌 정수 목록에 매핑합니다. 온라인으로 사용해보십시오!

배경

하자 P 0 , P 1 , P 2 , ⋯ 오름차순으로 소수의 순서합니다.

음이 아닌 정수 A : = [a 1 , ⋯, a n ] 의 각 목록에 대해 Ap 0 z (A) p 1 a 1 ⋯ p n a n에 매핑합니다 . 여기서 z (A)A의 후행 0입니다 .

위의지도를 간단하게 뒤집습니다. A의 양의 정수 K , 우리 고유 연속 프라임 파워의 곱으로 인수 분해 N P = 0 α 0 P 1 α 1 ⋯ P N α N , 여기서 α는 N > 0 , 다음과 같은 목록을 재구성 α [ 1 , ⋯, α N ] , 추가 α 0 제로.

작동 원리

정수로 나열

TṪạL;³ÆẸ  Main link. Argument: A (list of non-negative integers)

T         Yield all indices of A that correspond to truthy (i.e., non-zero) items.
 Ṫ        Tail; select the last truthy index.
          This returns 0 if the list is empty.
   L      Yield the length of A.
  ạ       Compute the absolute difference of the last truthy index and the length.
          This yields the amount of trailing zeroes of A.
    ;³    Prepend the difference to A.
      ÆẸ  Convert the list from prime exponents to integer.

나열 할 정수

ÆE©Ḣ0ẋ®;  Main link. Input: k (positive integer)

ÆE        Convert k to the list of its prime exponents.
  ©       Save the list of prime exponents in the register.
   Ḣ      Head; pop the first exponent.
          If the list is empty, this yields 0.
    0ẋ    Construct a list of that many zeroes.
      ®;  Concatenate the popped list of exponents with the list of zeroes.       

출력 예

처음 100 개의 양의 정수는 다음 목록에 매핑됩니다.

  1: []
  2: [0]
  3: [1]
  4: [0, 0]
  5: [0, 1]
  6: [1, 0]
  7: [0, 0, 1]
  8: [0, 0, 0]
  9: [2]
 10: [0, 1, 0]
 11: [0, 0, 0, 1]
 12: [1, 0, 0]
 13: [0, 0, 0, 0, 1]
 14: [0, 0, 1, 0]
 15: [1, 1]
 16: [0, 0, 0, 0]
 17: [0, 0, 0, 0, 0, 1]
 18: [2, 0]
 19: [0, 0, 0, 0, 0, 0, 1]
 20: [0, 1, 0, 0]
 21: [1, 0, 1]
 22: [0, 0, 0, 1, 0]
 23: [0, 0, 0, 0, 0, 0, 0, 1]
 24: [1, 0, 0, 0]
 25: [0, 2]
 26: [0, 0, 0, 0, 1, 0]
 27: [3]
 28: [0, 0, 1, 0, 0]
 29: [0, 0, 0, 0, 0, 0, 0, 0, 1]
 30: [1, 1, 0]
 31: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 32: [0, 0, 0, 0, 0]
 33: [1, 0, 0, 1]
 34: [0, 0, 0, 0, 0, 1, 0]
 35: [0, 1, 1]
 36: [2, 0, 0]
 37: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 38: [0, 0, 0, 0, 0, 0, 1, 0]
 39: [1, 0, 0, 0, 1]
 40: [0, 1, 0, 0, 0]
 41: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 42: [1, 0, 1, 0]
 43: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 44: [0, 0, 0, 1, 0, 0]
 45: [2, 1]
 46: [0, 0, 0, 0, 0, 0, 0, 1, 0]
 47: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 48: [1, 0, 0, 0, 0]
 49: [0, 0, 2]
 50: [0, 2, 0]
 51: [1, 0, 0, 0, 0, 1]
 52: [0, 0, 0, 0, 1, 0, 0]
 53: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 54: [3, 0]
 55: [0, 1, 0, 1]
 56: [0, 0, 1, 0, 0, 0]
 57: [1, 0, 0, 0, 0, 0, 1]
 58: [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
 59: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 60: [1, 1, 0, 0]
 61: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 62: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
 63: [2, 0, 1]
 64: [0, 0, 0, 0, 0, 0]
 65: [0, 1, 0, 0, 1]
 66: [1, 0, 0, 1, 0]
 67: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 68: [0, 0, 0, 0, 0, 1, 0, 0]
 69: [1, 0, 0, 0, 0, 0, 0, 1]
 70: [0, 1, 1, 0]
 71: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 72: [2, 0, 0, 0]
 73: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 74: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
 75: [1, 2]
 76: [0, 0, 0, 0, 0, 0, 1, 0, 0]
 77: [0, 0, 1, 1]
 78: [1, 0, 0, 0, 1, 0]
 79: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 80: [0, 1, 0, 0, 0, 0]
 81: [4]
 82: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
 83: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 84: [1, 0, 1, 0, 0]
 85: [0, 1, 0, 0, 0, 1]
 86: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
 87: [1, 0, 0, 0, 0, 0, 0, 0, 1]
 88: [0, 0, 0, 1, 0, 0, 0]
 89: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 90: [2, 1, 0]
 91: [0, 0, 1, 0, 1]
 92: [0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
 93: [1, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 94: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
 95: [0, 1, 0, 0, 0, 0, 1]
 96: [1, 0, 0, 0, 0, 0]
 97: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
 98: [0, 0, 2, 0]
 99: [2, 0, 0, 1]
100: [0, 2, 0, 0]

훌륭합니다.
Leaky Nun

3

파이썬 2, 88 바이트

d=lambda n:map(len,bin(n).split('1')[1:])
e=lambda l:int('1'.join(a*'0'for a in[2]+l),2)

데모:

>>> for i in range(33):
...     print e(d(i)), d(i)
... 
0 []
1 [0]
2 [1]
3 [0, 0]
4 [2]
5 [1, 0]
6 [0, 1]
7 [0, 0, 0]
8 [3]
9 [2, 0]
10 [1, 1]
11 [1, 0, 0]
12 [0, 2]
13 [0, 1, 0]
14 [0, 0, 1]
15 [0, 0, 0, 0]
16 [4]
17 [3, 0]
18 [2, 1]
19 [2, 0, 0]
20 [1, 2]
21 [1, 1, 0]
22 [1, 0, 1]
23 [1, 0, 0, 0]
24 [0, 3]
25 [0, 2, 0]
26 [0, 1, 1]
27 [0, 1, 0, 0]
28 [0, 0, 2]
29 [0, 0, 1, 0]
30 [0, 0, 0, 1]
31 [0, 0, 0, 0, 0]
32 [5]

파이썬 2, 130 바이트

다음은 출력의 비트 길이가 지수가 아닌 입력의 비트 길이에 선형 인보다 "효율적인"솔루션입니다.

def d(n):m=-(n^-n);return d(n/m/m)+[n/m%m+m-2]if n else[]
e=lambda l:int('0'+''.join(bin(2*a+5<<len(bin(a+2))-4)[3:]for a in l),2)

내 솔루션 과 동일한 알고리즘을 사용합니다 :)
Leaky Nun

@ KennyLau : 나는 당신의 해결책을 보지 못했습니다. 비슷해 보이지만 동일하지 않습니다 (0과 1이 바)). 그리고 당신은 빈 목록을 왕복하지 못합니다.
Anders Kaseorg

알림 주셔서 감사합니다.
Leaky Nun

그건 그렇고, 출력은 모든 베이스 에 있을 수 있다고 말했습니다 .
Leaky Nun

함수간에 코드를 공유 할 수 e있기 때문에 d:에 반대가 될 수있는 것처럼 보입니다 e=lambda l,i=0:l!=d(i)and-~e(l,i+1).
xnor

1

파이썬 2, 204202 바이트

p=lambda x,y:(2*y+1<<x)-1
u=lambda n,x=0:-~n%2<1and u(-~n//2-1,x+1)or[x,n//2]
e=lambda l:l and-~reduce(p,l,len(l)-1)or 0
def d(n):
 if n<1:return[]
 r=[];n,l=u(n-1);exec"n,e=u(n);r=[e]+r;"*l;return[n]+r

목록 길이 앞에 Z + x Z + <-> Z + bijection을 반복적으로 적용하여 작동합니다.

0: []
1: [0]
2: [1]
3: [0, 0]
4: [2]
5: [0, 0, 0]
6: [1, 0]
7: [0, 0, 0, 0]
8: [3]
9: [0, 0, 0, 0, 0]
10: [1, 0, 0]
11: [0, 0, 0, 0, 0, 0]
12: [0, 1]
13: [0, 0, 0, 0, 0, 0, 0]
14: [1, 0, 0, 0]
15: [0, 0, 0, 0, 0, 0, 0, 0]
16: [4]
17: [0, 0, 0, 0, 0, 0, 0, 0, 0]
18: [1, 0, 0, 0, 0]
19: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
20: [0, 0, 1]
21: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
22: [1, 0, 0, 0, 0, 0]
23: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
24: [2, 0]
25: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
26: [1, 0, 0, 0, 0, 0, 0]
27: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
28: [0, 0, 0, 1]
29: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
30: [1, 0, 0, 0, 0, 0, 0, 0]
31: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

한 가지 질문 : "정수로 나열"함수는 어떤 함수이고 "정수로 나열"함수는 어느 것입니까?
user48538

@ zyabin101 e은 정수로 나열되고 나열 할 정수 d입니다 (인코딩 / 디코딩).
orlp

나는이 해결책을 좋아한다.
Leaky Nun

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.