Các phân số nguyên bị hạn chế


8

P k (n) có nghĩa là số lượng phân vùng nthành kcác phần chính xác . Cho nk, tính P k (n).

Mẹo: P k (n) = P k (n − k) + P k − 1 (n − 1), với các giá trị ban đầu p 0 (0) = 1 và p k (n) = 0 nếu n ≤ 0 hoặc k ≤ 0. [Wiki]

Ví dụ

n    k    Ans
1    1    1
2    2    1
4    2    2
6    2    3
10   3    8

Quy tắc


1
Bạn nên nói rõ rằng đây là môn đánh gôn , mặc dù nó được gắn thẻ.
Ông Xcoder

2
Cần một ai đó liên kết đến OEIS cho điều này (tôi giả sử có một với số lượng trình tự phân vùng, chúng tôi đã chạy vào trên bài CNR OEIS)
Stephen

3
Tôi nghĩ trường hợp thử nghiệm cuối cùng phải là 8
H.PWiz

2
Tôi đồng ý với H.PWiz rằng bản thử nghiệm cuối cùng nên được 8thay thế 7.
Erik the Outgolfer 26/07/17

Câu trả lời:



3

Swift , 76 73 byte

func P(_ n:Int,_ k:Int)->Int{return n*k>0 ?P(n-k,k)+P(n-1,k-1):n==k ?1:0}

Hãy thử trực tuyến!


Giải trình

Làm thế nào để mã cấu trúc làm việc?

Trước hết, chúng tôi xác định hàm của chúng tôi P, với hai tham số nguyên nk, và cung cấp cho nó một kiểu trả về Int, với đoạn mã này : func P(_ n:Int,_ k:Int)->Int{...}. Thủ thuật thú vị ở đây là chúng ta bảo trình biên dịch bỏ qua tên của các tham số, _theo sau là khoảng trắng, giúp chúng ta tiết kiệm hai byte khi chúng ta gọi hàm. returnrõ ràng là được sử dụng để trả về kết quả của ternary lồng nhau của chúng tôi được mô tả dưới đây.

Một mẹo khác tôi đã sử dụng là n*k>0, giúp chúng tôi tiết kiệm được một vài byte n>0&&k>0. Nếu điều kiện là đúng (cả hai số nguyên vẫn cao hơn 0), thì chúng ta gọi đệ quy hàm của chúng ta với số ngiảm klà mới nkgiữ nguyên, và chúng ta thêm kết quả của P()với nkgiảm xuống bằng 1. Nếu điều kiện không đúng , chúng tôi trả lại 1hoặc 0tùy thuộc vào việc ncó bằng không k.

Thuật toán đệ quy hoạt động như thế nào?

Chúng ta biết rằng phần tử đầu tiên của chuỗi là p 0 (0) và vì vậy chúng tôi kiểm tra cả hai số nguyên đều dương ( n*k>0). Nếu chúng không cao hơn 0, chúng tôi kiểm tra xem chúng có bằng ( n==l ?1:0) không, đây là hai trường hợp:

  • Có chính xác 1 phân vùng có thể, và do đó chúng ta trả về 1, nếu các số nguyên bằng nhau.

  • Không có phân vùng nếu một trong số chúng là 0 và cái còn lại thì không.

Tuy nhiên, nếu cả hai đều tích cực, chúng tôi gọi đệ quy Phai lần, thêm kết quả của P(n-k,k)P(n-1,k-1). Và chúng tôi lặp lại một lần nữa cho đến khi nđạt 0.


* Lưu ý: Không gian có thể được loại bỏ.



2

Python 2 , 61 55 51 50 byte

-10 byte nhờ Erik the Outgolfer. -1 byte nhờ ông Xcoder.

Tôi sẽ nói, tôi đã sao chép gợi ý từ OP và dịch nó sang Python. : P

P=lambda n,k:n*k>0and P(n-k,k)+P(n-1,k-1)or+(n==k)

Hãy thử trực tuyến!


1
Điều này phá vỡ trong trường hợp thử nghiệm cuối cùng của 10, 3. Quá nhiều đệ quy
jkelm

1
(n>0and k>0)->n>0<k
Erik the Outgolfer 26/07/17

1
Ngoài ra bạn có thể làm +(n==k)thay vì [0,1][n==k].
Erik the Outgolfer 26/07/17

1
Bạn không cần không gian trong or +.
Erik the Outgolfer 26/07/17

1
50 byte , thay thế n>0<k andbằngn*k>0and
Ông Xcoder

2

Toán học, 33 byte

