Haskell (Lambdabot), 92 85 byte
x#y|x==y=[[x]]|1>0=(guard(mod x y<1)>>(y:).map(y*)<$>div x y#2)++x#(y+1)
map(1:).(#2)
Cần Lambdabot Haskell kể từ khi được guard
yêu cầu Control.Monad
nhập khẩu. Hàm chính là một hàm ẩn danh, mà tôi đã nói là được phép và nó sẽ loại bỏ một vài byte.
Cảm ơn Laikoni vì đã tiết kiệm bảy byte.
Giải trình:
Monads rất tiện dụng.
x # y
Đây là chức năng đệ quy của chúng tôi thực hiện tất cả các công việc thực tế. x
là số chúng tôi tích lũy được (sản phẩm của các ước số còn lại trong giá trị) và y
là số tiếp theo chúng tôi nên thử chia thành số đó.
| x == y = [[x]]
Nếu x
bằng y
thì chúng ta đã thực hiện đệ quy. Chỉ cần sử dụng x
như là kết thúc của chuỗi gozinta hiện tại và trả lại nó.
| 1 > 0 =
Haskell golf-ism cho "Đúng". Đó là, đây là trường hợp mặc định.
(guard (mod x y < 1) >>
Bây giờ chúng tôi đang hoạt động trong danh sách đơn nguyên. Trong danh sách đơn nguyên, chúng tôi có khả năng đưa ra nhiều lựa chọn cùng một lúc. Điều này rất hữu ích khi tìm thấy "tất cả có thể" của một cái gì đó do kiệt sức. Các guard
tuyên bố nói "chỉ xem xét các lựa chọn sau đây nếu một điều kiện là đúng". Trong trường hợp này, chỉ xem xét lựa chọn sau nếu y
chia x
.
(y:) . map (y *) <$> div x y#2)
Nếu y
không phân chia x
, chúng ta có quyền lựa chọn thêm y
vào chuỗi gozinta. Trong trường hợp này, đệ quy gọi (#)
, bắt đầu lại ở y = 2
với x
bằng x / y
, vì chúng ta muốn "yếu tố out" mà y
chúng ta vừa bổ sung vào chuỗi. Sau đó, bất kể kết quả từ cuộc gọi đệ quy này là gì, nhiều giá trị của nó do y
chúng tôi chỉ cần đưa ra và thêm y
vào chuỗi gozinta chính thức.
++
Hãy xem xét lựa chọn sau đây là tốt. Điều này chỉ đơn giản là thêm hai danh sách lại với nhau, nhưng về mặt đơn giản, chúng ta có thể nghĩ về nó như nói "chọn giữa làm việc này HOẶC điều này khác".
x # (y + 1)
Tùy chọn khác là chỉ cần tiếp tục đệ quy và không sử dụng giá trị y
. Nếu y
không phân chia x
thì đây là lựa chọn duy nhất. Nếu y
không chia x
thì tùy chọn này sẽ được thực hiện cũng như tùy chọn khác và kết quả sẽ được kết hợp.
map (1 :) . (# 2)
Đây là chức năng gozinta chính. Nó bắt đầu đệ quy bằng cách gọi (#)
với đối số của nó. A 1
được thêm vào mỗi chuỗi gozinta, bởi vì (#)
hàm không bao giờ đặt các chuỗi vào chuỗi.