Pyke, 5 Zeichen
0h.CE
Dies ist in der Lage, eine unendlich große Zahl zu erzeugen, sie in eine Zeichenkette umzuwandeln und sie dann als Pyke-Code auszuwerten.
Erklärung des Codes:
0
- Addiere 0 zum Stapel. Dies ist erforderlich, um eine Nummer zu starten
h
- Erhöhen Sie die Nummer zuvor. Wenn Sie dies beliebig oft wiederholen, können Sie Zahlen erstellen, die unendlich groß sind. Pyke unterstützt Bignums, wie es in Python geschrieben ist, das sie als Standard verwendet.
.C
- Verwandle eine Zahl mit dem folgenden Algorithmus in einen String: ( 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
Zu diesem Zeitpunkt können wir in Pyke eine beliebige Anzahl von Zeichenfolgen und natürlichen Zahlen mit beliebigen Werten erstellen. Zahlen können in der Form erstellt werden, die dem regulären Ausdruck entspricht, 0(h)*
und Zeichenfolgen können mit erstellt werden 0(h)*.C
. Sie können miteinander verwoben werden, um eine beliebige Mischung aus Zeichenfolgen und ganzen Zahlen zu erstellen.
E
- einen String als Pyke-Code auswerten. Dies verwendet die gleiche Umgebung wie der Pyke-Code, der bereits ausgeführt wird, sodass Dinge wie die Eingabe geteilt werden.
Versuchter Beweis, dass Pyke Turing Complete ist.
Eine der einfachsten Möglichkeiten, eine Sprache vollständig darzustellen, ist die Implementierung von Brainf * ck. Dies ist in Pyke wahrscheinlich viel schwieriger als in vielen anderen Sprachen, da die Listen- und Wörterbuchoperationen so gut wie nicht vorhanden sind, da sie in dem Bereich, in dem Pyke ausgeführt werden soll, nicht benötigt werden: Code-Golf .
Zuerst erstellen wir einen Interpreter für brainf * ck und codieren ihn mit unserem obigen Algorithmus, um eine Zahl zu erstellen und diese Zahl dann mit 0
und auszudrücken h
. Wir erstellen dann den String, der den Code enthält, der genauso ausgeführt werden soll. Wenn wir es dabei belassen würden, hätten wir den Stapel als
string containing brainf*ck code
string containing brainf*ck interpreter
Dies bedeutet, dass der Code in der entgegengesetzten Form vorliegen muss, da der Pyke-Stack als Erster an letzter Stelle steht.
Nun zum spaßigen Teil: dem Brainf * ck-Interpreter mit satten 216 Bytes!
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
Probieren Sie es hier aus!
Wenn Sie den Code in unvollständiger, aber bearbeitbarer Form ausprobieren möchten, ausprobieren probieren Sie ihn hier aus!
Um einen String in eine Zahl umzuwandeln, können Sie den folgenden Python-Code verwenden:
def conv(string, t=0):
t *= 256
t += ord(string[0])
if len(string) != 1:
return conv(string[1:], t)
return t
Die (fast) endgültige Lösung kann sein ausprobiert werden!
Erklärung des Brainf * ck-Interpreters
Lassen Sie uns zuerst das Programm in Teile trennen:
Für den Fall, dass Sie nicht mehr weiterkommen möchten
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
Für den Fall, dass Sie nicht mehr weiterkommen möchten
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.
Für den Fall, dass Sie nicht mehr weiterkommen möchten
"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] = ^
Für den Fall, dass Sie nicht mehr weiterkommen möchten
~c\,qIz.oZ]1~LR3:=L) - The code for output
~c\,qI ) - if character == ",":
z.o - ord(input)
Z]1~LR3:=L - L[Z] = ^
Für den Fall, dass Sie nicht mehr weiterkommen möchten
~c\.qI~LZ@.CpK) - The code for input
~c\.qI ) - if c == ".":
~LZ@ - L[Z]
.C - chr(^)
pK - print(^)
- Verschiebung nach links / rechts
<>
:
Für den Fall, dass Sie nicht mehr weiterkommen möchten
~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
Für den Fall, dass Sie nicht mehr weiterkommen möchten
~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
- Und ]
:
Für den Fall, dass Sie nicht mehr weiterkommen möchten
~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