brainf*ckでジョジョ言語

CSNagoya3周年記念の発表で使ったネタ言語。
ジョジョ言語 バージョン3です。


タイトルでピンと来なかった人はwikipediaのbrainfuckの項目などをご覧下さい。
賢い人がバージョン6を作って素数をカウントするなどしてくれたらいいと思います。

特徴

  • バトル風言語
  • バージョン3

ジョジョ言語の構文

  • オラ … 現在のポインタの値を1増やす
  • 無駄 …現在のポインタの値を1減らす
  • スターフィンガー!、やれやれだぜ…ポインタを1つ右に動かす
  • ロードローラーだ!、貧弱ゥ…ポインタを1つ左に動かす
  • ハーミットパープル…現在のポインタの値をアスキーコードとして出力する
  • 新手のスタンド使いか!…標準入力から1文字読み込み、現在のポインタに書き込む
  • あ…ありのまま 今 起こった事を話すぜ!…ポインタの値が0なら、対応するザ・ワールド!までジャンプ
  • ザ・ワールド!…ポインタの値が0以外なら、対応するあ…ありのまま 今 起こった事を話すぜ!までジャンプ

ジョジョ言語でのHello World!のソースコード

オラオラオラオラオラオラオラオラオラッ!!

「あ・・・ありのまま今起こったことを話すぜ
俺は奴の前で階段を登っていたと思ったら、いつの間にか降りていた
な…何を言っているのかわからねーと思うが、
俺も何をされたのかわからなかった…
頭がどうにかなりそうだった…催眠術だとか超スピードだとか、
そんなチャチなもんじゃあ断じてねえ。
もっと恐ろしいものの片鱗を味わったぜ…」

スターフィンガー!
オラオララララ!
オラッ!オラオラララララオラオラオラァ!!!
スターフィンガー!!!
オラァオラオラオラオラオラオラッオラ!!
オラオラァァァァァオララララララララララ!
スターフィンガー!

オラオラオラオラオラ! つけの領収書だぜ!

力比べというわけか!
知るがいい…!『ザ・ ワールド』の真の能力は…まさに!『世界を支配する』能力だと言うことを!

「ロードローラだ!ロードローラだ!ロードローラだ!」
無駄ッッッ!

ザ・ワールドッッ

スターフィンガー!
「ハーミットパープル」
スターフィンガー
オラオラ!

「ハーミットパープル」

オラオラオラオラオラオラオラ
ハーミットパープル!ハーミットパープル!

オラオラオラ

ハーミットパープル!
スターフィンガー!

無駄ァ!
ハーミットパープル

無駄!無駄!
無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄
WRYYYYYYYYYYYYYY!
“ジョースター・エジプト・ツアー御一行様”は貴様にとどめを刺して全滅の最後というわけだな

ハーミットパープル!
ロードローラだ!

オーラオラオーラオラオラオラオーラオラオラオラオラッ!
ハーミットパープル!
無駄無駄無駄無駄無駄無駄無駄無駄ッ
ハーミットパープル!
オラオラオラアアアアアアアア!
ハーミットパープル!
無駄ッ無駄ッ無駄ッ無駄無駄無駄ァツ!

ハーミットパープル

もうおそい! 脱出不可能よッ! 無駄無駄無駄無駄無駄無駄無駄無駄ぁぁ!
ハーミットパープル!

最高に『ハイ!』ってやつだアアアアア!アハハハハハハハハハーッ!!
スターフィンガー
オラ
ハーミットパープル!

てめーの敗因は・・・たったひとつだぜ・・・DIO たったひとつの単純(シンプル)な答えだ・・・ 『てめーは おれを怒らせた』


出力

Hello World!

この言語はRubyで作ってあります

#!/usr/bin/ruby

$KCODE = 'u'

class BrainF_ck
  class ProgramError < StandardError; end

  def initialize(src)
    orders = get_orders
    @tokens = src.scan(/(#{orders})/).flatten
    @jumps = analyze_jumps(@tokens)
  end

  def get_orders
      [
       'オラ',
       '無駄',
       'スターフィンガ',
       'やれやれだぜ',
       'ロードローラ',
       '貧弱',
       'ハーミットパープル',
       '新手のスタンド使いか',
       'あ・・・ありのまま今起こったことを話すぜ',
       'ザ・ワールド'
      ].join('|')
  end

  def run
    tape = []
    pc = 0
    cur = 0

    while pc < @tokens.size
      case @tokens[pc]
        when 'オラ'
          tape[cur] ||= 0
          tape[cur] += 1
        when '無駄'
          tape[cur] ||= 0
          tape[cur] -= 1
        when 'スターフィンガ' || 'やれやれだぜ'
          cur += 1
        when 'ロードローラ' || '貧弱'
          cur -= 1
          raise ProgramError, '開始地点よりポインタを左に移動できません。' if cur < 0
        when 'ハーミットパープル'
          n = (tape[cur] || 0)
          print n.chr
        when '新手のスタンド使いか'
          tape[cur] = $stdin.getc
        when 'あ・・・ありのまま今起こったことを話すぜ'
          pc = @jumps[pc] if tape[cur] == 0
        when 'ザ・ワールド'
          pc = @jumps[pc] if tape[cur] != 0
      end
      pc += 1
    end
  end

private
  
  def analyze_jumps(tokens)
    stack = []
    jumps = {}
    o = 'あ・・・ありのまま今起こったことを話すぜ'
    c = 'ザ・ワールド'
    tokens.each_with_index do |v,i|
      if v == o
          stack.push(i)
      elsif v == c
        raise ProgramError, "#{c}が多すぎます" if stack.empty?
          from = stack.pop
          to = i
          jumps[from] = to
          jumps[to] = from
      end 
    end

    raise ProgramError, "#{o}が多すぎます" unless stack.empty?
    jumps
  end
end

begin 
  BrainF_ck.new(ARGF.read).run
rescue BrainF_ck::ProgramError => e
  puts e.message
  puts "プログラムの実行に失敗しました"
end

アリーヴェ・デルチ!

2010/2/8 追記
ジョジョ言語、jojo言語などでググってから作ったのですが、やはり先人がいらっしゃるということをブコメで教えて頂きました。
新プログラミング言語「BF-BASIC'n」(ページ下部)
ループに割り当てたセリフが僕よりセンスがいいです!