EDIT: Tôi nhận được rất nhiều ý kiến về việc không chấm dứt - Tôi sẽ đưa thẻ "câu trả lời đúng" cho người đầu tiên đưa cho tôi FF(3)
(như cung cấp nó trong câu trả lời của họ) hoặc chứng minh rằng điều FF(3)
đó thực sự nổ tung vô thời hạn.
Bài tập:
Nhiệm vụ của bạn là làm cho chương trình nhỏ nhất có thể tạo ra danh sách các đối ứng của hàm Fraction Frenzy ( FF(n)
) với một số nguyên dương n
.
Giới thiệu:
Trước khi tôi có thể giới thiệu hàm FF, trước tiên tôi phải giải thích các phân số của Ai Cập.
Phân số Ai Cập:
Phân số Ai Cập là một cách để biểu thị phân số là tổng của các phân số đơn vị riêng biệt - vì vậy một cách để biểu thị phân số 5/8
là 1/2 + 1/8
. Nó không phải là một khoản tiền nhỏ như
1/4 + 1/4 + 1/8
1/2 + 1/16 + 1/16
bởi vì không phải tất cả các phân số của chúng là khác biệt ( 1/4
được lặp lại trong ví dụ đầu tiên và 1/16
trong lần thứ hai).
Theo định nghĩa của chúng tôi về phân số Ai Cập, chúng tôi cũng bao gồm việc sử dụng mẫu số âm trong phân số đơn vị.
Hàm FF:
Hàm FF (Fraction Frenzy) được mô tả như vậy:
FF(1)
là phần Ai Cập 1/2 + 1/3 + 1/5 + 1/-30
.
FF(2)
bằng FF(1)
"nhân" của chính nó ( FF(1)
"bình phương"):
(1/2 + 1/3 + 1/5 + 1/-30)(1/2 + 1/3 + 1/5 + 1/-30)
= 1/4 + 1/6 + 1/10 + 1/-60 + 1/6 + 1/9 + 1/15 + 1/-90 +
1/10 + 1/15 + 1/25 + 1/-150 + 1/-60 + 1/-90 + 1/-150 + 1/900
Đây không phải là một phần Ai Cập giảm hoàn toàn, bởi vì có "lặp lại" trong phân số. Để giảm bớt chúng, thủ tục sau đây được thực hiện:
- Tổng tất cả các phân số đơn vị "thích" lại với nhau.
- Giảm các khoản tiền thành các hình thức đơn giản nhất của chúng - vì vậy, ví dụ, nếu một khoản tiền từ bước
1
là2/6
, có thể giảm xuống1/3
. - Lặp lại 1 và 2 cho đến khi tất cả các mẫu số là khác biệt: ví dụ,
1/2 + 2/3 + 1/5
trái ngược với1/2 + 1/3 + 1/3
mẫu số có mẫu số lặp lại3
. - Nếu có một cặp một phần dương và một phần âm có giá trị tuyệt đối bằng nhau, hãy loại bỏ cả hai phần này (ví dụ
1/-5
và1/5
cả hai phải được loại bỏ). - Nếu phân số không phải là đơn vị và không thể giảm thêm nữa, hãy chia nó thành các phân số đơn vị có mẫu số bằng nhau và giữ một phân số như hiện tại. Với những cái khác, nhân chúng với
FF(1)
:(1/2 + 1/3 + 1/5 + 1/-30)
. - Lặp lại các bước 1-5 cho đến khi tổng phân số cuối cùng là phân số Ai Cập hợp lệ - tức là tất cả các phân số đều khác biệt với nhau và chúng đều là các phân số đơn vị.
Đây là giảm FF(2)
:
1/4 + 1/6 + 1/10 + 1/-60 + 1/6 + 1/9 + 1/15 + 1/-90 +
1/10 + 1/15 + 1/25 + 1/-150 + 1/-60 + 1/-90 + 1/-150 + 1/900
= 1/4 + 2/6 + 1/9 + 2/10 + 2/15 + 1/25 + 2/-60 + 2/-90 + 2/-150 + 1/900 (step 1)
= 1/4 + 1/3 + 1/9 + 1/5 + 2/15 + 1/25 + 1/-30 + 1/-45 + 1/-75 + 1/900 (step 2)
= 1/3 + 1/4 + 1/5 + 1/9 + 1/15 + 1/15(1/2 + 1/3 + 1/5 + 1/-30) + (step 5)
1/25 + 1/-30 + 1/-45 + 1/-75 + 1/900
= 1/3 + 1/4 + 1/5 + 1/9 + 1/15 + 1/30 + 1/45 + 1/75 + 1/-450 +
1/25 + 1/-30 + 1/-45 + 1/-75 + 1/900
= 1/3 + 1/4 + 1/5 + 1/9 + 1/15 + 1/25 + 1/-450 + 1/900 (step 4)
Đối với tất cả n
(ngoại trừ 1
), FF(n)
được định nghĩa bằng "bình phương" FF(n-1)
.
Đầu vào và đầu ra:
Cho một số nguyên n
, bạn phải xuất ra một danh sách tất cả các đối ứng của FF(n)
, được sắp xếp theo thứ tự tăng dần của các giá trị tuyệt đối của chúng:
1 -> [2, 3, 5, -30]
# 1/2 + 1/3 + 1/5 + 1/-30 = FF(1), reciprocals = [2, 3, 5, -30]
2 -> [3, 4, 5, 9, 15, 25, -450, 900]
Bạn được phép sử dụng một chuỗi với bất kỳ dấu phân cách hoặc giải thích danh sách ngôn ngữ của bạn, vì vậy những đầu ra này đều được chấp nhận với đầu vào 1
:
2 3 5 -30 (Space-delimited)
2,3,5,-30 (Comma-delimited)
[2 3 5 -30] (Lisp-like lists)
etc. etc.
Thông số kỹ thuật:
- Bạn phải xuất kết quả của
FF(n)
hàm chính xác như được chỉ định ở trên. - Bạn được đảm bảo rằng đầu vào sẽ là một số nguyên dương - nó sẽ không bao giờ dưới 0 và nó sẽ không bao giờ là số thập phân (hoặc phân số).
Đây là mã golf , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!