Giới thiệu: Logic kết hợp
Logic kết hợp (CL) dựa trên những thứ được gọi là tổ hợp , về cơ bản là các chức năng. Có hai tổ hợp "tích hợp" cơ bản, S
và K
sẽ được giải thích sau.
Kết hợp trái
CL là liên kết bên trái , có nghĩa là dấu ngoặc (chứa nội dung) nằm ở phía bên trái của cặp dấu ngoặc có chứa nó có thể được gỡ bỏ, với nội dung được phát hành. Ví dụ, một cái gì đó như thế này:
((a b) c)
Có thể giảm xuống
(a b c)
Trường hợp (a b)
nằm ở bên trái của khung lớn hơn ((a b) c)
, vì vậy nó có thể được gỡ bỏ.
Một ví dụ lớn hơn nhiều về liên kết trái (dấu ngoặc vuông là giải thích):
((a b) c ((d e) f (((g h) i) j)))
= (a b c ((d e) f (((g h) i) j))) [((a b) c...) = (a b c...)]
= (a b c (d e f (((g h) i) j))) [((d e) f...) = (d e f...)]
= (a b c (d e f ((g h i) j))) [((g h) i) = (g h i)]
= (a b c (d e f (g h i j))) [((g h i) j) = (g h i j)]
Chân đế cũng có thể được giảm khi có nhiều hơn một cặp quấn quanh cùng một vật. Ví dụ:
((((a)))) -> a
a ((((b)))) -> a b
a (((b c))) -> a (b c) [(b c) is still a group, and therefore need brackets.
Note that this doesn't reduce to `a b c`, because
`(b c)` is not on the left.]
Nội địa
CL có hai tổ hợp "tích hợp" S
và K
có thể chuyển đổi các đối tượng (tổ hợp đơn hoặc một nhóm tổ hợp / nhóm được bao quanh dấu ngoặc) như vậy:
K x y = x
S x y z = x z (y z)
Ở đâu x
, y
và z
có thể là stand-in cho bất cứ điều gì.
Một ví dụ về S
và K
như sau:
(S K K) x [x is a stand-in for anything]
= S K K x [left-associativity]
= K x (K x) [S combinator]
= x [K combinator]
Một vi dụ khac:
S a b c d
= a c (b c) d [combinators only work on the n objects to the right of it,
where n is the number of "arguments" n is defined to have -
S takes 3 arguments, so it only works on 3 terms]
Trên đây là các ví dụ về các câu lệnh CL bình thường, trong đó câu lệnh không thể được đánh giá thêm và đạt được kết quả cuối cùng trong một khoảng thời gian hữu hạn. Có những tuyên bố không bình thường (là những tuyên bố CL không chấm dứt và sẽ được đánh giá mãi mãi), nhưng chúng không nằm trong phạm vi của thách thức và sẽ không cần phải được bảo hiểm.
Nếu bạn muốn tìm hiểu thêm về CL, hãy đọc trang Wikipedia này .
Bài tập:
Nhiệm vụ của bạn là tạo ra các tổ hợp bổ sung, với số lượng đối số và những gì nó đánh giá là đầu vào, được đưa ra như vậy:
{amount_of_args} = {evaluated}
Trường hợp {amount_of_args}
một số nguyên dương bằng với số lượng đối số và {evaluated}
bao gồm:
- đối số lên đến số lượng đối số, với
1
đối số thứ nhất,2
là đối số thứ hai, vân vân.- Bạn được đảm bảo rằng các số đối số trên số lượng đối số (vì vậy chỉ
4
khi nào ) sẽ không xuất hiện .{amount_of_args}
3
{evaluated}
- Bạn được đảm bảo rằng các số đối số trên số lượng đối số (vì vậy chỉ
- dấu ngoặc
()
Vì vậy, ví dụ về đầu vào là:
3 = 2 3 1
4 = 1 (2 (3 4))
Đầu vào đầu tiên là yêu cầu một bộ kết hợp (giả sử R
) với ba đối số ( R 1 2 3
), sau đó đánh giá thành:
R 1 2 3 -> 2 3 1
Đầu vào thứ hai yêu cầu điều này (với tên tổ hợp A
):
A 1 2 3 4 -> 1 (2 (3 4))
Với đầu vào ở định dạng này, bạn phải trả về một chuỗi S
, K
và ()
, khi được thay thế bằng tên của tổ hợp và chạy bằng các đối số, sẽ trả về cùng một câu lệnh được đánh giá là {evaluated}
khối khi khối lệnh được thay thế trở lại cho tên của tổ hợp đó.
Câu lệnh kết hợp đầu ra có thể bị xóa khoảng trắng và dấu ngoặc ngoài, vì vậy một cái gì đó giống như (S K K (S S))
có thể được chuyển thành SKK(SS)
.
Nếu bạn muốn kiểm tra kết quả đầu ra của chương trình của bạn, @aditsu đã làm một phân tích cú pháp lôgic combinatory (trong đó bao gồm S
, K
, I
và thậm chí cả những người khác muốn B
và C
) ở đây .
Ghi bàn:
Vì đây là một metagolf , mục đích của thử thách này là đạt được số lượng byte nhỏ nhất trong đầu ra có thể, với 50 trường hợp thử nghiệm này . Vui lòng đặt kết quả của bạn cho 50 trường hợp thử nghiệm trong câu trả lời hoặc tạo một pastebin (hoặc một cái gì đó tương tự) và gửi một liên kết đến pastebin đó.
Trong trường hợp hòa, giải pháp sớm nhất sẽ thắng.
Quy tắc:
- Câu trả lời của bạn phải trả về đầu ra ĐÚNG - vì vậy, với một đầu vào, nó phải trả về đầu ra chính xác theo định nghĩa trong tác vụ.
- Câu trả lời của bạn phải xuất trong vòng một giờ trên máy tính xách tay hiện đại cho mỗi trường hợp thử nghiệm.
- Bất kỳ mã hóa cứng của các giải pháp đều không được phép. Tuy nhiên, bạn được phép mã hóa tối đa 10 tổ hợp.
- Chương trình của bạn phải trả lại cùng một giải pháp mỗi lần cho cùng một đầu vào.
- Chương trình của bạn phải trả về một kết quả hợp lệ cho bất kỳ đầu vào nào, không chỉ các trường hợp thử nghiệm.
1
, bạn có thể trừ đi 1
mọi thứ, sau đó gói giải pháp cho câu trả lời đó K()
. Ví dụ: Giải đáp cho 2 -> 1
là K
, do đó giải pháp cho 3 -> 2
là KK
, giải pháp cho 4 -> 3
là K(KK)
, vv