Length@IntegerPartitions[#,{#2}]&

đây là bảng nxk

 \k->
 n1  0  0   0   0   0   0   0   0   0  
 |1  1  0   0   0   0   0   0   0   0  
 v1  1  1   0   0   0   0   0   0   0  
  1  2  1   1   0   0   0   0   0   0  
  1  2  2   1   1   0   0   0   0   0  
  1  3  3   2   1   1   0   0   0   0  
  1  3  4   3   2   1   1   0   0   0  
  1  4  5   5   3   2   1   1   0   0  
  1  4  7   6   5   3   2   1   1   0  
  1  5  8   9   7   5   3   2   1   1  

1
Tất nhiên. Tôi biết có một nội dung.
Matthew Roh

Một Mathematica Giản cổng sẽ tiết kiệm được 13 byte đây tôi tin rằng ( Length-> Len`1IntegerPartitions->Int`7
Jonathan Allan

@Jonathan ALLan Tôi thực sự đang tạo một phiên bản siêu ngắn này. Hy vọng tôi có thể hoàn thành nó vào cuối tháng
JungHwan Min

2

JavaScript (ES6), 42 40 39 byte

Tôi nghĩ rằng điều này làm việc.

f=(x,y)=>x*y>0?f(x-y,y)+f(--x,--y):x==y

Thử nó

k.value=(
f=(x,y)=>x*y>0?f(x-y,y)+f(--x,--y):x==y
)(i.value=10,j.value=3)
onchange=_=>k.value=f(+i.value,+j.value)
*{font-family:sans-serif}input{margin:0 5px 0 0;width:100px;}#j,#k{width:50px;}
<label for=i>n: </label><input id=i type=number><label for=j>k: </label><input id=j type=number><label for=k>P<sub>k</sub>(n): </label><input id=k readonly>


2

MATL , 14 byte

y:Z^!S!Xu!Xs=s

Hãy thử trực tuyến!

Giải trình

Xem xét đầu vào 6, 2.

y     % Implicitly take the two inputs. Duplicate from below
      % STACK: 6, 2, 6
:     % Range
      % STACK: 6, 2, [1 2 3 4 5 6]
Z^    % Cartesian power
      % STACK: 6, [1 1; 1 2; ... 1 5; 1 6; 2 1; 2 2; ...; 6 6]
!S!   % Sort each row
      % STACK: 6, [1 1; 1 2; ... 1 5; 1 6; 1 2; 2 2; ...; 6 6]
Xu    % Unique rows
      % STACK: 6, [1 1; 1 2; ... 1 5; 1 6; 2 2; ...; 6 6]
!Xs   % Sum of each row, as a row vector
      % STACK: 6, [2 3 ... 6 7 4 ... 12]
=     % Equals, element-wise
      % STACK: [0 0 ... 1  0 0 ... 0]
s     % Sum. Implicitly display
      % STACK: 3

Thành thật mà nói, tôi rất ngạc nhiên MATL không có nội dung "phân vùng nguyên" hoặc thứ gì đó.
Erik the Outgolfer 26/07/17

@Sanchises Nó nên được làm việc bây giờ. Cảm ơn đã nói với tôi!
Luis Mendo

Không vấn đề gì. Tôi chỉ chơi với nó để hiểu phương pháp của bạn (thường dễ hơn đối với các trường hợp nhỏ) khi tôi gặp lỗi.
Sanchise




0

Thạch , 13 byte

Tôi có cảm giác biết cách tiếp cận cơ bản này sẽ không phải là môn đánh gôn nhất!

RŒṖL€€Ṣ€QṀ€=S

Hãy thử trực tuyến!


Vâng, không phải vậy (xem câu trả lời Jelly của tôi ở phía xa).
Erik the Outgolfer 26/07/17

Oh no Code bowling
Matthew Roh

@EriktheOutgolfer Nếu nó hoạt động tại sao nó bị xóa?
Jonathan Allan

@Jonathan refresh
Matthew Roh

@Jonathan ALLan Nó đã bị xóa trước khi một trường hợp thử nghiệm được sửa chữa.
Erik the Outgolfer 26/07/17



0

Scala , 73 byte

Vâng, đây là một số cách dễ dàng sử dụng mẹo của OP.

knlà các tham số của hàm đệ quy của tôi f. Xem liên kết TIO cho bối cảnh.

Vì đây là đệ quy, tôi có nên đưa hàm def vào số byte không?

(k,n)match{case(0,0)=>1
case _ if k<1|n<1=>0
case _=>f(n-k,k)+f(n-1,k-1)}

Hãy thử trực tuyến!



0

R (+ pryr), 49 byte

f=pryr::f(`if`(k<1|n<1,!n+k,f(n-k,k)+f(n-1,k-1)))

Mà đánh giá cho hàm đệ quy

function (k, n) 
if (k < 1 | n < 1) !n + k else f(n - k, k) + f(n - 1, k - 1)

(k < 1 | n < 1)kiểm tra nếu bất kỳ trạng thái ban đầu được đáp ứng. !n + kước tính thành TRUE (1) nếu cả hai nvà bằng k0 và FALSE (0) nếu không. f(n - k, k) + f(n - 1, k - 1)xử lý đệ quy.

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.