Pyke, 5 karakter
0h.CE
Bu, sonsuz büyük bir sayı üretme, onu dizeye çevirme ve Pyke kodu olarak değerlendirme yeteneğine sahiptir.
Kodun açıklaması:
0
- Yığına 0 ekleyin. Bu bir numara başlatmak için gereklidir
h
- Önündeki sayıyı arttır. Bunu keyfi bir şekilde tekrarlayarak, çok büyük sayılar oluşturabilirsiniz. Pyke, onları varsayılan olarak kullanan Python'da yazıldığı gibi bignumları destekler.
.C
- Aşağıdaki algoritmayı kullanarak bir sayıyı dizgeye çevirin: ( Github link )
def to_string(num):
string = ""
while num > 256:
num, new = divmod(num, 256)
string = chr(new) + string
string = chr(num) + string
return string
Bu noktada, Pyke'de keyfi değerleri olan keyfi bir dizi dizge ve doğal sayı oluşturabiliriz. Regex'e karşılık gelen formda sayılar oluşturulabilir 0(h)*
ve dizelerle oluşturulabilir.0(h)*.C
. Dizgilerin ve tam sayıların rastgele bir karışımını oluşturmak için birbirleriyle iç içe geçebilirler.
E
- bir dize Pyke kodu olarak değerlendirin. Bu, zaten çalışmakta olan Pyke kodu ile aynı ortamı kullanır, böylece girdi gibi şeyleri paylaşır.
Pyke'in Turing'in Tamamlandığına dair kanıt denendi.
Bir dili göstermenin en basit yollarından biri tamamlamanın turing olduğunu Brainf * ck'yi onun içine uygulamaktır. : O listesi ve sözlük operasyonlar nedeniyle Pyke çalışacak şekilde tasarlanmıştır alanda onlara ihtiyacı olmadığı için varolmayan oldukça fazla olduğundan bu birçok dilden daha çok zor Pyke içinde muhtemelen kod golf .
İlk önce brainf * ck için bir tercüman yaratır ve yukarıdaki sayıyı oluşturmak için algoritmamızı kullanarak kodlar ve sonra bu sayıyı 0
ve ile ifade ederiz h
. Daha sonra aynı şekilde çalışacak kodu içeren dizgeyi yaratıyoruz. Bunu bırakacak olsaydık, yığını olduğu gibi tutardık.
string containing brainf*ck code
string containing brainf*ck interpreter
Bunun anlamı, Pyke yığını ilk girişte olduğu gibi kodun zıt biçimde olması gerektiğidir.
Şimdi eğlenceli kısım: brainf * ck yorumlayıcı bir kuyruklu 216 byte ile!
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
Burada dene!
Kodu yarı tamamlanmış ancak düzenlenebilir biçimde denemek istiyorsanız, burada deneyin!
Bir dizeden sayıya dönüştürmek için aşağıdaki Python kodunu kullanabilirsiniz:
def conv(string, t=0):
t *= 256
t += ord(string[0])
if len(string) != 1:
return conv(string[1:], t)
return t
(Neredeyse) nihai çözüm burada denenebilir!
Brainf * ck yorumlayıcısının açıklaması
İlk önce programı parçalara ayırın:
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
- Ve ]
:
~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