Phép trừ nhà thờ
Tính toán Lambda luôn là một niềm đam mê của tôi và các hành vi mới nổi của việc truyền các chức năng vào nhau rất phức tạp. Các số của nhà thờ là các đại diện của các số tự nhiên được tạo ra từ ứng dụng lặp lại của một hàm (thông thường là phép cộng một hằng số). Ví dụ, số 0 trả về x và "bỏ qua" hàm đầu vào, một là f(x)
, hai là f(f(x))
và vv:
ident = lambda x: x
zero = lambda f: ident
succ = lambda n: lambda f: lambda x: f(n(f)(x))
one = succ(zero)
add1 = lambda x: x + 1
to_int = lambda f: f(add1)(0)
print(to_int(one))
>>> 1
Từ đó chúng ta có thể dễ dàng thấy rằng bổ sung được thực hiện bằng cách áp dụng hàm đầu tiên cho x sau đó áp dụng hàm thứ hai cho x:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
Ngoài ra là tương đối dễ hiểu. Tuy nhiên, đối với một người mới đến, có thể không thể nghĩ ra được phép trừ trong hệ thống số được mã hóa của Giáo hội. Điều gì có thể có nghĩa là không áp dụng một chức năng?
Thử thách
Thực hiện chức năng trừ trong hệ thống số được mã hóa của Giáo hội. Trong đó phép trừ thực hiện phép toán monus và không áp dụng n
thời gian hàm nếu kết quả sẽ lớn hơn 0 hoặc 0. Đây là mã golf nên mã ngắn nhất sẽ thắng.
Đầu vào
Hai chữ số của Giáo hội đã được mã hóa trong lựa chọn ngôn ngữ của bạn. Các đầu vào có thể là vị trí hoặc curried. Để chứng minh đây là những chữ số Giáo Hội chân chính họ sẽ phải thực hiện trong bất kỳ chức năng và áp dụng chúng nhiều lần ( add1
được đưa ra trong ví dụ nhưng nó có thể add25
, mult7
hoặc bất kỳ chức năng unary khác.)
Đầu ra
Một số nhà thờ. Cần lưu ý rằng nếu m < n
sau đó m - n
luôn luôn giống như chức năng nhận dạng.
Ví dụ:
minus(two)(one) = one
minus(one)(two) = zero
...
cũng chấp nhận được:
minus(two, one) = one
minus(one, two) = zero
Tín dụng:
Github này đã cho tôi một con trăn thực hiện Chữ số nhà thờ.
lambda m,n,f:apply f m-n times
(hoặc thậm chí lambda m,n,f,x:apply f m-n times to x
) thay vì lambda m,n:lambda f:...
? Hay điều này chỉ áp dụng cho hai đầu vào m
và n
?
m
và n
theo thứ tự khác? Điều này sẽ giúp với cà ri.
exp(m, n)
tính toánm^n
.)