หมายเลขพาร์ติชันที่ใกล้ที่สุด


12

จำนวนพาร์ติชันของจำนวนเต็มคือจำนวนวิธีที่สามารถแสดงจำนวนเต็มเป็นผลรวมของจำนวนเต็มบวก

ตัวอย่างเช่น:

5
4 + 1
3 + 2
3 + 1 + 1
2 + 2 + 1
2 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1

มี 7 วิธีในการแทนค่าหมายเลข 5 ดังนั้น 7 คือหมายเลขพาร์ติชันที่สอดคล้องกับหมายเลข 5

หมายเลขพาร์ติชัน: OEIS: # A000041

คำสั่ง

เขียนโปรแกรมที่ใช้จำนวนเต็มบวกเป็นอินพุตและเอาต์พุตตัวเลขสองตัวที่สร้างหมายเลขพาร์ติชันที่ใกล้เคียงที่สุดสองตัวไปยังหมายเลขอินพุต

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

หมายเลขพาร์ติชัน: OEIS: # A000041

ตัวอย่าง

Input: 66
Output: 11, 12

(หมายเลขพาร์ติชันที่สอดคล้องกับหมายเลข 11 และ 12 คือ 56 และ 77 ซึ่งเป็นหมายเลขพาร์ติชันที่ใกล้เคียงที่สุดถึง 66)

Input: 42
Output: 10

(หมายเลข 42 เป็นหมายเลขพาร์ติชั่นอยู่แล้วดังนั้นเพียงแค่ส่งออกหมายเลขที่สอดคล้องกับหมายเลขพาร์ติชัน)

Input: 136
Output: 13, 14

(สองหมายเลขพาร์ติชันที่ใกล้เคียงกับ 136 เป็นจริงทั้งน้อยกว่า 136 (เช่น 101 และ 135) ดังนั้นผลลัพธ์คือ 13 และ 14 ซึ่งตรงข้ามกับ 14 และ 15)

Input: 1
Output: 0   or   1

(ทั้ง 0 และ 1 เป็นเอาต์พุตที่ถูกต้องในกรณีพิเศษนี้)

Input: 2484
Output: 26, 25   or   26, 27

(ทั้งของผลเหล่านี้จะถูกต้องเพราะ 2484 เป็น d เท่ากับฉันท่าทาง 1958 และ 3010)

Input: 4
Output: 3, 4

(ได้)


คุณไม่ได้กำหนดว่าอะไรคือจำนวนพาร์ทิชัน
ความภาคภูมิใจ haskeller

@proudhaskeller หมายเลขพาร์ติชันคือหมายเลขที่อยู่ในลำดับ OEIS ที่เชื่อมโยง คำอธิบายสำหรับหมายเลขพาร์ติชัน5ที่อยู่ด้านบนสุด (ฉันจะเพิ่มความกระจ่างถ้าคุณคิดว่ามันไม่ชัดเจนพอ)
kukac67

1
นี้เป็นอย่างมากใกล้เคียงกับการล่อของคำถามพาร์ทิชันนี้ก่อนหน้านี้
Peter Taylor

คำตอบ:


2

Pyth , 53

L?!b<b1sm&d*^_1tdy-b/*dt*3d2r_bhbJo^-QyN2U99<J-2qQyhJ

คำอธิบายและการตีกอล์ฟเพิ่มเติมที่จะติดตาม


4

Python 2, 179 ไบต์

Z=range(1,99)
R=Z+[1]
for i in Z:R[i]=sum(-(-1)**k*(3*k*k-k<=i*2and R[i-k*(3*k-1)/2])for k in range(-i,i+1)if k)
f=lambda n:zip(*sorted((abs(n-R[i]),i)for i in Z))[1][:2-(n in R)]

ใช้สูตรเวียนเกิดจากทฤษฎีบทห้าเหลี่ยมออยเลอร์

f(2484)โทรหา ผลลัพธ์คือ tuple ที่มีหนึ่งหรือสองตัวเลข


2

Mathematica, 124 123 ไบต์

f@n_:=(p=SeriesCoefficient[1/Product[1-x^k,{k,#}],{x,0,#}]&;s=SortBy[Range@95,Abs[n-p@#]&];If[p@s[[1]]==n,s[[1]],s~Take~2])

สูตรสำหรับตัวเลขพาร์ทิชันที่นำมาจากหน้า OEIS (อาจจะโกงหรือไม่ก็ได้ ... ฉันตัดสินใจไม่ได้)

การใช้งาน:

In: f[136]

Out: {14, 13}

ฉันไม่ตอบให้ชนะ และฉันแน่ใจว่านี่จะสามารถเล่นกอล์ฟต่อไปได้

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