Đưa ra một bảng chân lý, xuất ra một chương trình Stackylogic thỏa mãn nó


17

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ột 0 hoặc 1sau 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ột 0, 1hoặ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:

  1. 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 a 0hoặc a 1và 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).
  2. 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 0hoặc 1) và kết thúc chương trình.

  3. 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 0hoặc 1. Tương đương Stackylogic của các bảng này 0<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

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ậy 0, con trỏ sẽ di 0chuyể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ếu 1là đầu vào, con trỏ sẽ di chuyển 1xuố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à

?
?<

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.


Chúng ta có thể lấy N làm đầu vào thứ hai không?
Rò rỉ Nun

@LeakyNun Có (hoặc 2 ^ N), nếu cần.
Sở thích của Calvin

Câu trả lời:


8

Bình thường, 53 byte

L?tb,lehJyMc2bsX0.e.e+W>_Wk-Yhb0ZkebJ\?,0]`hbjXF+yQ\<

Thử trực tuyến

Đây là một triển khai chính xác của hệ thống được mô tả trong thử thách về cách triển khai các bảng chân lý tùy ý trong Stackylogic. Chúng tôi chỉ cần cắt một nửa bảng chân lý, thực hiện đệ quy và sau đó nối 0 và 1 nếu thích hợp.

Điều này xác định một hàm đệ quy, có giá trị trả về là [1, ['0', '?', '1']], trong đó số đầu tiên là vị trí của con trỏ và phần còn lại là chương trình stackylogic.

L?tb,lehJyMc2bsX0.e.e+W>_Wk-Yhb0ZkebJ\?,0]`hbjXF+yQ\<
                                                         Q = eval(input())
L?tb,lehJyMc2bsX0.e.e+W>_Wk-Yhb0ZkebJ\?,0]`hb
L                                                 def y(b): return
 ?tb                                              if b[1:] (base case on false)
                                      ,0]`hb      else: [0, str([0])]
                                                  then:
           c2b                                    Cut the input in half
         yM                                       Map y over the halves
        J                                         Store that in J
    ,leh                                          The cursor position is the length 
                                                  of the body of the first function
                 .e                 J             enum-map, where k is the index
                                                  and b is the value, over J
                   .e             eb              enum-map, Y is the index and
                                                  Z is the value, over body of b
                     +W         Zk                Add to Z (line) k (the overall 
                                                  index, 0 or 1) conditional on
                          -Yhb                    Y (line index) - cursor
                       _Wk                        Negated if k
                      >       0                   > 0
               X0                    \?           Add '?' to the first element
              s                                   Concatenate, giving the body

jXF+yQ\<
    yQ      Call the above on the input
   +  \<    Append a '<'
 XF         Splat the 3 element list into the 'append-at' function,
            adding the curson in the right place
j           Join on newlines and print.

Chà ... tôi vừa trở về nhà để sửa giải pháp của mình ...
Leaky Nun

3

Python 3, 352 208 205 byte

Điều này vẫn còn rất vô căn cứ, và tôi sẽ cố gắng thêm một lời giải thích sau. Sau một số sửa đổi, tôi quản lý để loại bỏ 144 147 byte.

f=lambda x,l=len,r=range:'\n'.join(*x)if l(x)<2 else f([[x[i][j]+['0',''][j<=l(x[i])//2]for j in r(l(x[i]))]+[['?','?<'][l(x)<3]]+[x[i+1][j]+['1',''][j>=l(x[i])//2]for j in r(l(x[i]))]for i in r(0,l(x),2)])

Một hàm flấy đầu vào của các giá trị bảng chân trị làm danh sách Booleans của biểu mẫu ['1','1','1','0','0','1'...], ở đó '1'là trung thực và '0'là falsey, và trả về chương trình Stackylogic.

Hãy thử nó trên Ideone

Nếu bạn muốn kiểm tra một chương trình được sản xuất, bạn có thể sử dụng trình thông dịch Convex của GamrCorps tại đây .

Làm thế nào nó hoạt động

Đây là một hàm đệ quy và sử dụng phương pháp quy nạp được mô tả trong câu hỏi.

Ở cấp độ đệ quy không có chỉ mục a, hàm tạo n/2 a+1các chương trình Stackylogic -input từ các chương trình -input n atrong danh sách. Điều này được thực hiện bằng cách tham gia tất cả các cặp liền kề của hai chương trình trong danh sách với ?; do con trỏ luôn nằm ở phần tử giữa của mỗi chương trình cấu thành, nên việc nối thêm 0hoặc 1có thể được thực hiện bằng cách lặp qua từng dòng của chương trình được nối và nối thêm nếu chỉ số của dòng hiện tại nhỏ hơn hoặc bằng / lớn hơn hơn hoặc bằng chỉ số trung bình khi thích hợp. Nếu danh sách chỉ chứa hai chương trình, cuộc gọi đệ quy tiếp theo sẽ đưa ra chương trình cuối cùng; vì điều này đòi hỏi một con trỏ, tham gia thay vì xảy ra trên ?<.

Khi danh sách có độ dài 1, danh sách phải chứa chỉ một phần tử chứa toàn bộ chương trình. Do đó, tất cả các dòng trong chương trình được nối trên một dòng mới, và sau đó được trả lại.

Một ví dụ giúp minh họa điều này:

Take the input ['1', '1', '1', '0', '0', '1', '1', '1'].

Level  Return value

0  [['1', '?', '1'], ['1', '?', '0'], ['0', '?', '1'], ['1', '?', '1']]
1  [['1', '?', '10', '?', '11', '?', '0'], ['0', '?', '10', '?', '11', '?', '1']]
2  [['1', '?', '10', '?', '110', '?0', '00', '?<', '01', '?1', '101', '?', '11', '?', '1']]
3  '1\n?\n10\n?\n110\n?0\n00\n?<\n01\n?1\n101\n?\n11\n?\n1'

which when printed gives:

1
?
10
?
110
?0
00
?<
01
?1
101
?
11
?
1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.