Mercurial > repo
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/interps/qbf/qbf.py Sun Dec 09 19:30:08 2012 +0000 @@ -0,0 +1,90 @@ +#!/usr/bin/python + +# A Quantum Brainfuck interpreter +# For now, very basic with no error checking +# Implements extra commands: +# '1' initializes the current cell to 1 +# '0' initializes the current cell to 0 +# '#' outputs the probabilities of all the different possible states + +import qubit +import sys + +DEBUG = True # Adds some extra helpful commands + +if len(sys.argv) != 2: + print "Usage:", sys.argv[0], "<filename>" + raise SystemExit + +infile = file(sys.argv[1]) + +program = infile.read() +memory = qubit.Register(2) +qubit_positions = range(2) +mp = 0 +cp = 0 + +while cp < len(program): + cmd = program[cp] + if cmd == '<': + mp -= 1 + elif cmd == '>': + mp += 1 + if mp >= memory.length: + qubit_positions.append(memory.length) + memory.add_bit() + if mp >= 20: + # just a precaution, feel free to remove this + print "Pointer moved right too many qubits; terminating" + elif cmd == '%': + qubit.Hadamard.apply(memory, [qubit_positions[mp]]) + elif cmd == '!': + qubit.CV.apply(memory,[qubit_positions[mp],qubit_positions[mp+1]]) + elif cmd == '&': + temp = qubit_positions[mp] + qubit_positions[mp] = qubit_positions[mp+1] + qubit_positions[mp+1] = temp + elif cmd == '.': + # Output the qubit + # For now, output it as a '1' or '0' and output causes observation + output = memory.observe(qubit_positions[mp]) + print output, + elif cmd == ',': + # input a qubit + i = raw_input("\nPlease enter 1 or 0: ") + i = int(i) + assert i == 1 or i == 0 + memory.set(qubit_positions[mp], i) + elif cmd == '[': + # observe the current qubit, loop if it's 1 + bit = memory.observe(qubit_positions[mp]) + if not bit: + # skip till the end of the loop + bracket_level = 1 + while bracket_level: + cp += 1 + if program[cp] == '[': bracket_level += 1 + if program[cp] == ']': bracket_level -= 1 + elif cmd == ']': + # just go back to the matching bracket + bracket_level = -1 + while bracket_level: + cp -= 1 + if program[cp] == '[': bracket_level += 1 + if program[cp] == ']': bracket_level -= 1 + cp -= 1 + # Now, some helpful debugging commands: + elif DEBUG and cmd == '1': + memory.set(qubit_positions[mp], 1) + elif DEBUG and cmd == '0': + memory.set(qubit_positions[mp], 0) + elif DEBUG and cmd == '#': + # pretty print memory contents + for i in range(len(memory.contents)): + print '|'+''.join([str(b) for b in qubit.n2bits(i,memory.length)])+'>', + print '%.2f' % (abs(memory.contents[i])**2), + + else: + # do nothing + pass + cp += 1