Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class TISfuck
- maximum_runtime: 16384
- new: (code,input,output_callback) =>
- @code=code
- @input=input
- @output_callback=output_callback
- @matrix={0}
- @memory_pointer=1
- @col_pointer=1
- @line_pointer=1
- @tranferable_memory=0
- shift_right: =>
- num=@try_read_number!
- @memory_pointer += (num or 1)
- if @matrix[@memory_pointer]==nil
- @matrix[@memory_pointer]=0
- shift_left: =>
- num=@try_read_number!
- @memory_pointer -= (num or 1)
- if @matrix[@memory_pointer]==nil
- @matrix[@memory_pointer]=0
- increment: =>
- num=@try_read_number!
- @set_value (@get_value!+(num or 1))%256
- decrement: =>
- num=@try_read_number!
- @set_value (@get_value!-(num or 1))%256
- jump_forward: =>
- num=@try_read_number true
- if @get_value! == (num or 0)
- depth = 0
- while true
- if @move_forward!
- return nil
- switch @get_current_char!
- when "["
- depth += 1
- when "]"
- if depth == 0
- @try_read_number!
- return nil
- else
- depth -= 1
- when nil
- return nil
- else
- @try_read_number
- jump_backward: =>
- num=@try_read_number true
- if @get_value! != (num or 0)
- depth = 0
- while true
- if @move_backward!
- return nil
- switch @get_current_char!
- when "["
- if depth == 0
- @try_read_number!
- return nil
- else
- depth -= 1
- when "]"
- depth += 1
- when nil
- return nil
- else
- @try_read_number
- halt: =>
- num=@try_read_number!
- if(num!=nil)
- return @get_value! == num
- return true
- set: =>
- num=@try_read_number!
- @set_value (num or 0)
- set_tranferable: =>
- num=@try_read_number!
- @tranferable_memory = (num==nil and @get_value! or num)%256
- jump_upward: =>
- num=@try_read_number!
- @set_line(@line_pointer-(num or 1))
- jump_downward: =>
- num=@try_read_number!
- @set_line(@line_pointer+(num or 1))
- swap_memory: =>
- buf = @get_value!
- @set_value @tranferable_memory
- @tranferable_memory = buf
- try_read_number: (move_back) =>
- line,col = @line_pointer,@col_pointer
- if @move_forward! != true
- cur_char = @get_current_char!
- if cur_char=="~"
- if(move_back)
- @line_pointer,@col_pointer=line,col
- else
- @move_forward!
- return get_value
- elseif cur_char=="?"
- if(move_back)
- @line_pointer,@col_pointer=line,col
- else
- @move_forward!
- return @tranferable_memory
- elseif (string.find cur_char, "[A-F0-9~?]") != nil
- num=cur_char
- if @move_forward! != true
- if (string.find @get_current_char!, "[A-F,0-9]") != nil
- num..=@get_current_char!
- @move_forward!
- if(move_back)
- @line_pointer,@col_pointer=line,col
- return tonumber(num,16)
- else
- if(move_back)
- @line_pointer,@col_pointer=line,col
- return nil
- else
- if(move_back)
- @line_pointer,@col_pointer=line,col
- return nil
- read_input: =>
- char = string.sub @input, 1, 1
- if char!=""
- @set_value string.byte char
- else
- @set_value 0
- @input = string.sub @input, 2
- move_forward: =>
- @col_pointer+=1
- if @get_current_char! == nil
- @set_line(@line_pointer+1)
- return true
- move_backward: =>
- @col_pointer-=1
- if @get_current_char! == nil
- @set_line(@line_pointer-1)
- return true
- set_line: (l) =>
- @line_pointer = ((l-1) % #@code)+1
- @col_pointer = 1
- get_current_line: (l) =>
- @get_line(@line_pointer)
- get_line: (l) =>
- @code[((l-1) % #@code)+1]
- get_char: (l,c) =>
- if(c>#@code[l] or c<1)
- return nil
- else
- return string.sub @code[l], c, c
- get_current_char: => @get_char(@line_pointer,@col_pointer)
- get_value: => @matrix[@memory_pointer]
- set_value: (value) => @matrix[@memory_pointer]=value
- append_input: (input) => @input ..= input
- step: =>
- ret = nil
- switch @get_current_char!
- when "["
- @jump_forward!
- when "]"
- @jump_backward!
- when "+"
- @increment!
- when "-"
- @decrement!
- when "."
- num=@try_read_number!
- ret=string.char (num or @get_value!)
- if @output_callback != nil
- @output_callback ret
- when ","
- @read_input!
- @move_forward!
- when ">"
- @shift_right!
- when "<"
- @shift_left!
- when ";"
- if @halt!
- return false
- when "*"
- @set!
- when "!"
- @set_tranferable!
- when "^"
- @jump_upward!
- when "v"
- @jump_downward!
- when ":"
- @swap_memory!
- @move_forward!
- when nil
- return false
- ret
- run: =>
- output=""
- for i=1,@maximum_runtime
- step=@step!
- if step==false
- break
- elseif step!=nil
- output ..= step
- output
- --print TISfuck({".48.65*6C...6F.20.57.6F.72..64.21;"},"")\run!
- print TISfuck({".48.65*6C...6F.20v.57.6F.72..64.21;",".46!:*6F..?.6B","+4..21;"},"")\run!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement