Stackylogic là ngôn ngữ lập trình tôi đã tạo ra trong một thử thách trước: Chạy Stackylogic . Đọc bài đăng đó để biết chi tiết đầy đủ và ví dụ, nhưng đây là cách nó hoạt động diễn giải:
Stackylogic lấy
0
's và1
' cho đầu vào và đầu ra một0
hoặc1
sau khi hoàn thành.Một chương trình bao gồm các dòng chỉ chứa các 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ột0
,1
hoặc?
trước khi nó.Đây là một chương trình mẫu tính toán NAND của hai bit:
1 ?< 11 ? 0
Mỗi dòng trong một chương trình đượ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 (tức là 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.
Con
<
trỏ, được gọi là con trỏ, đánh dấu ngăn xếp để bắt đầu khi chương trình được chạy. Tiến hành thực hiện 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 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.
Điều quan trọng để nhận ra cho thách thức này là tất cả các chương trình Stackylogic tương đương với một bảng chân lý . Một số giá trị boolean được xác định trước là đầu vào và chính xác một giá trị boolean là đầu ra xác định.
Vì vậy, nhiệm vụ của bạn là tạo ra một chương trình Stackylogic thỏa mãn hoặc mô phỏng, tức là có cùng một đầu ra như bất kỳ bảng chân lý nào. Nhưng không rõ ràng rằng Stackylogic có thể mô phỏng bất kỳ bảng chân lý nào, vì vậy đây là một bằng chứng bằng cảm ứng :
Trường hợp cơ sở
Hai bảng chân lý 0 đầu vào là các bảng luôn xuất
0
hoặc1
. Tương đương Stackylogic của các bảng này0<
và1<
tương ứng.Bước quy nạp
Giả sử Stackylogic có thể mô phỏng bất kỳ bảng chân lý đầu vào N nào. Đặt M = N + 1.
Một bảng đầu vào M, T, có thể được biểu thị dưới dạng hai bảng đầu vào N, T 0 và T 1 , cộng với bit đầu vào bổ sung B. Khi B bằng 0, kết quả của T 0 được sử dụng. Khi B là 1, kết quả của T 1 được sử dụng.
Ví dụ: bảng chân lý 3 đầu vào tương ứng với mã giả
if B: result = x OR y else: result = x NAND y
Là
B x y | result 0 0 0 | 1 0 0 1 | 1 0 1 0 | 1 0 1 1 | 0 1 0 0 | 0 1 0 1 | 1 1 1 0 | 1 1 1 1 | 1
đó thực sự là hai bảng chân lý 2 đầu vào cho NAND và OR xếp chồng lên nhau với bit B.
Đặt S 0 và S 1 là các chương trình Stackylogic thỏa mãn T 0 và T 1 tương ứng (chúng ta biết chúng tồn tại dựa trên giả định đầu tiên). Chương trình S thỏa mãn T sau đó có thể được xây dựng như:
[lines of S0 excluding the cursor, with 0 appended to all lines below the cursor] ?< [lines of S1 excluding the cursor, with 1 appended to all lines above the cursor]
Sự sắp xếp này có hiệu quả chuyển đổi giữa S 0 và S 1 dựa trên bit đầu vào đầu tiên (từ dòng
?<
). Nếu đúng như vậy0
, con trỏ sẽ di0
chuyển đến vị trí con trỏ ban đầu của S 0 , sau đó sẽ được bao quanh trên và dưới bởi các ngăn xếp trống, và do đó chạy giống hệt với S 0 ban đầu . Tương tự, nếu1
là đầu vào, con trỏ sẽ di chuyển1
xuống vị trí con trỏ của S 1 và tiến hành thực hiện nó như thể nó ở một mình.Ví dụ: các chương trình Stackylogic cho OR và NAND là
? ?<
và
1 ?< 11 ? 0
Chúng có thể được kết hợp để mô phỏng
if B: result = x OR y else: result = x NAND y
như vậy
1 ? 110 ?0 00 0 ?< ?1 ?
Do đó, bất kỳ bảng chân lý nào cũng có thể được mô phỏng bằng chương trình Stackylogic.
Thử thách
Viết một chương trình hoặc chức năng mà mất trong một N thật đầu vào bảng (N> 0) theo hình thức của một danh sách của 2 N giá trị boolean đại diện cho kết quả đầu ra của bảng trong thứ tự tăng dần nhị phân.
Bất kỳ định dạng đầu vào hợp lý là ổn. ví dụ: bảng OR
x y | OR
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
bất kỳ kiểu đầu vào nào trong số này cũng sẽ ổn:
0111
0, 1, 1, 1
0
1
1
1
[False, True, True, True]
In hoặc trả về một chương trình Stackylogic thỏa mãn bảng chân lý, nghĩa là có cùng một đầu ra chính xác cho cùng một đầu vào. Bất kỳ chương trình hữu hạn nào thỏa mãn bảng đó là đầu ra hợp lệ. Bạn không cần phải làm theo phương pháp xây dựng bằng chứng quy nạp. Các chương trình Stackylogic không cần phải ngắn gọn tối ưu.
Ví dụ: nếu đầu vào là 11100111
, một đầu ra hợp lệ sẽ là
1
?
110
?0
00
0
?<
?1
?
nhưng có nhiều người khác
Mã ngắn nhất tính bằng byte thắng.
Xem thử thách Stackylogic ban đầu nếu bạn cần một thông dịch viên.