แมปรายการขนาดไม่ จำกัด ไปยังตัวเลข!


11

เป็นที่รู้จักกันดีในสาขาวิชาคณิตศาสตร์ที่ศึกษาอนันต์ว่าผลิตภัณฑ์คาร์ทีเซียนของเซตจำนวนที่แน่นอนใด ๆ ก็นับได้เช่นกัน

งานของคุณคือการเขียนโปรแกรมสองโปรแกรมเพื่อใช้สิ่งนี้หนึ่งรายการไปยังแผนที่จากรายการไปยังจำนวนเต็มหนึ่งไปยังแผนที่จากจำนวนเต็มหนึ่งไปยังรายการ

ฟังก์ชั่นของคุณจะต้องเป็น bijective และ deterministic ซึ่งหมายความว่า1จะแมปไปยังรายการบางรายการ2เสมอและจะแมปไปยังรายการอื่นเสมอ ...

ก่อนหน้านี้เราแมปจำนวนเต็มในรายการประกอบเพียงและ01

อย่างไรก็ตามตอนนี้รายการจะประกอบด้วยตัวเลขที่ไม่เป็นลบ

รายละเอียด

  • โปรแกรม / ฟังก์ชั่นรูปแบบอินพุต / เอาท์พุตที่สมเหตุสมผล
  • ไม่ว่าจะเป็นจำนวนเต็มที่แมปเริ่มต้นจาก1หรือเริ่มจาก0เป็นตัวเลือกของคุณหมายความว่า0ไม่จำเป็นต้องแมป(แต่อาจ) กับสิ่งใด ๆ
  • อาร์เรย์ที่ว่างเปล่า[]จะต้องเข้ารหัส
  • อินพุต / เอาต์พุตอาจอยู่ในฐานใด ๆ
  • รหัสร่วมกันระหว่างทั้งสองฟังก์ชั่นจะได้รับอนุญาต

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟคะแนนต่ำสุดชนะ

คะแนนคือผลรวมของความยาว (เป็นไบต์) ของสองโปรแกรม / ฟังก์ชั่น


"อย่างไรก็ตามตอนนี้รายการจะประกอบด้วยตัวเลขที่ไม่เป็นลบ"
Leun Nun

ดังนั้นเพื่อความชัดเจนเรากำลังทำแผนที่N^inf -> N?
Mego

@Mego N ^ inf ไม่สามารถนับได้ N ^ k โดยที่ k คือจำนวน จำกัด ใด ๆ
Leun Nun

เราได้พูดคุยเกี่ยวกับเรื่องนี้ในการแชท
Leun 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 ]เราจับคู่Aกับp 0 z (A) p 1 1 ⋯ P n nที่ Z (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.       

ตัวอย่างผลลัพธ์

จำนวนเต็มบวกหนึ่งร้อยตัวแรกจะจับคู่กับรายการต่อไปนี้

  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]

อันนี้ยอดเยี่ยม
Leun Nun

3

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

Python 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)

ใช้วิธีการเดียวกับการแก้ปัญหาของฉัน :)
รั่วนูน

@ KennyLau: ฉันไม่ได้ดูวิธีแก้ปัญหาของคุณ พวกเขามีลักษณะคล้ายกัน แต่ไม่เหมือนกัน (0s และ 1s จะถูกสลับเปลี่ยน) และคุณล้มเหลวในการเดินทางไปรอบ ๆ รายการที่ว่างเปล่า
Anders Kaseorg

ฉันเห็นขอบคุณสำหรับการเตือน
Leun Nun

โดยวิธีการที่ฉันกล่าวว่าการส่งออกสามารถอยู่ในฐานใด ๆ
Leun Nun

ตั้งแต่รหัสร่วมกันระหว่างฟังก์ชั่นที่ได้รับอนุญาตก็ดูเหมือนว่าคุณก็สามารถสร้างeให้เป็นผกผันสำหรับ:d e=lambda l,i=0:l!=d(i)and-~e(l,i+1)
xnor

1

Python 2, 204 202 ไบต์

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 + biject ซ้ำ ๆ โดยมีความยาวเป็นรายการ

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]

คำถามหนึ่ง: ฟังก์ชั่นใดเป็นฟังก์ชั่น "list to integer" และฟังก์ชั่น "integer to list" คืออะไร?
user48538

@ zyabin101 eเป็นลิสต์ของจำนวนเต็ม, dเป็นจำนวนเต็มของลิสต์ (เข้ารหัส / ถอดรหัส)
orlp

ฉันชอบวิธีนี้
Leun Nun

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.