2010-02-08
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」(ページ下部)
ループに割り当てたセリフが僕よりセンスがいいです!
トラックバック - http://d.hatena.ne.jp/toyoshi/20100208/1265587511
リンク元
- 1838 http://www.golgo31.net/
- 439 http://twitter.com/
- 277 http://www.zerofactory.jp/2010/02/jojo.html
- 266 http://b.hatena.ne.jp/hotentry
- 251 http://ow.ly/14X0q
- 170 http://pipes.yahoo.com/pipes/pipe.info?_id=faa858a20082ef6d25ad27557e37e011
- 168 http://gnews.x0.com/
- 149 http://pipes.yahoo.com/pipes/pipe.info?_id=9f2c9af421718cbf027ad6303f043dc3
- 139 http://b.hatena.ne.jp/hotentry/it
- 137 http://reader.livedoor.com/reader/




