aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Wang2024-03-02 21:02:45 -0500
committerAnthony Wang2024-03-02 21:02:45 -0500
commit97c68488f022ea79feb42e0146e2801179e1a3bf (patch)
treedf7246dc77b67cb71c750e8f3a9d10a5df5c7aaa
parent494de8e432e4e13f92800600467057c533b6bdd4 (diff)
Loop program until (0, 0) is 0 so that Flip can actually be Turing-completeHEADmaster
-rw-r--r--README.md2
-rwxr-xr-xflipper.py7
2 files changed, 7 insertions, 2 deletions
diff --git a/README.md b/README.md
index 9aed280..b6696ec 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,7 @@ We think you'll agree that the first version is way more aesthetically pleasing
If you haven't figured it out yet, the Flip program above is [NAND](https://en.wikipedia.org/wiki/NAND_logic#Making_other_gates_by_using_NAND_gates)! Currently, the final line outputs 0, but remove either of the first two lines, and the final output becomes 1. This makes Flip (drumroll please)... Turing complete!
-There's only one catch. Since finite Flip programs are guaranteed to terminate, Turing completeness requires Flip programs to possibly be infinitely long. Good luck!
+Actually, not quite. Since finite Flip programs are guaranteed to terminate, Turing completeness requires Flip programs to be able to loop forever. One way to do this is to repeat the program until the cell `(0, 0)` is 1 at the end of a repetition of the program.
Even better, a Flip interpreter can be trivially implemented in your favorite programming language. See [Flipper](flipper.py) for the official reference implementation written in Python.
diff --git a/flipper.py b/flipper.py
index 9d06546..27dcd70 100755
--- a/flipper.py
+++ b/flipper.py
@@ -12,9 +12,14 @@ def flip(x, y):
return mem[x][y]
with open(argv[1]) as f:
- for line in f.readlines():
+ lines = f.readlines()
+
+while True:
+ for line in lines:
l = list(map(int, line.split()))
x = l[0]
for i in range(1, len(l)):
x = flip(x, l[i])
print(x)
+ if 0 not in mem[0] or mem[0][0] == 0:
+ exit()