Fishing

From Esolang
Jump to: navigation, search

Fishing is a two dimensional esoteric programming language created by User:OriginalOldMan in 2013. Programs are controlled by a fisherman who walks along a dock, casts, and catches different fish. Commands can be given through the dock that the fisherman walks on and through the fish that the fisherman catches. Fishing's memory is in the form of a tape like BF's memory tape.

Basics

The fisherman starts at the top left corner of the program and begins to move to the right through the program. If at any point the fisherman encounters a character that is not a valid piece of dock, the program ends.

Dock Piece Effect
D Does nothing. The fisherman will continue to move in his current direction.
C Makes the fisherman cast his line in the current direction with the current cast length.
+ Increases the fisherman's casting length by one character.

The casting length is automatically 0 at the start of the program.

- Decreases the fisherman's casting length by one character.
[ Causes the fisherman to start moving right.
] Causes the fisherman to start moving left.
_ Causes the fisherman to start moving downwards.
| Causes the fisherman to start moving upwards.
v Changes the fisherman's casting direction to downwards.
^ Changes the fisherman's casting direction to upwards.
< Changes the fisherman's casting direction to leftwards.
> Changes the fisherman's casting direction to rightwards.
? An if statement. If the current cell on the tape is equal to the cell on the right of the current cell,

then the fisherman begins to move in the direction of the = that should be placed next to the ?. Otherwise the fisherman will begin to move in the direction of the !.

Fish

When the fisherman casts, the character at the position of his cast will be considered the fish that he catches. The position of the cast is determined by the cast direction and the length of the cast. The fish will be interpreted depending on what character it is. When a fisherman catches a fish, that fish is not removed from the program.

