Pyke, 5 ký tự
0h.CE
Điều này có khả năng tạo ra một số lượng lớn vô hạn, biến nó thành một chuỗi và sau đó đánh giá nó là mã Pyke.
Giải thích về mã:
0
- Thêm 0 vào ngăn xếp. Điều này là bắt buộc để bắt đầu một số
h
- Tăng số trước. Bằng cách lặp lại điều này một số lần tùy ý, bạn có thể tạo ra những con số vô cùng lớn. Pyke hỗ trợ các bignums vì nó được viết bằng Python, sử dụng chúng làm mặc định.
.C
- Biến một số thành một chuỗi bằng thuật toán sau: ( Liên kết Github )
def to_string(num):
string = ""
while num > 256:
num, new = divmod(num, 256)
string = chr(new) + string
string = chr(num) + string
return string
Đến thời điểm này, chúng ta có thể tạo ra một số lượng chuỗi và số tự nhiên trong Pyke với các giá trị tùy ý. Các số có thể được tạo ở dạng tương ứng với biểu thức chính quy0(h)*
và chuỗi có thể được tạo bằng 0(h)*.C
. Chúng có thể được đan xen với nhau để tạo ra một hỗn hợp tùy ý của chuỗi và số nguyên.
E
- đánh giá một chuỗi dưới dạng mã Pyke. Điều này sử dụng môi trường giống như mã Pyke đã chạy nên sẽ chia sẻ những thứ như đầu vào.
Cố gắng chứng minh rằng Pyke là Turing Complete.
Một trong những cách đơn giản nhất để thể hiện một ngôn ngữ đang hoàn thiện là bằng cách triển khai Brainf * ck trong đó. Điều này có lẽ khó hơn nhiều ở Pyke so với nhiều ngôn ngữ khác vì danh sách và hoạt động từ điển của nó gần như không tồn tại do không cần chúng trong khu vực Pyke được thiết kế để chạy trong: golf-code .
Đầu tiên, chúng tôi tạo một trình thông dịch cho brainf * ck và mã hóa nó bằng thuật toán của chúng tôi ở trên để tạo một số và sau đó thể hiện số đó bằng 0
và h
. Sau đó chúng ta tạo chuỗi chứa mã được chạy theo cùng một cách. Nếu chúng ta để nó ở đó, chúng ta sẽ có ngăn xếp như
string containing brainf*ck code
string containing brainf*ck interpreter
Điều này có nghĩa là mã phải ở dạng ngược lại vì ngăn xếp Pyke là lần đầu tiên xuất hiện cuối cùng.
Bây giờ là phần thú vị: trình thông dịch brainf * ck với con số khổng lồ là 216 byte!
Q~B"><ht.,".:=B;Z]1=L;W~Bo@D=c"ht"{I~c~LZ@EZ]1~LR3:=L)~c\,qIz.oZ]1~LR3:=L)~c\.qI~LZ@.CpK)~c"<>"{I~c"<>""th".:ZE=ZZ1_qI0=Z~L0"":0]10:=L)Z~LlqI~L~Ll"":1_]10:=L))~c\[qI~LZ@0qI\]~B~o>@~o+h=o))~c\]qI~o\[~B~o<_@-t=o)~o~BlN
Hãy thử nó ở đây!
Nếu bạn muốn thử mã ở dạng bán hoàn thành nhưng có thể chỉnh sửa, hãy thử ở đây!
Để chuyển đổi từ một chuỗi thành một số, bạn có thể sử dụng mã Python sau:
def conv(string, t=0):
t *= 256
t += ord(string[0])
if len(string) != 1:
return conv(string[1:], t)
return t
Giải pháp (gần như) cuối cùng có thể được thử ở đây!
Giải thích về thông dịch viên Brainf * ck
Đầu tiên cho phép tách chương trình thành các phần:
Là một tài tài, hay nói, qua, qua, qua một khác, qua giữ, qua, qua một khác, qua, qua, qua, khi khác mới, khác mới, khi khác mới đăng, mới, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng cam cam
Q~B"><ht.,".:=B;Z]1=L; - The initialisation part
Q~B"><ht.,".: - input.replace("><+-.,[]", "><ht.,")
- replace the characters in brainf*ck with some modified ones.
- this means we can `eval` the add and subtract bits easily.
=B; - set `B` to this.
- The `B` variable contains the instructions
Z]1=L; - set `L` to [0]
- `L` contains the stack, initialised with 0
Hay nói, là một tài tài của, qua, qua, qua một khác, qua giữ, qua, qua một tài khác, qua, khác qua, qua, khi khác mới mới đăng,, mới mới đăng, mới đăng, mới đăng, mới đăng, mới cam mới, mới đăng, mới đăng, mới đăng ký đăng cam
W~Bo@D=c !code! ~o~BlN - The main loop
W - do
~Bo@D=c - c=B[o++]
- the c variable is used to store the current character.
~o~BlN - while
~o - o
N - ^ != V
~Bl - len(B)
- this stops the program running once it's finished.
Hay nói, là một tài tài của, qua, qua, qua một khác, qua giữ, qua, qua một tài khác, qua, khác qua, qua, khi khác mới mới đăng,, mới mới đăng, mới đăng, mới đăng, mới đăng, mới cam mới, mới đăng, mới đăng, mới đăng ký đăng cam
"ht"{I~c~LZ@EZ]1~LR3:=L) - The bit that does incrementing and decrementing
"ht"{I ) - if c in "ht"
~LZ@ - L[Z]
- `Z` contains the current stack pointer
~c E - eval current character with ^ as an argument
- returns the contents of `Z` either incremented or decremented
Z]1~LR3:=L - L[Z] = ^
Hay nói, là một tài tài của, qua, qua, qua một khác, qua giữ, qua, qua một tài khác, qua, khác qua, qua, khi khác mới mới đăng,, mới mới đăng, mới đăng, mới đăng, mới đăng, mới cam mới, mới đăng, mới đăng, mới đăng ký đăng cam
~c\,qIz.oZ]1~LR3:=L) - The code for output
~c\,qI ) - if character == ",":
z.o - ord(input)
Z]1~LR3:=L - L[Z] = ^
Hay nói, là một tài tài của, qua, qua, qua một khác, qua giữ, qua, qua một tài khác, qua, khác qua, qua, khi khác mới mới đăng,, mới mới đăng, mới đăng, mới đăng, mới đăng, mới cam mới, mới đăng, mới đăng, mới đăng ký đăng cam
~c\.qI~LZ@.CpK) - The code for input
~c\.qI ) - if c == ".":
~LZ@ - L[Z]
.C - chr(^)
pK - print(^)
- Chuyển sang trái / phải
<>
::
Hay nói, là một tài tài của, qua, qua, qua một khác, qua giữ, qua, qua một tài khác, qua, khác qua, qua, khi khác mới mới đăng,, mới mới đăng, mới đăng, mới đăng, mới đăng, mới cam mới, mới đăng, mới đăng, mới đăng ký đăng cam
~c"<>"{I~c"<>""th".:ZE=Z - main part
~c"<>"{I - if "<>" in c:
~c"<>""th".: - c.replace("<>", "th")
ZE=Z - Z = eval(char, Z)
Z1_qI0=Z~L0"":0]10:=L) - lower bound check
Z1_qI ) - if Z == -1:
0=Z - Z = 0
~L0"": - L.insert("", 0)
0]10:=L - L[0] = 0
Z~LlqI~L~Ll"":1_]10:=L) - upper bound check
Z~LlqI ) - if Z == len(L):
~Ll"": - L.insert("", len(L))
~L 1_]10:=L - L[-1] = 0
Hay nói, là một tài tài của, qua, qua, qua một khác, qua giữ, qua, qua một tài khác, qua, khác qua, qua, khi khác mới mới đăng,, mới mới đăng, mới đăng, mới đăng, mới đăng, mới cam mới, mới đăng, mới đăng, mới đăng ký đăng cam
~c\[qI~LZ@0qI\]~B~o>@~o+h=o)) - Code for `[`
~c\[qI ) - if c == "[":
~LZ@0qI ) - if L[Z] == 0:
~B~o> - B[o:]
\] @ - ^.find("]")
~o+h=o - o = o + ^ + 1
- Và ]
:
Hay nói, là một tài tài của, qua, qua, qua một khác, qua giữ, qua, qua một tài khác, qua, khác qua, qua, khi khác mới mới đăng,, mới mới đăng, mới đăng, mới đăng, mới đăng, mới cam mới, mới đăng, mới đăng, mới đăng ký đăng cam
~c\]qI~o\[~B~o<_@-t=o) - Code for `]`
~c\]qI ) - if c == "]":
~B~o<_ - reversed(B[:o])
\[ @ - ^.find("[")
~o -t=o - o = o - ^ -1