From: Michael Libby Date: 2008-12-04T13:54:43+09:00 Subject: Re: [QUIZ] Befunge (#184) ------=_Part_3155_26309858.1228366833588 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Disposition: inline > ## Befunge (#184) I haven't actually finished a Ruby Quiz since #13. Four years is a long time! But this one I had to do. Literally the day before the quiz was posted I was talking with some coworkers about Befunge, Brainf*ck, and the like. That this was the very next Ruby Quiz was fate. Because I was going slowly, I peeked at some of the answers here, I did borrow a little. I love to use the Hash of Procs approach to the the command pattern, which someone here talked about. Matthew's trick using % to do the wrap-arounds was really cool, so I had to use that. Most importantly, even before I saw all the talk about writing a debugger, I had decided the real challenge was to make a GUI IDE for Befunge. After looking at some options, I decided to implement it in Rails. So that gave me a few days in which to learn Rails (I've been procrastinating a few years on that). I also had to move my personal web site to a Rails-friendly host (and way more Ruby/programmer friendly, in general). So this quiz really helped me get going on my "professional development" to-do list. :) I didn't quite get all the way to an IDE, but it is fun to watch a Befunge program execute. With fancy 2D graphics and 8-bit color and everything. I also didn't conquer the input problem, so I just have stub methods that use random numbers for that. So here my befunge.rb -- which acts as interpreter, debugger, and Rails model class (you'd drop it in app/models) If you want to see the Rails-based Befunge "IDE" in action, head over to http://www.mikelibby.com/befunge If anyone wants to see the relevant Rails bits, just ask and I'll put it on GitHub. -Michael C. Libby www.mikelibby.com ------=_Part_3155_26309858.1228366833588 Content-Type: application/x-ruby; name=befunge.rb Content-Transfer-Encoding: base64 X-Attachment-Id: f_foax4tvi0 Content-Disposition: attachment; filename=befunge.rb Y2xhc3MgQmVmdW5nZQoKICBhdHRyX2FjY2Vzc29yIDpkaXJlY3Rpb24sIDpub19za2lwLCA6c3Ry aW5nbW9kZQogIGF0dHJfcmVhZGVyIDpoZWlnaHQsIDp3aWR0aCwgOm91dHB1dCwgOnBjX3gsIDpw Y195LCA6cHJvZ3JhbSwgOnN0YWNrCgogICMgY29tbWFuZHMgYXJlIGRvbmUgdGhpcyB3YXkgdG8g bWFrZSBpdCBlYXN5IHRvIHB1c2ggYSBCZWZ1bmdlIGluc3RhbmNlCiAgIyBpbnRvIGEgUmFpbHMg c2Vzc2lvbi4gVGhlIHByb2NzIGRvbid0IGxpa2UgdG8gYmUgc2VyaWFsaXplZCBpZiB0aGV5IAog ICMgYXJlIGluIGFuIGluc3RhbmNlIG9yIGNsYXNzIHZhcmlhYmxlLCB3aGljaCB3b3VsZCBwcmV2 ZW50IG5lZWRpbmcgdG8KICAjIHBhc3MgdGhlIGluc3RhbmNlIGluIGFzIGEgcGFyYW1ldGVyLi4u IGJ1dCB0aGlzIGFpbid0IHNvIGJhZCBhbnl3YXkKCiAgQ09NTUFORFMgPSB7CiAgICAnICcgPT4g bGFtYmRheyB9LCAjIG5vIG9wCiAgICAnKycgPT4gbGFtYmRhe3x4fCBhLGIgPSB4LnBvcDJpOyB4 LnB1c2goYiArIGEpIH0sICMgYWRkCiAgICAnLScgPT4gbGFtYmRhe3x4fCBhLGIgPSB4LnBvcDJp OyB4LnB1c2goYiAtIGEpIH0sICMgc3VidHJhY3QKICAgICcqJyA9PiBsYW1iZGF7fHh8IGEsYiA9 IHgucG9wMmk7IHgucHVzaChiICogYSkgfSwgIyBtdWx0aXBseQogICAgJy8nID0+IGxhbWJkYXt8 eHwgYSxiID0geC5wb3AyaTsgeC5wdXNoKGIgLyBhKSB9LCAjIGRpdmlkZQogICAgJyUnID0+IGxh bWJkYXt8eHwgYSxiID0geC5wb3AyaTsgeC5wdXNoKGIgJSBhKSB9LCAjIG1vZHVsbwogICAgJyEn ID0+IGxhbWJkYXt8eHwgeC5wdXNoKHgucG9waSA9PSAwID8gMSA6IDApIH0sICMgbm90CiAgICAn YCcgPT4gbGFtYmRhe3x4fCBhLGIgPSB4LnBvcDJpOyB4LnB1c2goYiA+IGEgPyAxIDogMCkgfSwg IyBncmVhdGVyCiAgICAnPicgPT4gbGFtYmRhe3x4fCB4LmRpcmVjdGlvbiA9IDpyaWdodCB9LCAj IHJpZ2h0CiAgICAnPCcgPT4gbGFtYmRhe3x4fCB4LmRpcmVjdGlvbiA9IDpsZWZ0IH0sICMgbGVm dAogICAgJ14nID0+IGxhbWJkYXt8eHwgeC5kaXJlY3Rpb24gPSA6dXAgfSwgIyB1cAogICAgJ3Yn ID0+IGxhbWJkYXt8eHwgeC5kaXJlY3Rpb24gPSA6ZG93biB9LCAjIGRvd24KICAgICc/JyA9PiBs YW1iZGF7fHh8IHguZGlyZWN0aW9uID0gWzpyaWdodCwgOmxlZnQsIDp1cCwgOmRvd25dW3JhbmQo NCldIH0sICMgcmFuZG9tCiAgICAnXycgPT4gbGFtYmRhe3x4fCB4LmRpcmVjdGlvbiA9ICh4LnBv cGkgPT0gMCA/IDpyaWdodCA6IDpsZWZ0KSB9LCAjIGhvcml6IGlmCiAgICAnfCcgPT4gbGFtYmRh e3x4fCB4LmRpcmVjdGlvbiA9ICh4LnBvcGkgPT0gMCA/IDpkb3duIDogOnVwKSB9LCAjIHZlcnQg aWYKICAgICciJyA9PiBsYW1iZGF7fHh8IHguc3RyaW5nbW9kZSA9IChub3QgeC5zdHJpbmdtb2Rl KSB9LCAjIHN0cmluZ21vZGUKICAgICc6JyA9PiBsYW1iZGF7fHh8IGEgPSB4LnBvcDsgeC5wdXNo KGEpOyB4LnB1c2goYSkgfSwgIyBkdXAKICAgICJcXCIgPT4gbGFtYmRhe3x4fCBhLGIgPSB4LnBv cDI7IHgucHVzaChhKTsgeC5wdXNoKGIpIH0sICMgc3dhcAogICAgJyQnID0+IGxhbWJkYXt8eHwg eC5wb3AgfSwgIyBwb3AgLT4gbm8gb3AKICAgICcuJyA9PiBsYW1iZGF7fHh8IHgucHJpbnRfaSh4 LnBvcCkgfSwgIyBwb3AgLT4gcHJpbnQgYXMgaW50ZWdlcgogICAgJywnID0+IGxhbWJkYXt8eHwg eC5wcmludF9hKHgucG9wKSB9LCAjIHBvcCAtPiBwcmludCBhcyBhc2NpaQogICAgJyMnID0+IGxh bWJkYXt8eHwgeC5tb3ZlX3BjIH0sICMgYnJpZGdlIChza2lwKQogICAgJ2cnID0+IGxhbWJkYXt8 eHwgYSxiID0geC5wb3AyOyB4LnB1c2goeC5nZXRfY2VsbChiLGEpKSB9LCAjIGdldAogICAgJ3An ID0+IGxhbWJkYXt8eHwgYSxiID0geC5wb3AyOyB2ID0geC5wb3A7IHguc2V0X2NlbGwodixiLGEp IH0sICMgcHV0CiAgICAnJicgPT4gbGFtYmRhe3x4fCB4LmlucHV0X2kgfSwgIyBpbnB1dCBpbnRl Z2VyCiAgICAnficgPT4gbGFtYmRhe3x4fCB4LmlucHV0X2EgfSwgIyBpbnB1dCBhc2NpaQogICAg J0AnID0+IGxhbWJkYXt8eHwgeC5kaXJlY3Rpb24gPSA6ZW5kIH0gIyBlbmQKICB9CgogIGRlZiBp bml0aWFsaXplKHByb2dyYW0gPSBuaWwsIGhlaWdodCA9IDI1LCB3aWR0aCA9IDgwKQogICAgQGhl aWdodCA9IGhlaWdodAogICAgQHdpZHRoID0gd2lkdGgKICAgICNwcm9ncmFtcyBhcmUgc3RvcmVk IGFzIHJvdywgY29sdW1uICh5LCB4KQogICAgQHByb2dyYW0gPSAgQXJyYXkubmV3KEBoZWlnaHQp e3xpfCBBcnJheS5uZXcoQHdpZHRoLCAnICcpIH0KICAgIHBhcnNlKHByb2dyYW0pCgogICAgQG91 dHB1dCA9ICcnCiAgICBAc3RhY2sgPSBbXQogICAgQHBjX3ggPSAwCiAgICBAcGNfeSA9IDAKICAg IEBkaXJlY3Rpb24gPSA6cmlnaHQKICAgIEBzdHJpbmdtb2RlID0gZmFsc2UKCiAgICBAcHJpbnQg PSBuaWwKICAgIEBub19za2lwID0gZmFsc2UKICBlbmQKCiAgZGVmIGF0X2VuZD8KICAgIEBkaXJl Y3Rpb24gPT0gOmVuZAogIGVuZAoKICBkZWYgZGVmaW5lX3ByaW50KCZibG9jaykKICAgIEBwcmlu dCA9IGJsb2NrCiAgZW5kCgogIGRlZiBnZXRfY2VsbCh4LCB5KQogICAgQHByb2dyYW1beS50b19p XVt4LnRvX2ldCiAgZW5kCgogIGRlZiBpbnB1dF9hCiAgICBAc3RhY2sgPDwgcmFuZCgyNTUpLmNo cgogIGVuZAoKICBkZWYgaW5wdXRfaQogICAgQHN0YWNrIDw8IHJhbmQoMjU1KQogIGVuZAoKICBk ZWYgbW92ZV9wYwogICAgY2FzZSBAZGlyZWN0aW9uCiAgICB3aGVuIDpyaWdodAogICAgICBAcGNf eCA9IChAcGNfeCArIDEgKSAlIEB3aWR0aAogICAgd2hlbiA6bGVmdAogICAgICBAcGNfeCA9IChA cGNfeCAtIDEgKSAlIEB3aWR0aAogICAgd2hlbiA6dXAKICAgICAgQHBjX3kgPSAoQHBjX3kgLSAx ICkgJSBAaGVpZ2h0CiAgICB3aGVuIDpkb3duCiAgICAgIEBwY195ID0gKEBwY195ICsgMSApICUg QGhlaWdodAogICAgd2hlbiA6ZW5kCiAgICAgICMgZ2l2ZSBpdCB1cCwgYnJvCiAgICBlbHNlCiAg ICAgIHJhaXNlICJJbnZhbGlkIGRpcmVjdGlvbjogI3tAZGlyZWN0aW9ufSIKICAgIGVuZAogIGVu ZAoKICBkZWYgcGFyc2UocHJvZ3JhbSkKICAgIHJhaXNlICJFcnJvcjogUHJvZ3JhbSBleGNlZWRz ICN7QGhlaWdodH0gbGluZXMgKGl0IGhhcyAje3Byb2dyYW0ubGVuZ3RofSkiIGlmIHByb2dyYW0u bGVuZ3RoID49IEBoZWlnaHQKICAgIHJvd19udW1iZXIgPSAwCiAgICBwcm9ncmFtLmVhY2ggZG8g fGxpbmV8CiAgICAgIGNvbHVtbl9udW1iZXIgPSAwCiAgICAgIGNoYXJzID0gbGluZS5jaG9tcC5z cGxpdCgvLykKICAgICAgcmFpc2UgIkVycm9yOiBMaW5lICN7cm93X251bWJlciArIDF9IGV4Y2Vl ZHMgI3tAd2lkdGh9IGNvbHVtbnMiIGlmIGNoYXJzLmxlbmd0aCA+PSBAd2lkdGgKICAgICAgY2hh cnMuZWFjaCBkbyB8Y2hhcnwKICAgICAgICBAcHJvZ3JhbVtyb3dfbnVtYmVyXVtjb2x1bW5fbnVt YmVyXSA9IGNoYXIKICAgICAgICBjb2x1bW5fbnVtYmVyICs9IDEKICAgICAgZW5kCiAgICAgIHJv d19udW1iZXIgKz0gMQogICAgZW5kCiAgZW5kCgogIGRlZiBwb3AKICAgIHggPSBAc3RhY2sucG9w CiAgICB4Lm5pbD8gPyAwIDogeAogIGVuZAoKICBkZWYgcG9waQogICAgeCA9IHBvcAogICAgaSA9 ICh4ID09IHgudG9faSkgPyB4IDogeFswXQogIGVuZAoKICBkZWYgcG9wMgogICAgW3BvcCwgcG9w XQogIGVuZAoKICBkZWYgcG9wMmkKICAgIFtwb3BpLCBwb3BpXQogIGVuZAoKICBkZWYgcHVzaChh KQogICAgQHN0YWNrIDw8IGEKICBlbmQKCiAgZGVmIHByaW50KHMpCiAgICBpZiBAcHJpbnQubmls PwogICAgICBAb3V0cHV0IDw8IHMKICAgIGVsc2UKICAgICAgQHByaW50LmNhbGwocykKICAgIGVu ZAogIGVuZAoKICBkZWYgcHJpbnRfYShjKQogICAgaWYgYy5yZXNwb25kX3RvPyg6Y2hyKQogICAg ICBwcmludChjLmNocikKICAgIGVsc2UKICAgICAgcHJpbnQoYykKICAgIGVuZAogIGVuZAoKICBk ZWYgcHJpbnRfaShjKQogICAgaWYgYy5yZXNwb25kX3RvPyg6Y2hyKQogICAgICBwcmludChjLnRv X3MpCiAgICBlbHNlCiAgICAgIHByaW50KGNbMF0udG9fcykKICAgIGVuZAogIGVuZAoKICBkZWYg c2V0X2NlbGwodmFsdWUsIHgsIHkpCiAgICBpZiB2YWx1ZS5yZXNwb25kX3RvPyg6Y2hyKQogICAg ICBAcHJvZ3JhbVt5LnRvX2ldW3gudG9faV0gPSB2YWx1ZS5jaHIKICAgIGVsc2UKICAgICAgQHBy b2dyYW1beS50b19pXVt4LnRvX2ldID0gdmFsdWUKICAgIGVuZAogIGVuZAoKICBkZWYgc2tpcF9z cGFjZXMKICAgIG5leHRfb3AgPSBnZXRfY2VsbChAcGNfeCwgQHBjX3kpCiAgICB3aGlsZSBuZXh0 X29wID09ICIgIgogICAgICBtb3ZlX3BjCiAgICAgIG5leHRfb3AgPSBnZXRfY2VsbChAcGNfeCwg QHBjX3kpCiAgICBlbmQKICBlbmQKCiAgZGVmIHN0ZXAKICAgIG9wID0gQHByb2dyYW1bQHBjX3ld W0BwY194XQogICAgaWYgQHN0cmluZ21vZGUKICAgICAgaWYgJyInID09IG9wCiAgICAgICAgQHN0 cmluZ21vZGUgPSBmYWxzZQogICAgICBlbHNlCiAgICAgICAgQHN0YWNrIDw8IG9wCiAgICAgIGVu ZAogICAgZWxzZQogICAgICBpZiBDT01NQU5EUy5oYXNfa2V5PyhvcCkKICAgICAgICBDT01NQU5E U1tvcF0uY2FsbChzZWxmKQogICAgICBlbHNpZiBvcC5tYXRjaCgvXGQvKQogICAgICAgIEBzdGFj ayA8PCBvcC50b19pCiAgICAgIGVsc2UKICAgICAgICAjIHdlIGNvdWxkIHJhaXNlIGEgc3ludGF4 IGVycm9yPwogICAgICBlbmQKICAgIGVuZAogICAgbW92ZV9wYwogICAgc2tpcF9zcGFjZXMgdW5s ZXNzIEBzdHJpbmdtb2RlIHx8IEBub19za2lwCiAgICByZXR1cm4gb3AKICBlbmQKICAKZW5kCgoK Y2xhc3MgQmVmdW5nZUNvbnNvbGVSdW5uZXIKICAKICBkZWYgaW5pdGlhbGl6ZShwcm9ncmFtKQog ICAgQGJlZnVuZ2UgPSBCZWZ1bmdlLm5ldyhwcm9ncmFtKQogICAgQGJlZnVuZ2UuZGVmaW5lX3By aW50e3xjfCBwcmludCBjIH0KICBlbmQKICAKICBkZWYgcnVuCiAgICBAYmVmdW5nZS5zdGVwIHVu dGlsIEBiZWZ1bmdlLmF0X2VuZD8KICBlbmQKICAKZW5kCgoKY2xhc3MgQmVmdW5nZUNvbnNvbGVE ZWJ1Z2dlcgogIAogIGRlZiBpbml0aWFsaXplKHByb2dyYW0sIGRlYnVnX2JyZWFrKQogICAgQGJl ZnVuZ2UgPSBCZWZ1bmdlLm5ldyhwcm9ncmFtKQogICAgQGRlYnVnX2JyZWFrID0gZGVidWdfYnJl YWsubmlsPyA/IDE2IDogZGVidWdfYnJlYWsudG9faQogICAgQGRlYnVnX2NvdW50ID0gMAogICAg cHJpbnRfdG9ydXMKICBlbmQKCiAgZGVmIHByaW50X291dHB1dAogICAgcHV0cyAiT3V0cHV0OiAj e0BiZWZ1bmdlLm91dHB1dC5pbnNwZWN0fSIKICBlbmQKCiAgZGVmIHByaW50X3N0YWNrCiAgICBw dXRzICJTdGFjazogI3tAYmVmdW5nZS5zdGFjay5pbnNwZWN0fSIKICBlbmQKCiAgZGVmIHByaW50 X3RvcnVzCiAgICBwdXRzICJcbiIsICcjJyAqIChAYmVmdW5nZS53aWR0aCArIDIpCiAgICBAYmVm dW5nZS5wcm9ncmFtLmVhY2h7fHJvd3wgcHJpbnQgJyMnLCByb3cuam9pbiwgJyMnLCAiXG4iIH0K ICAgIHB1dHMgJyMnICogKEBiZWZ1bmdlLndpZHRoICsgMiksICJcbiIgCiAgZW5kCgogIGRlZiBw cmludF9yZWdpc3RlcnMKICAgIHB1dHMgWyJQcm9ncmFtIGNvdW50ZXI6ICgje0BiZWZ1bmdlLnBj X3h9LCAje0BiZWZ1bmdlLnBjX3l9KSIsCiAgICAgICAgICAiRGlyZWN0aW9uOiAje0BiZWZ1bmdl LmRpcmVjdGlvbn0iLAogICAgICAgICAgIlN0cmluZ21vZGU6ICN7QGJlZnVuZ2Uuc3RyaW5nbW9k ZX0iXS5qb2luKCI7ICIpCiAgZW5kCgogIGRlZiBydW4KICAgIHVudGlsIEBiZWZ1bmdlLmF0X2Vu ZD8KICAgICAgQGRlYnVnX2NvdW50ICs9IDEKICAgICAgcHV0cyBAYmVmdW5nZS5zdGVwLmluc3Bl Y3QKICAgICAgCiAgICAgIGlmIEBkZWJ1Z19jb3VudCA+PSBAZGVidWdfYnJlYWsKICAgICAgICB3 aGlsZSB0cnVlCiAgICAgICAgICBwcmludCAiW29ddXRwdXQsIFtzXXRhY2ssIFt0XW9ydXMsIFty XWVnaXN0ZXJzLCBbcV11aXQsIFtdY29udGludWUgKCsgRU5URVIpOiIKICAgICAgICAgIAogICAg ICAgICAgY2FzZSAkc3RkaW4uZ2V0cwogICAgICAgICAgd2hlbiAvby9pOiBwcmludF9vdXRwdXQK ICAgICAgICAgIHdoZW4gL3MvaTogcHJpbnRfc3RhY2sKICAgICAgICAgIHdoZW4gL3QvaTogcHJp bnRfdG9ydXMKICAgICAgICAgIHdoZW4gL3IvaTogcHJpbnRfcmVnaXN0ZXJzCiAgICAgICAgICB3 aGVuIC9xL2k6IGV4aXQKICAgICAgICAgIHdoZW4gL15cbiQvOiBicmVhawogICAgICAgICAgZWxz ZSAjIGludmFsaWQgaW5wdXQsIGFzayBhZ2FpbgogICAgICAgICAgZW5kCiAgICAgICAgZW5kCiAg ICAgICAgQGRlYnVnX2NvdW50ID0gMAogICAgICBlbmQKICAgIGVuZAogICAgcHV0cyBAYmVmdW5n ZS5vdXRwdXQKICBlbmQKICAKZW5kCgoKaWYgJDAgPT0gX19GSUxFX18KICBtb2RlID0gbmlsCiAg Y2FzZSBBUkdWWzBdCiAgd2hlbiAvcnVuL2kgOiBtb2RlID0gOnJ1bgogIHdoZW4gL2RlYnVnL2kg OiBtb2RlID0gOmRlYnVnCiAgZW5kCiAgCiAgIyBWYWxpZCBtb2RlIGFuZCBmaWxlbmFtZSBhcmUg cmVxdWlyZWQKICBpZiBtb2RlLm5pbD8gfHwgQVJHVi5sZW5ndGggPCAyCiAgICBwdXRzICJVc2Fn ZTogcnVieSBiZWZ1bmdlLnJiIDxydW58ZGVidWc+IDxiZWZ1bmdlLmJmPiA8aXRlcmF0aW9ucz4i CiAgICBwdXRzCiAgICBwdXRzICIgIHJ1bjogcnVuIHRoZSBwcm9ncmFtIG5vcm1hbGx5IgogICAg cHV0cyAiZGVidWc6IHJ1biB0aGUgcHJvZ3JhbSBpbiBkZWJ1ZyBtb2RlIHN0b3BwaW5nIGV2ZXJ5 IDxpdGVyYXRpb25zPiIKICAgIHB1dHMgIiAgICAgICB0byBjb25maXJtIGNvbnRpbnVhdGlvbiIK ICAgIGV4aXQKICBlbmQKICAKICAjIEFzc3VtZSB0aGUgdXNlciBjYWxsZWQgd2l0aCBhIHZhbGlk IGZpbGVuYW1lCiAgaWYgbW9kZSA9PSA6cnVuCiAgICBiZiA9IEJlZnVuZ2VDb25zb2xlUnVubmVy Lm5ldyhGaWxlLnJlYWRsaW5lcyhBUkdWWzFdKSkKICBlbHNlCiAgICBiZiA9IEJlZnVuZ2VDb25z b2xlRGVidWdnZXIubmV3KEZpbGUucmVhZGxpbmVzKEFSR1ZbMV0pLCBBUkdWWzJdKQogIGVuZAoK ICBiZi5ydW4KICBwdXRzCmVuZAo= ------=_Part_3155_26309858.1228366833588--