Bueue

From Esolang
Jump to navigation Jump to search

Bueue (pronounced Büü) is an esoteric programming language. Every integer greater than 0 is a valid Bueue program. The integer is expanded to its Collatz sequence, which is then interpreted as a collection of sub-programs. Data is stored on a bit queue. The queue is shared between sub-programs. It is unknown if there are finite numbers that generate infinitely large Bueue programs.

Instructions

Instr. Description
0 Enqueue 0.
1 Enqueue 1.
2 Jump marker.
3 If the bit at the front of the queue is not 0, jump back to the last jump marker.
4 If the bit at the end of the queue is not 0, jump back to the last jump marker.
5 Rotate the queue (towards the front).
6 Flip the bit at the front of the queue.
7 Dequeue the bit at the front of the queue (that is, drop/remove it).
8 Print bit at the front of the queue.
9 Dequeue 8 bits (1 byte); convert to char (ascii) and print.

Implementation

(Python)

import sys

# Just to ensure that it really is a long.
num = long(raw_input())

# Programs are collatz sequences
def collatz(n):
  while n != 1:
    yield n
    if n > 1:
      if n % 2 == 0:
        n = n / 2
      else:
        n *= 3
        n += 1
  yield 1

bueue = []

# Language specification
#  A bueue program is a simple number
#  The bueue interpreter generates the collatz sequence
#  of that number and interprets each number in it as
#  a small subprogramm.
#
#  There is a queue available which can store bits.
#  Opcodes:
#   0 - enque 0
#   1 - enque 1
#   2 - jump marker
#   3 - if bit at front of the queue is not 0
#       jump back to the last jump marker
#   4 - if bit at end of the queue is not 0
#       jump back to the last jump marker
#   5 - rotate queue (rotate left)
#   6 - flip bit at the front of the queue
#   7 - deque bit at the front (that is
#       drop/remove it)
#   8 - print bit
#   9 - deque 8 bits (1 byte) convert to char (ascii) and print
  
for i in collatz(num):
  prg = str(i)
  #print "Debug: ", prg
  #raw_input()
  pos = 0
  max_pos = len(prg)
  poss = []
  while pos < max_pos:
    #print " ",bueue
    c = prg[pos]
    if(c == "0"):
      bueue.append(0)
    elif(c == "1"):
      bueue.append(1)
    elif(c == "2"):
      poss.append(pos)
    elif(c == "3"):
      if(len(poss) < 1):
        break
      if(len(bueue) < 1):
        break
      if(bueue[0] != 0):
        pos = poss.pop()
        continue
    elif(c == "4"):
      if(len(poss) < 1):
        break
      if(len(bueue) < 1):
        break
      if(bueue[-1] != 0):
        pos = poss.pop()
        continue
    elif(c == "5"):
      if(len(bueue) < 1):
        pos += 1
        continue
      bueue = bueue[1:] + [bueue[0]]
    elif(c == "6"):
      if(len(bueue) < 1):
        pos += 1
        continue
      if(bueue[0] == 0):
        bueue[0] = 1
      else:
        bueue[0] = 0
    elif(c == "7"):
      bueue = bueue[1:]
    elif(c == "8"):
      if(len(bueue) < 1):
        pos += 1
        continue
      sys.stdout.write(str(bueue[0]))
    elif(c == "9"):
      if(len(bueue) < 8):
        pos += 1
        continue
      bits = bueue[:8]
      bueue = bueue[8:]
      bits = reduce(lambda a,b: a + b,map(str,bits))
      ch = chr(int(bits,2))
      sys.stdout.write(ch)
    pos += 1

Example programs

So far not many example programs are known. It is known that 5 prints 0 and 13 prints 1. One can find more or less easily example programs by writing a program and ensuring that the interpreter stops at the last few digits so it does not evaluate other sub-programs by computing the Collatz sequence of your program. (Although that would only be possible if the interpreter had a bug which made it stop ;)). If you don't care to what the sub-programs evaluate (i.e if you don't even care if your program does not terminate) then finding example programs is trivial.

11000011694

With some imagination prints 'Cool' although it really prints 'COO1' and then loops forever.

1100100069011001019011011009011011009011011119

Prints 'Hello' and then does something else.

Truth-machine

x009

(x being either 1 or 0).

Computational Class

A single sub-program is probably not Turing complete, as the looping instructions are very restricted.

It's currently unknown whether a finite set of sub-programs is Turing complete (if the corresponding Collatz sequence reaches 1 and halts).

Since it is unknown whether the corresponding Collatz sequences reach 1 for all numbers or enter an infinite cycle, a Bueue program could produce an infinite number of sub-programs, which leads to the question whether an infinite amount of each non-Turing complete sub-program can yield Turing completeness.

However, everything is unknown. Because there is no proof (yet) whether a Collatz sequence of a given number reaches 1 or not, it is generally undecidable (for now) whether a Bueue program terminates.