Skip to content

Instantly share code, notes, and snippets.

@kb10uy
Created August 18, 2014 11:37
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kb10uy/9663613e62757f26ee70 to your computer and use it in GitHub Desktop.
Save kb10uy/9663613e62757f26ee70 to your computer and use it in GitHub Desktop.
Brainf*ckの派生言語「ごちうさ」 Ruby実装
#coding: utf-8
#+-----------------------------------------------------------------------------+
#| Brainfuckをごちうさチックにしたやつ |
#| Gochiusa v1.0 |
#| MIT License |
#| |
#| ソースコードファイルの拡張子はitoarかgudを適当に推奨 |
#| (Is The Order A Rabbit と [ご]注文は[う]さぎ[で]すか?から採用) |
#| デフォルトでは出力・入力ともにUTF-8なので必要なら適当に変えて |
#| 所定の文字列以外では空白と改行が許されます |
#| |
#| 対応表 |
#| + ぴょん - らん |
#| > 心 < 胸が |
#| [ 詰んだ詰んだ ] ぽっぴんジャンプ♪ |
#| . 言いなさい , セロリタベテル! |
#+-----------------------------------------------------------------------------+
require "strscan"
class Gochiusa
def initialize()
@s_inc="ぴょん"
@s_dec="らん"
@s_nxt="心"
@s_prv="胸が"
@s_jlb="詰んだ詰んだ"
@s_jmp="ぽっぴんジャンプ♪"
@s_put="言いなさい"
@s_get="セロリタベテル!"
@code=[]
@code_jump=[]
end
def execute(src)
@code=[]
stack=[]
pc=0
s=StringScanner.new(src)
until s.eos?
case
when s.scan(/#{@s_inc}/)
@code << :increment
pc+=1
when s.scan(/#{@s_dec}/)
@code << :decrement
pc+=1
when s.scan(/#{@s_nxt}/)
@code << :next
pc+=1
when s.scan(/#{@s_prv}/)
@code << :previous
pc+=1
when s.scan(/#{@s_jlb}/)
stack.push pc
@code << :jump_label
pc+=1
when s.scan(/#{@s_jmp}/)
left=stack.pop
@code_jump[pc]=left
@code_jump[left]=pc
#p left.to_s + "and"+pc.to_s
@code << :jump
pc+=1
when s.scan(/#{@s_put}/)
@code << :puts
pc+=1
when s.scan(/#{@s_get}/)
@code << :getc
pc+=1
when s.scan(/\s/)
else
puts "許可されていない文字列があります"
exit
end
end
#@code.each{|i|p i}
run
end
def run
cp=0
mem=[]
ptr=0
until @code[cp].nil?
mem[ptr] ||= 0
case @code[cp]
when :increment
mem[ptr]+=1
when :decrement
mem[ptr]-=1
when :next
ptr+=1
when :previous
ptr-=1
when :jump_label
if mem[ptr]==0 then
cp=@code_jump[cp]
end
when :jump
if mem[ptr]!=0 then
cp=@code_jump[cp]
end
when :puts
print mem[ptr].chr Encoding::UTF_8
when :getc
mem[ptr]=$stdin.getc.ord
end
cp+=1
end
end
end
gc=Gochiusa.new()
gc.execute File.read(ARGV[0],:encoding=>Encoding::UTF_8)
#参考までに
#
#ぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょん
#詰んだ詰んだ
#心ぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょん
#心ぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょん
#心ぴょんぴょんぴょんぴょんぴょん
#胸が胸が胸がらん
#ぽっぴんジャンプ♪
#心言いなさい
#心ぴょんぴょん
#言いなさい
#ぴょんぴょんぴょんぴょんぴょんぴょんぴょん
#言いなさい言いなさい
#ぴょんぴょんぴょん
#言いなさい
#心
#らん
#言いなさい
#らんらんらんらんらんらんらんらんらんらんらんらん
#言いなさい
#胸がぴょんぴょんぴょんぴょんぴょんぴょんぴょんぴょん
#言いなさい
#らんらんらんらんらんらんらんらん
#言いなさいぴょんぴょんぴょん
#言いなさいらんらんらんらんらんらん
#言いなさいらんらんらんらんらんらんらんらん
#言いなさい心ぴょん
#言いなさい
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment