Mercurial > repo
comparison interps/qbf/qbf.py @ 996:859f9b4339e6
<Gregor> tar xf egobot.tar.xz
author | HackBot |
---|---|
date | Sun, 09 Dec 2012 19:30:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
995:6883f5911eb7 | 996:859f9b4339e6 |
---|---|
1 #!/usr/bin/python | |
2 | |
3 # A Quantum Brainfuck interpreter | |
4 # For now, very basic with no error checking | |
5 # Implements extra commands: | |
6 # '1' initializes the current cell to 1 | |
7 # '0' initializes the current cell to 0 | |
8 # '#' outputs the probabilities of all the different possible states | |
9 | |
10 import qubit | |
11 import sys | |
12 | |
13 DEBUG = True # Adds some extra helpful commands | |
14 | |
15 if len(sys.argv) != 2: | |
16 print "Usage:", sys.argv[0], "<filename>" | |
17 raise SystemExit | |
18 | |
19 infile = file(sys.argv[1]) | |
20 | |
21 program = infile.read() | |
22 memory = qubit.Register(2) | |
23 qubit_positions = range(2) | |
24 mp = 0 | |
25 cp = 0 | |
26 | |
27 while cp < len(program): | |
28 cmd = program[cp] | |
29 if cmd == '<': | |
30 mp -= 1 | |
31 elif cmd == '>': | |
32 mp += 1 | |
33 if mp >= memory.length: | |
34 qubit_positions.append(memory.length) | |
35 memory.add_bit() | |
36 if mp >= 20: | |
37 # just a precaution, feel free to remove this | |
38 print "Pointer moved right too many qubits; terminating" | |
39 elif cmd == '%': | |
40 qubit.Hadamard.apply(memory, [qubit_positions[mp]]) | |
41 elif cmd == '!': | |
42 qubit.CV.apply(memory,[qubit_positions[mp],qubit_positions[mp+1]]) | |
43 elif cmd == '&': | |
44 temp = qubit_positions[mp] | |
45 qubit_positions[mp] = qubit_positions[mp+1] | |
46 qubit_positions[mp+1] = temp | |
47 elif cmd == '.': | |
48 # Output the qubit | |
49 # For now, output it as a '1' or '0' and output causes observation | |
50 output = memory.observe(qubit_positions[mp]) | |
51 print output, | |
52 elif cmd == ',': | |
53 # input a qubit | |
54 i = raw_input("\nPlease enter 1 or 0: ") | |
55 i = int(i) | |
56 assert i == 1 or i == 0 | |
57 memory.set(qubit_positions[mp], i) | |
58 elif cmd == '[': | |
59 # observe the current qubit, loop if it's 1 | |
60 bit = memory.observe(qubit_positions[mp]) | |
61 if not bit: | |
62 # skip till the end of the loop | |
63 bracket_level = 1 | |
64 while bracket_level: | |
65 cp += 1 | |
66 if program[cp] == '[': bracket_level += 1 | |
67 if program[cp] == ']': bracket_level -= 1 | |
68 elif cmd == ']': | |
69 # just go back to the matching bracket | |
70 bracket_level = -1 | |
71 while bracket_level: | |
72 cp -= 1 | |
73 if program[cp] == '[': bracket_level += 1 | |
74 if program[cp] == ']': bracket_level -= 1 | |
75 cp -= 1 | |
76 # Now, some helpful debugging commands: | |
77 elif DEBUG and cmd == '1': | |
78 memory.set(qubit_positions[mp], 1) | |
79 elif DEBUG and cmd == '0': | |
80 memory.set(qubit_positions[mp], 0) | |
81 elif DEBUG and cmd == '#': | |
82 # pretty print memory contents | |
83 for i in range(len(memory.contents)): | |
84 print '|'+''.join([str(b) for b in qubit.n2bits(i,memory.length)])+'>', | |
85 print '%.2f' % (abs(memory.contents[i])**2), | |
86 | |
87 else: | |
88 # do nothing | |
89 pass | |
90 cp += 1 |