Hatena::ブログ(Diary)

Reinvention of the Wheel

2011-10-20

KQ言語ジェネレーターを作ってみた。

ちまたを賑わしているKQ言語ですが、 KQ利用者としてこの流れに乗っかるべくKQ言語ジェネレーターを作ってみました。

# 勢いで作った→ほとんどテストしてないので動かなかったらごめんなさい_| ̄|○

これは何?

指定した文字列をKQ言語に変換するモノです。

やっつけコード

#!/usr/bin/env ruby
## -*- coding: utf-8 -*-
# 
# # Programming Language KQ Reverse Compiler

# define kq
def r(mark)
    kq = {
        '>' => 'ダァイェス',
        '<' => 'イェスダァ',
        '+' => 'ダァダァ',
        '-' => 'シエリシエリ',
        ',' => 'ダァシエリ',
        '.' => 'シエリダァ', # print
        '[' => 'シエリイェス',
        ']' => 'イェスシエリ',
    }
    sep = '!' * (rand(2) + 1)
    kq[mark] + sep 
end 

# get string 
input = STDIN.readlines.join.chomp.force_encoding('UTF-8')
buffer = []
input.each_byte{|c| buffer.push(c)}

# local
def local(buffer)
    res = ''
    len = buffer.length
    exit if len < 1
    0.upto(len-1) {|i|
        0.upto(buffer[i] - 1) { res += r('+') }
        res += r('.')
        res += r('>') if i < (len - 1)
    }
    return res
end

# express
def express(buffer)
    res = ''
    len = buffer.length
    exit if len < 1
    0.upto(buffer[0] - 1) { res += r('+') }
    res += r('.')
    return res if len < 2
    1.upto(len-1) {|i|
        diff = buffer[i] - buffer[i-1]
        (0 < diff) ? diff.downto(1) { res += r('+') } : diff.abs.downto(1) { res += r('-') }
        res += r('.')
    }
    return res
end


# limited_express
""" just idea now implementing can't execute
def limited_express(buffer)
    res = ''
    len = buffer.length
    exit if len < 1
    half = buffer[0] / 2
    res += r('+')  if buffer[0] % 2
    res += r('>') + r('[') + r('<')
    0.upto(half - 1) { res += r('+') }
    res += r('>') + r(']') + r('<') + r('.')
    return res if len < 2
    1.upto(len-1) {|i|
        diff = buffer[i] - buffer[i-1]
        (0 < diff) ? diff.downto(1) { res += r('+') } : diff.abs.downto(0) { res += r('-') }
        res += r('.')
    }
    return res
    
end
""" 
#p local(buffer)
p express(buffer)
#p limited_express(buffer)


# TODO : より短く 
# limited express
# Green Limited Express
# wing

実行結果

例えば"hello"という文字列は次のようになります。

"ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!ダァダァ!ダァダァ!ダァダァ!シエリダァ!シエリシエリ!シエリシエリ!シエリシエリ!!シエリダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!シエリダァ!シエリダァ!ダァダァ!!ダァダァ!ダァダァ!!シエリダァ!!"

使い方?

これによって

朝の挨拶も→ダァシエリイェス!!

あの子へのI love youも→ダァシエリイェス!!

機密文書も→ダァシエリイェス!!


今のところ単純変換の普通(local)、ASCIIカウントを再利用して若干効率化した急行まではやっつけました。。。が、まだ利用していないネスト系を使って大幅圧縮を行う特急を現在実装中です。

今後の予定

今後の目標としてはさらなる高みの快特、究極のKQジェネレーターであるWingを実現できればいいなぁ。。。と。

あ、githubで公開してるので、適当に改良してください。あと誰か俺にrubyらしさを教えてください_| ̄|○

https://github.com/plasticscafe/KQ-Language-Generator

それにしても初めてのrubyをこんな風に経験することになるとは。。。

そしてKQ言語作った@nvsoftsさんすげーな、と思いまった。複数文字横断のネストとか激アツすぎる(`・ω・´)

今回のまとめ

このコードの大半がKQの中で書かれているということ。

おまけ

最近こんなのも作ってます→芋煮会戦

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/plasticscafe/20111020/1319068962