Fish Effect
` Enters/Exits textmode. Any fish caught while in textmode will be added to the current cell on the tape.
P Prints the value of the current cell on the tape.
N Prints the value of the current cell on the tape with a newline after it.
n Converts the current cell to a number (a floating decimal).
I Takes the user input and sets the current cell equal to it. User input is by default a string.
{ Moves to the cell to the right of the current cell on the tape.
} Moves to the cell to the left of the current cell on the tape.
E Clears the current cell by setting it to a blank string.
r Reverses the value in the current cell. Will fail if the value is a number.
i Increments the value in the current cell by one. Will fail if the value is not a number.
d Decrements the value in the current cell by one. Will fail if the value is not a number.
S Squares the value in the current cell.
a Sets the value of the current cell equal to the value of the current cell plus the value of the cell to the right.
s Sets the value of the current cell equal to the value of the current cell minus the value of the cell to the right.
m Sets the value of the current cell equal to the value of the current cell multiplied by the value of the cell to the right.
D Sets the value of the current cell equal to the value of the current cell divided by the value of the cell to the right.
p Sets the value of the current cell equal to the value of the current cell raised to the power of the value of the cell to the right.
l Adds the current length of the tape to the right of the tape in number form
f Negates the value of the current cell. (If the value is negative, make it positive and visa versa)
s Splits the value of the current cell into induvidual characters, and adds each induvidual character to the end of the tape.
c Concatenates the value of the current cell and the value of the cell on the right of the current cell, and adds the result to the end of the tape.

Programs

Hello, World!

 v+CCCCCCCCCCCCCCCC
   `Hello, World!`N

Truth Machine

v+CCCCCC?=[C]
  `1`{I}!  P
        [CC
         {N

Cat Program

v+CC
  IN

Deadfish Interpreter

Interprets one command per line.

v+CC[vCCCCCCCC?!CCCCCCCCCC?!CCCCCCCCCCCCCCCCC?!CCCCCC?!CCCCCC?!CCCCCC?!CCCCCCD_
  n{D E`-1`n} = {E`256`n} =  { E`>>`PEI{E`i`}= {E`d`}= {E`s`}= {E`o`}=  {{N}} D
    D         _DDDDDDDDDDD]                  D       D       D       D        D      
    D         <                              D       D       D       D        D
    D         D                              <       <       <       <        D
    D        EC                             }C      }C      }C      }C        D
    D        `C                             iC      dC      SC      NC        D
    D        0C                             {C      {C      {C      {C        D
    D        `C                              D       D       D       D        D
    D        nC                              D       D       D       D        D
    D        {C                              D       D       D       D        D      
    |DDDDDDDDD]DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD]DDDDDDD]DDDDDDD]DDDDDDD]DDDDDDDD]

Interpreter

Written in ruby.

$pcx = 0
$pcy = 0
$castlen = 0
$stack = [""]
$dir = 0
$movdir = 0
$textmode = false
$cell = 0
def run(program)
e = false
while !e
if program[$pcy][$pcx] == "v"
$dir = 3
elsif program[$pcy][$pcx] == "_"
$movdir = 3
elsif program[$pcy][$pcx] == "|"
$movdir = 1
elsif program[$pcy][$pcx] == "["
$movdir = 0
elsif program[$pcy][$pcx] == "]"
$movdir = 2
elsif program[$pcy][$pcx] == "?"
if $stack[$cell] == $stack[$cell+1]
if program[$pcy-1][$pcx] == "="
$movdir = 1
elsif program[$pcy][$pcx+1] == "="
$movdir = 0
elsif program[$pcy][$pcx-1] == "="
$movdir = 2
elsif program[$pcy+1][$pcx] == "="
$movdir = 3
end
else
if program[$pcy][$pcx+1] == "!"
$movdir = 0
elsif program[$pcy][$pcx-1] == "!"
$movdir = 2
elsif program[$pcy+1][$pcx] == "!"
$movdir = 3
elsif program[$pcy-1][$pcx] == "!"
$movdir = 1
end

end
elsif program[$pcy][$pcx] == "^"
$dir = 1
elsif program[$pcy][$pcx] == ">"
$dir = 0
elsif program[$pcy][$pcx] == "<"
$dir = 2
elsif program[$pcy][$pcx] == "+"
$castlen+=1
elsif program[$pcy][$pcx] == "-"
$castlen -= 1
elsif program[$pcy][$pcx] == "C"
if $textmode == true
if $dir == 0
if program[$pcy][$pcx+$castlen] == "`"
$textmode = false
else
$stack[$cell] += program[$pcy][$pcx+$castlen]
end
elsif $dir == 1
if program[$pcy-$castlen][$pcx] == "`"
$textmode = false
else
$stack[$cell] += program[$pcy-$castlen][$pcx]
end
elsif $dir == 2 
if program[$pcy][$pcx-$castlen] == "`"
$textmode = false
else
$stack[$cell] += program[$pcy][$pcx-$castlen]
end
elsif $dir == 3
if program[$pcy+$castlen][$pcx] == "`"
$textmode = false
else
$stack[$cell] += program[$pcy+$castlen][$pcx]
end
end
else
x = ""
if $dir == 0 
x = program[$pcy][$pcx+$castlen]
elsif $dir == 1 
x =   program[$pcy-$castlen][$pcx]
elsif $dir == 2 
x =  program[$pcy][$pcx-$castlen]
elsif $dir == 3 
x =  program[$pcy+$castlen][$pcx]
end
if x == "P"
print $stack[$cell]
elsif x == "c"
$stack << $stack[$cell].to_s + $stack[$cell+1].to_s
elsif x == "s"
n = $stack[$cell].to_s.split(//)
lcount = 0
while lcount < n.count
$stack << n[lcount]
lcount+=1
end
elsif x == "l"
$stack << $stack.count
elsif x == "N"
puts $stack[$cell]
elsif x == "`"
$textmode = true
elsif x == "E"
$stack[$cell] = ""
elsif x == "r"
$stack[$cell] = $stack[$cell].reverse
elsif x == "f"
$stack[$cell] = -$stack[$cell]
elsif x == "n"
$stack[$cell] = $stack[$cell].to_f
elsif x == "i"
$stack[$cell]+=1
elsif x == "d"
$stack[$cell]-=1
elsif x == "I"
$stack[$cell] = gets.delete("\n")
elsif x == "S"
$stack[$cell] = $stack[$cell]*$stack[$cell]
elsif x == "p"
$stack[$cell] = $stack[$cell]**$stack[$cell+1]
elsif x == "a"
$stack[$cell]+=$stack[$cell+1]
elsif x == "s"
$stack[$cell]-=$stack[$cell+1]
elsif x == "m"
$stack[$cell]*=$stack[$cell+1]
elsif x == "D"
$stack[$cell]/=$stack[$cell+1]
elsif x == "{"
$cell+=1
if $stack[$cell] == nil
$stack[$cell] = ""
end
elsif x == "}"
$cell-=1
if $stack[$cell] == nil
$stack[$cell] = ""
end
end
end
elsif program[$pcy][$pcx] == "D"  

elsif program[$pcy][$pcx] == "="

elsif program[$pcy][$pcx] == "!"

else
puts "Ended at #{$pcy},#{$pcx}" #for debugging
abort
end
if $movdir == 0
$pcx+=1
elsif $movdir == 1
$pcy-=1
elsif $movdir == 2
$pcx-=1
elsif $movdir == 3
$pcy+=1
end
if  $pcy >= program.count 
e = true
end
end
end
run(File.open(gets.delete("\n"),"r").read.split("\n"))
puts "Ended at #{$pcy},#{$pcx}" #for debugging