Stackylogic là một ngôn ngữ lập trình logic dựa trên tôi đã quyết rằng mất trong 0
's và 1
' s cho đầu vào và đầu ra một single 0
hoặc 1
hoàn thành thuận.
Một chương trình Stackylogic bao gồm các dòng chỉ có thể chứa ba ký tự 01?
cũng như chính xác một dòng <
ở cuối một trong các dòng. Các đường kẻ không được bỏ trống và phù hợp với quy <
phải có ít nhất một 0
, 1
hoặc ?
trước khi nó.
Đây là một chương trình mẫu mà (như tôi sẽ giải thích) tính toán NAND của hai bit:
1
?<
11
?
0
Mỗi dòng trong chương trình Stackylogic được coi là một ngăn xếp , với đáy ở bên trái và trên cùng bên phải. Ngẫu nhiên, có một ngăn xếp trống (dòng trống) trước dòng đầu tiên trong một chương trình và sau dòng cuối cùng.
Cái <
mà chúng ta sẽ gọi con trỏ , đánh dấu ngăn xếp để bắt đầu khi chương trình Stackylogic được chạy. Việc thực hiện chương trình Stackylogic được tiến hành như sau:
Bật ký tự trên cùng khỏi ngăn xếp mà con trỏ hiện đang trỏ tới.
- Nếu ký tự là
?
, nhắc người dùng cho a0
hoặc a1
và hành động như thể đó là ký tự. - Nếu ký tự là
0
, di chuyển con trỏ một chồng lên (đến dòng phía trên dòng hiện tại). - Nếu ký tự là
1
, di chuyển con trỏ xuống một chồng (đến dòng bên dưới dòng hiện tại).
- Nếu ký tự là
Nếu ngăn xếp con trỏ di chuyển đến trống, hãy xuất giá trị cuối cùng được bật ra khỏi ngăn xếp (luôn luôn là một
0
hoặc1
) và kết thúc chương trình.Khác, nếu ngăn xếp con trỏ di chuyển đến không trống, quay lại bước 1 và lặp lại quy trình.
Lưu ý rằng các chương trình Stackylogic luôn kết thúc vì cuối cùng chúng phải làm cạn kiệt các ngăn xếp của chúng.
Ví dụ NAND
Trong chương trình NAND, con trỏ bắt đầu trên ?
:
1
?<
11
?
0
Chúng tôi sẽ giả sử người dùng nhập một 1
lần khi ?
bật, điều đó có nghĩa là con trỏ sẽ di chuyển xuống, làm cho chương trình trông như thế này:
1
11<
?
0
Bây giờ một đồng bằng 1
nằm ở đầu ngăn xếp con trỏ. Nó được bật hợp lệ và con trỏ di chuyển lại:
1
1
?<
0
Bây giờ giả sử đầu vào của người dùng 0
cho ?
, có nghĩa là con trỏ sẽ di chuyển lên:
1
1<
0
Một lần nữa, a 1
nằm trên ngăn xếp con trỏ để con trỏ bật lên và di chuyển xuống:
1
<
0
Cuối cùng, ngăn xếp con trỏ trống, vì vậy giá trị cuối cùng xuất hiện, là 1
, là đầu ra và chương trình kết thúc.
Đây là chính xác cho một cổng NAND vì 1 NAND 0
là 1
. Điều này tất nhiên hoạt động cho ba đầu vào hai bit khác nếu bạn quan tâm để kiểm tra.
HOẶC Ví dụ
Chương trình Stackylogic này mô phỏng một cổng OR :
?
?<
Thật dễ dàng để thấy rằng một đầu vào ban đầu 1
sẽ đẩy con trỏ đến ngăn trống ẩn bên dưới dòng cuối cùng, kết thúc chương trình và xuất ra cái 1
chỉ là đầu vào.
00
Mặt khác, đối với đầu vào , con trỏ sẽ di chuyển đến ngăn xếp trống ẩn ở trên cùng, kết thúc chương trình và xuất kết quả cuối cùng 0
thành đầu vào.
Thử thách
Viết chương trình hoặc hàm nhận trong chương trình Stackylogic dưới dạng chuỗi và chạy nó, in hoặc trả về kết quả 0
hoặc 1
.
Theo ?
, bạn có thể nhắc người dùng nhập 0
hoặc 1
nhập hoặc đọc giá trị từ một chuỗi đặt trước của 0
và 1
các mà bạn cũng lấy làm đầu vào. (Đây có thể là một chuỗi đầu vào khác cho chương trình / chức năng của bạn hoặc bạn chỉ có thể giả sử dòng đầu tiên hoặc cuối cùng của chuỗi chương trình sẽ là luồng đầu vào).
Bạn có thể giả định chương trình và đầu vào luôn được hình thành tốt. Bạn có thể tùy ý giả sử các chương trình đầu vào đi kèm với một dòng mới duy nhất (mặc dù hãy nhớ luôn có một ngăn xếp ngầm ẩn ở cuối).
Mã ngắn nhất tính bằng byte thắng.
Chương trình mẫu khác
ZERO
0<
ONE
1<
BUFFER
?<
NOT
1
?<
0
AND
?<
?
NAND
1
?<
11
?
0
OR
?
?<
NOR
1
?
00
?<
0
XOR(v1)
?
0
1?<
?
0
XOR(v2)
?
?<
11
?
0
XNOR(v1)
1
?
0?<
1
?
XNOR(v2)
1
?
00
?<
?
MEDIAN(v1)
1
???<
0
MEDIAN(v2)
?
1?<
??
Cảm ơn Martin cho các chương trình trung bình .
1\???<\0
.
111\???????<\000
.
?\1?<\??
. Ngoài ra, đây là một triển khai 5 dòng đối xứng:?\?0\?<\?1\?