Brainfuck interpreter in Ruby's Regexp
Ruby ã®æ£è¦è¡¨ç¾ã ãã§ Brainfuck ã¤ã³ã¿ããªã¿ãä½ããã¨ãã§ãã¾ãããæ£è¦è¡¨ç¾ã®å®è¡ã¯ =~ ã ããªã®ã§ãã«ã¼ããªã©ãæ£è¦è¡¨ç¾ã®å é¨ã§å®è¡ãã¦ã¾ãã
https://github.com/shinh/hack/blob/master/bf_rb_reg/bf.rb
ã¤ã¾ãã©ããããã¨ãã§ãããã¨ããã¨ã BF_REG ã¨ãã Regexp 㨠BF_SUFFIX ã¨ããæåå宿°ããã£ã¦ã bf ã¨ããæååã«æ ¼ç´ããã Brainfuck ã®ã³ã¼ãã
BF_REG =~ bf + BF_SUFFIX
ã§å®è¡ãããã¨ãã§ãã¾ããåºå㯠$~['o0'], $~['o1'], ... ã«å ¥ã£ã¦ããã®ã§ã
output = '' 256.times do |i| o = $~["o#{i}"] break if !o output += o end
çãªã³ã¼ãã§åãåºããã¨ãã§ãã¾ããå ¥å㯠! ã®å¾ã«ç¶ãã¦ãæååãå ¥åã¨ããå½¢å¼ãRuby ã®æ£è¦è¡¨ç¾ã¯ Turing å®å ¨ã§ãªãã®ã§ãç¡éã«ã¼ãã¯ã§ããªãããã«ãªã£ã¦ãã¾ãã
仿§ã®ä¸è¦§ã並ã¹ãã¨
- 8bit Brainfuck
- å ¥åã®çµç«¯ã¯ -1
- ã¡ã¢ãªã¯255çªå°ã¾ã§
- åºåæåæ°ã¯256ã¾ã§
- å ¥åæåæ°ã¯256ã¾ã§
- Brainfuckå½ä»¤ä»¥å¤ã®æåãããã¨æ£è¦è¡¨ç¾ããããã«å¤±æãã
- ç¡éã«ã¼ããããã¨æ£è¦è¡¨ç¾ããããã«å¤±æãã(æ£ç¢ºã«ã¯1ã¤ã®ã«ã¼ãã256åé£ç¶åã£ããæ¢ã¾ãã¨ãã仿§ãªã®ã§ãæ¬å½ã¯æ¢ã¾ãã³ã¼ããããã失æãããã¨ããããã¾ã)
ãªã©ã256ã¾ã§ãã¨ããå¶éã¯å®è£ ãã©ã¯ã«ãããããªã®ã§ãæ¬è³ªçãªå¶éã§ã¯ãªãã§ãããç¡éã«ã¯ã§ããªãã§ã(å ¥åæåæ°ã¯ç¡éã«ã§ãããã?)ããã®ç¨åº¦ã®å¶éããã£ã¦ãååã«å®ç¨ç(?)ã§ãä¾ãã° cal.bf ãåãã¦ãã¾ãã
$ echo 2016 10 | time ruby bf.rb cal.bf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ruby bf.rb cal.bf 1147.54s user 0.26s system 99% cpu 19:07.91 total
ãã ãããé ãã¦ã cal.bf ã®å®è¡ã«19åã¨ãããã£ã¦ã¾ããã1å½ä»¤10msã¨ããã®ç¨åº¦ã ã¨æãã¾ãã + ã¨ã - ãå®ã«é ãã
ãããªãã¨ã§ããã¨ã¯ã¤ãæè¿ã¾ã§æã£ã¦ãªãã£ãã®ã§ããã HITCON CTF ã§æ£è¦è¡¨ç¾åã®ç é½ãç©ãã çµæããªããã§ãããããªæ°ããã¦ãã¦ããã£ã¦ã¿ããã§ãã¾ããã
仿ãã«ãä¸çªéè¦ãªãã¨ã¯å¾æ¹åç §ãæ´æ°ã§ãããã¨ãããã¨ã ã£ãã®ããªã¨æãã¾ãã \g ã§å¼ã³åºãããä¸ã«ãã徿¹åç §ã¯ãå¼ã³åºããããã³ã«å¤ãå¤ãã£ã¦ããã¨ããã