Là một hacker Haskell, tôi thích ký hiệu không có điểm hơn là có điểm. Thật không may, một số người thấy ký hiệu không có điểm khó đọc và tôi thấy khó có được số ngoặc đơn chính xác khi tôi viết một cách chính xác. Giúp tôi chuyển đổi mã được viết bằng pointfree sang ký hiệu nhọn!
Trong khoảng
Trong ký hiệu không có điểm, chúng tôi sử dụng các điểm (có, thực sự) để cung cấp đầu ra của hàm này sang hàm khác. Giả sử, nếu bạn có một hàm succ
lấy một số và thêm 1 vào nó, và bạn muốn tạo một hàm thêm 3 vào một số, thay vì làm điều này:
\x -> succ(succ(succ(x)))
bạn có thể làm điều này:
succ.succ.succ
Tuy nhiên, Pointfree chỉ hoạt động với các hàm có một tham số duy nhất (dù sao trong thử thách này), vì vậy nếu chức năng của chúng tôi không succ
phải là add
lấy 2 số và cộng chúng lại với nhau, chúng tôi sẽ phải cung cấp cho nó các đối số cho đến khi chỉ còn lại một:
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
Cuối cùng, các hàm có thể lấy các hàm khác làm đối số:
Pointfree: map (f a . f b) . id
Pointful: \x -> map (\x -> f a (f b x)) (id x)
Javascript equivalent: x => map (x => f(a,f(b,x)), id(x))
Đầu vào và đầu ra dự kiến
f . f . f
\x -> f (f (f x))
f a . f b . f c
\x -> f a (f b (f c x))
f (f a . f b) . f c
\x -> f (\x -> f a (f b x)) (f c x)
a b c . d e . f g h i . j k l . m
\x -> a b c (d e (f g h i (j k l (m x))))
a.b(c.d)e.f g(h)(i j.k).l(m(n.o).p)
\x->a(b(\y->c(d y))e(f g h(\z->i j(k z))(l(\q->m(\w->n(o w))(p q))x)))
Quy tắc
- Đầu ra của bạn có thể có nhiều khoảng trắng hoặc dấu ngoặc đơn hơn mức yêu cầu, miễn là chúng được cân bằng
- Bạn không phải đảm bảo rằng tên của biến bạn tạo
\x
không được sử dụng ở nơi nào khác trong mã - Lựa chọn của bạn là tạo một chức năng hay một chương trình đầy đủ
- Đây là
codegolf
, mã ngắn nhất trong byte giành chiến thắng!
Bạn có thể thấy cùn hữu ích, nó chuyển đổi giữa hai ký hiệu (nhưng cũng có thể xác định mã khi có thể): https://blunt.herokuapp.com
(+).(*3)
giống như\x y->3*x+y
(.).(.)
chuyển đổi thành\i b c f -> i (b c f)
.
bằng một (
, thêm một \x
và nối một tương ứng x
và nhiều )
như được yêu cầu? Hay nó phức tạp hơn thế?
\ d->f(\k->f(f d k))
, nhưng bạn có thể giả sử rằng tất cả các dấu chấm được cung cấp hai đối số trong thử thách này