Ánh xạ một danh sách kích thước không xác định đến một số!


11

Người ta biết rằng, trong lĩnh vực Toán học nghiên cứu vô hạn, sản phẩm của Cartesian với bất kỳ số lượng hữu hạn nào của các bộ đếm được cũng có thể đếm được .

Nhiệm vụ của bạn là viết hai chương trình để thực hiện điều này, một để ánh xạ từ danh sách sang số nguyên, một để ánh xạ từ số nguyên sang danh sách.

Chức năng của bạn phải mang tính định nghĩa và xác định, nghĩa là 1sẽ luôn ánh xạ tới một danh sách nhất định và 2sẽ luôn ánh xạ tới một danh sách nhất định khác, v.v ...

Trước đó , chúng tôi đã ánh xạ các số nguyên vào một danh sách chỉ bao gồm 01.

Tuy nhiên, bây giờ danh sách sẽ bao gồm các số không âm.

Thông số kỹ thuật

  • Chương trình / chức năng, định dạng đầu vào / đầu ra hợp lý.
  • Cho dù các số nguyên được ánh xạ bắt đầu từ 1hoặc bắt đầu từ 0là lựa chọn của bạn, có nghĩa là 0không phải (nhưng có thể) ánh xạ tới bất cứ thứ gì.
  • Mảng trống []phải được mã hóa.
  • Đầu vào / đầu ra có thể ở bất kỳ cơ sở nào.
  • Chia sẻ mã giữa hai chức năng được cho phép .

Chấm điểm

Đây là . Điểm số thấp nhất chiến thắng.

Điểm là tổng độ dài (tính bằng byte) của hai chương trình / hàm.


"Tuy nhiên, bây giờ danh sách sẽ bao gồm các số không âm."
Nữ tu bị rò rỉ

Vì vậy, để rõ ràng, chúng tôi đang lập bản đồ N^inf -> N?
Mego

@Mego N ^ inf không thể đếm được. N ^ k trong đó k là số hữu hạn.
Nữ tu bị rò rỉ

Chúng tôi đã thảo luận về điều này trong trò chuyện.
Nữ tu bị rò rỉ

Cho dù nó bắt đầu từ 1 hoặc bắt đầu từ 0 là lựa chọn của bạn. Có áp dụng cho số nguyên duy nhất và cho các số nguyên trong danh sách.
Dennis

Câu trả lời:


10

Thạch , 18 16 byte

Liệt kê số nguyên, 10 8 byte

TṪạL;³ÆẸ

Bản đồ liệt kê các số nguyên không âm đến các số nguyên dương. Hãy thử trực tuyến!

Số nguyên cho danh sách, 8 byte

ÆE©Ḣ0ẋ®;

Ánh xạ các số nguyên dương vào danh sách các số nguyên không âm. Hãy thử trực tuyến!

Lý lịch

Đặt p 0 , p 1 , p 2 , ⋯ là dãy số nguyên tố theo thứ tự tăng dần.

Với mỗi danh sách các số nguyên không âm A: = [a 1 ,, a n ] , chúng tôi ánh xạ A đến p 0 z (A) p 1 a 1 ⋯ p n a n , trong đó z (A) là số trailing zero của Một .

Đảo ngược bản đồ trên một cách đơn giản. Đối với một dương tính số nguyên k , chúng tôi factorize nó duy nhất là sản phẩm của các cường quốc hàng đầu liên tiếp n = p 0 α 0 p 1 α 1 ⋯ p n α n , nơi α n > 0 , sau đó tái tạo lại danh sách như 1 , ⋯, α n ] , phụ α 0 zero.

Làm thế nào nó hoạt động

Liệt kê số nguyên

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.

Số nguyên để liệt kê

Æ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.       

Ví dụ đầu ra

Một trăm số nguyên dương đầu tiên ánh xạ tới các danh sách sau.

  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]

Điều này thật tuyệt vời.
Nữ tu bị rò rỉ

3

Python 2, 88 byte

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

Bản giới thiệu:

>>> 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]

Python 2, 130 byte

Đây là một giải pháp có hiệu quả cao hơn, trong đó độ dài bit của đầu ra là tuyến tính theo độ dài bit của đầu vào thay vì theo cấp số nhân.

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)

Sử dụng thuật toán tương tự như giải pháp của tôi :)
Leaky Nun

@KennyLau: Tôi đã không nhìn vào giải pháp của bạn. Chúng trông giống nhau nhưng không giống nhau (0 và 1 được hoán đổi). Và bạn thất bại trong chuyến đi khứ hồi danh sách trống.
Anders Kaseorg

Tôi thấy, cảm ơn đã nhắc nhở.
Nữ tu bị rò rỉ

Nhân tiện, tôi đã nói đầu ra có thể ở bất kỳ cơ sở nào .
Leaky Nun

Vì việc chia sẻ mã giữa các chức năng được cho phép, có vẻ như bạn chỉ có thể xây dựng eđể trở thành nghịch đảo cho d: e=lambda l,i=0:l!=d(i)and-~e(l,i+1).
xnor

1

Python 2, 204 202 byte

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

Hoạt động bằng cách liên tục áp dụng Z + x Z + <-> Z + bijection, được thêm trước bởi độ dài danh sách.

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]

Một câu hỏi: hàm nào là hàm "liệt kê thành số nguyên" và hàm nào là "số nguyên thành danh sách"?
user48538

@ zyabin101 elà danh sách thành số nguyên, dlà số nguyên cho danh sách (mã hóa / giải mã).
orlp

Tôi thích giải pháp này.
Leaky Nun

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.