파이크, 5 자
0h.CE
이것은 무한히 많은 수를 만들어 문자열로 바꾸고 파이크 코드로 평가할 수 있습니다.
코드 설명 :
0
-스택에 0을 추가하십시오. 이것은 숫자를 시작하는 데 필요합니다
h
-전에 숫자를 늘리십시오. 이것을 임의의 횟수만큼 반복하면 무한히 큰 숫자를 만들 수 있습니다. Pyke는 파이썬으로 작성된 큰 숫자를 지원합니다.이 숫자는 기본값으로 사용됩니다.
.C
-다음 알고리즘을 사용하여 숫자를 문자열로 바꿉니다 : ( 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
이 시점에서 Pyke에서 임의의 값으로 임의의 양의 문자열과 자연수를 만들 수 있습니다. 정규식에 해당하는 형식으로 숫자를 만들 수 있으며 다음 0(h)*
과 같이 문자열을 만들 수 있습니다.0(h)*.C
. 그것들은 서로 섞여서 문자열과 정수의 임의의 혼합을 만들 수 있습니다.
E
-문자열을 파이크 코드로 평가하십시오. 이것은 이미 실행중인 파이크 코드와 동일한 환경을 사용하므로 입력과 같은 것을 공유합니다.
파이크가 튜링 완료되었다는 증거를 시도했습니다.
언어를 보여주는 가장 간단한 방법 중 하나는 튜링을 완료하는 것입니다. Pyke가 실행되도록 설계된 영역에서 코드 가 필요하지 않기 때문에 목록 및 사전 작업이 거의 없기 때문에 Pyke에서 다른 언어보다 훨씬 어려울 수 있습니다 .
첫째로 우리는 brainf의 * CK 등록에 대한 통역을 생성하고 숫자를 만든 다음에 그 숫자를 표현하기 위해 위의 알고리즘을 사용하여 인코딩 0
하고 h
. 그런 다음 정확히 같은 방식으로 실행할 코드가 포함 된 문자열을 만듭니다. 만약 우리가 그것을 그대로두면 스택은
string containing brainf*ck code
string containing brainf*ck interpreter
이것은 Pyke 스택이 마지막으로 끝나기 때문에 코드가 반대 형식이어야 함을 의미합니다.
이제 재미있는 부분은 무려 216 바이트 인 brainf * ck 인터프리터입니다!
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