A reversible language is a programming language where no operation is capable of destroying information. That means that with the output and a program you can always determine the input provided.
This has some interesting implications for IO. For example in Unbalanced the following program "adds two numbers":
>{[>(}[>{[[>>)
This takes input in the form of
a, b
and outputs
b-1, a+b
Currently this is not a valid addition program because b-1
is output along side the actual output. However since Unbalanced is reversible and addition is not a bijection, a "true addition program" by the sites standards is impossible. In order for the output to be traced back to the input there is always going to be at least one other number on the stack.
It seems like we should allow this. We typically allow languages that always output a bit extra to compete. For example Octave prepends its output with ans =
. We allow this because its unavoidable and we want languages like Octave to compete. I believe that the same argument should apply to reversible languages. However if we are not careful in how we allow output for reversible languages we may open up loopholes.
Is there a good way to allow reversible languages to compete in non-bijective challenges?