We are currently working on new rules for what content should and shouldn't be allowed on this website, and are looking for feedback! See Esolang:2026 topicality proposal to view and give feedback on the current draft.

OTOH

From Esolang
Jump to navigation Jump to search

OTOH (standing for On The Other Hand and pronounced like "Hoth" without the "H") is a simple programming language designed to combine the technical advantages of assembly with the simplicity of a Turing machine. Suggestions, comments etc. are all welcome. (OTOH was created by User:Hiant, Fading Entity on 2010-09-04)

Language Overview

OTOH uses a Tape and a swap-space of two memory cells referred to as "hands" (16 bit RAM with 1 bit id's). "hand" values are initialized and default to 0. It has several very simple operators. These are:

  ~                           The flip operator, it switches the current "hand" to the other(default "hand" is 0 at execution)
  >                           Increment memory pointer
  <                           Decrement memory pointer
  ^                           Store contents of current memory cell in current "hand" (this zeros the memory cell)
  _                           Store contents of current "hand" into current memory cell (this zeros the "hand")
  "                           Adds (current hand) to (other hand) stores the result in current hand (destructive)
  '                           Same as +, but subtracts (other hand) from (current hand)
  :                           Same as +, but multiplies
  %                           Same as +, but current hand modulo other hand
  [                           If current cell is >0, continue, else skip to matching "]"
  ]                           If current cell is 0, end loop, else skip to matching "["
  ?                           Stores current "hand" id (0 or 1) to current memory cell
  ,                           ASCII Input
  .                           ASCII Output
  !                           Clone current hand into other (non-destructive)
  #                           Switch between ASCII and Numerical mode (initialized as ASCII)

Language Standards

  • Cells may not wrap-around
  • Cells may contain any number. (signed and unsigned)
  • EOF must be 0
  • The tape cannot wrap-around, but is considered infinite to the right

Computational Class

OTOH can easily be proven Turing complete through reduction from brainfuck.

Basic Structure

(Dec/Inc)rementing

Noticeably, OTOH lacks two very important BF commands, + and -. Instead, for the sake of obtuse-ification, creative use of the ? command is required. Both + and - can be simulated using this:

^?[_~^]~?^~@_

Where @ is either ' for - or " for +.

Not

The ? command can also function as a logical NOT.

^?[_~^]_~[~]?

And

The : command provides a numerical equivalent to AND.

Or

The " command provides a numerical equivalent to OR.

Hand Clear

Two multiplications (ex: (2,2):->(4,0):->(0,0))

::

Cell Clear

For current hand = 0

?

For currant hand = 1

~?

Examples

Hello World!

Hello World, but cheating using BF reduction for now.

^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^
[_~^?]~?^~"_^?[_~^?]~?^~"_[>^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?
[_~^?]~?^~"_>^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?
[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_>^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_>^?[_~^?]~?^~"_<<<<^?[_~^?]~?^~'_]>^?
[_~^?]~?^~"_^?[_~^?]~?^~"_.>^?[_~^?]~?^~"_.^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?
[_~^?]~?^~"_^?[_~^?]~?^~"_..^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_.>^?[_~^?]~?^~"_^?[_~^?]~?^~"_.<<^?[_~^?]~?^~"_^?
[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?
[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_.>.^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_.^?
[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_.^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?
[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_.>^?[_~^?]~?^~"_.>.

After optimization:

~?^?~^~"?~^~"?~^~"?~^~"_>?~^~"?~^~"~<^~:_[>^?~^~"?~^~"
?~^~"?~^~"?~^~"?~^~"?~^~"_>^?~^~"?~^~"?~^~"?~^~"?~^~"
?~^~"?~^~"?~^~"?~^~"?~^~"_>^?~^~"?~^~"?~^~"_>^?~^~"_
<<<<^?~^~'_]>^?~^~"?~^~"_.>^?~^~"_.^?~^~"?~^~"?~^~"?~^
~"?~^~"?~^~"?~^~"_..^?~^~"?~^~"?~^~"_.>^?~^~"?~^~"_.<<^
?~^~"?~^~"?~^~"?~^~"?~^~"?~^~"?~^~"?~^~"?~^~"?~^~"
?~^~"?~^~"?~^~"?~^~"?~^~"_.>.^?~^~"?~^~"?~^~"_.
^?~^~'?~^~'?~^~'?~^~'?~^~'?~^~'_.^?~^~'?~^~'?~^~'?~^~'?~
^~'?~^~'?~^~'?~^~'_.>^?~^~".>.

A reduction by a factor of 2!

Cat

Simple:

,[.,]

taC

Reverse Cat:

~>?[,^?~^~'?~^~'?~^~'?~^~'?~^~'
   ?~^~'?~^~'?~^~'?~^~'?~^~'_
[  ^?~^~"?~^~"?~^~"?~^~"?~^~"
   ?~^~"?~^~"?~^~"?~^~"?~^~"_
>,
   ^?~^~'?~^~'?~^~'?~^~'?~^~'
   ?~^~'?~^~'?~^~'?~^~'?~^~'_
]  ^?~^~"?~^~"?~^~"?~^~"?~^~"
   ?~^~"?~^~"?~^~"?~^~"?~^~"_
<[.<]>]

Not so simple.

External resources

Compiler

A to-ruby compiler exists. Download it from sprunge. (dead link)