Pyke 5 ตัวอักษร
0h.CE
นี่คือความสามารถในการผลิตจำนวนมากอย่างไม่ จำกัด เปลี่ยนเป็นสตริงแล้วประเมินว่าเป็นรหัส Pyke
คำอธิบายของรหัส:
0
- เพิ่ม 0 เข้ากับสแต็ก สิ่งนี้จำเป็นสำหรับการเริ่มต้นหมายเลข
h
- เพิ่มจำนวนก่อน ด้วยการทำซ้ำนี้เป็นจำนวนครั้งโดยพลการคุณสามารถสร้างตัวเลขที่มีขนาดใหญ่มาก Pyke รองรับ bignums ตามที่เขียนไว้ใน Python ซึ่งใช้เป็นค่าเริ่มต้น
.C
- เปลี่ยนตัวเลขให้เป็นสตริงโดยใช้อัลกอริทึมต่อไปนี้: ( ลิงก์ Github )
def to_string(num):
string = ""
while num > 256:
num, new = divmod(num, 256)
string = chr(new) + string
string = chr(num) + string
return string
ถึงตอนนี้เราสามารถสร้างจำนวนของสตริงและจำนวนธรรมชาติใน Pyke ได้ตามอำเภอใจ เบอร์ที่สามารถสร้างขึ้นในรูปแบบที่สอดคล้องกับ regex และสตริงสามารถสร้างขึ้นด้วย0(h)*
0(h)*.C
พวกเขาสามารถผสมเข้าด้วยกันเพื่อสร้างส่วนผสมของสตริงและจำนวนเต็มโดยพลการ
E
- ประเมินสตริงเป็นรหัส Pyke สิ่งนี้ใช้สภาพแวดล้อมเดียวกันกับรหัส Pyke ที่ทำงานอยู่แล้วซึ่งจะแบ่งปันสิ่งต่างๆเช่นอินพุต
พยายามพิสูจน์ว่า Pyke กำลังทัวริงเสร็จสมบูรณ์
วิธีที่ง่ายที่สุดวิธีหนึ่งในการแสดงภาษาคือการทำให้ภาษาสมบูรณ์โดยใช้ Brainf * ck นี้อาจจะเป็นเรื่องยากใน Pyke กว่าภาษาอื่น ๆ อีกมากมายเพราะมันเป็นรายการและการดำเนินงานพจนานุกรมจะสวยมากไม่ได้มีอยู่เนื่องจากการขาดการต้องให้พวกเขาในพื้นที่ Pyke ถูกออกแบบมาเพื่อทำงานใน: รหัสกอล์ฟ
ประการแรกเราสร้างล่าม brainf * CK และเข้ารหัสโดยใช้อัลกอริทึมของเราด้านบนเพื่อสร้างตัวเลขแล้วแสดงตัวเลขที่มีและ0
h
จากนั้นเราจะสร้างสตริงที่มีรหัสเพื่อให้ทำงานในลักษณะเดียวกัน ถ้าเราปล่อยมันไว้อย่างนั้นเราก็จะได้สแต็คเป็น
string containing brainf*ck code
string containing brainf*ck interpreter
ซึ่งหมายความว่ารหัสจะต้องอยู่ในรูปแบบตรงข้ามเนื่องจาก Pyke stack เป็นลำดับสุดท้ายก่อน
ตอนนี้เพื่อความสนุกสนาน: ล่ามสมอง * ck ที่มีขนาดใหญ่ถึง 216 ไบต์!
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
ลองที่นี่!
หากคุณต้องการลองใช้รหัสในรูปแบบกึ่งสมบูรณ์ แต่สามารถแก้ไขได้ลองที่นี่!
ในการแปลงจากสตริงเป็นตัวเลขคุณสามารถใช้รหัส Python ต่อไปนี้:
def conv(string, t=0):
t *= 256
t += ord(string[0])
if len(string) != 1:
return conv(string[1:], t)
return t
วิธีแก้ปัญหาขั้นสุดท้าย (เกือบ) สามารถลองได้ที่นี่!
คำอธิบายของล่าม Brainf * ck
ก่อนอื่นให้แยกโปรแกรมออกเป็นส่วน ๆ :
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
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.
"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] = ^
~c\,qIz.oZ]1~LR3:=L) - The code for output
~c\,qI ) - if character == ",":
z.o - ord(input)
Z]1~LR3:=L - L[Z] = ^
~c\.qI~LZ@.CpK) - The code for input
~c\.qI ) - if c == ".":
~LZ@ - L[Z]
.C - chr(^)
pK - print(^)
~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
~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
- และ]
:
~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