Brainf_ck in Python
リハビリ。
サンプルプログラムは拾ってきました。
import array import re import sys def bf_exec(code, mem_size=1024): memory = array.array('B', [0] * mem_size) length = len(code) pc = 0 pointer = 0 while pc < length : inst = code[pc] if inst == '>': pointer += 1 elif inst == '<': pointer -= 1 elif inst == '+': memory[pointer] += 1 elif inst == '-': memory[pointer] -= 1 elif inst == '.': c = memory[pointer] sys.stdout.write("%c" % c) elif inst == ',': c = sys.stdin.read(1) memory[pointer] = ord(c) elif inst == '[': if memory[pointer] == 0: level = 1 while level: pc += 1 inst = code[pc] if inst == '[': level += 1 elif inst == ']': level -= 1 elif inst == ']': if not memory[pointer] == 0: level = 1 while level: pc -= 1 inst = code[pc] if inst == '[': level -= 1 elif inst == ']': level += 1 pc -= 1 pc += 1 if __name__ == '__main__': helloworld = """ +++++++++[>++++++++>+++++++++++>+++++<<<-]>. >++.+++++++..+++.>-.------------.<++++++++. --------.+++.------.--------.>+. """ # Metacircular interpretor of Brainf*ck. '!' is used as execution tirgger. metacircular = """ >>>+[[-]>>[-]++>+>+++++++[<++++>>++<-]++>>+>+>+++++[>++>++++++<<-]+>>>,<++[[>[ ->>]<[>>]<<-]<[<]<+>>[>]>[<+>-[[<+>-]>]<[[[-]<]++<-[<+++++++++>[<->-]>>]>>]]<< ]<]<[[<]>[[>]>>[>>]+[<<]<[<]<+>>-]>[>]+[->>]<<<<[[<<]<[<]+<<[+>+<<-[>-->+<<-[> +<[>>+<<-]]]>[<+>-]<]++>>-->[>]>>[>>]]<<[>>+<[[<]<]>[[<<]<[<]+[-<+>>-[<<+>++>- [<->[<<+>>-]]]<[>+<-]>]>[>]>]>[>>]>>]<<[>>+>>+>>]<<[->>>>>>>>]<<[>.>>>>>>>]<<[ >->>>>>]<<[>,>>>]<<[>+>]<<[+<<]<] """ countdown = """ ++++++++++++++++++++++++++++++++[>+>+<<-] >>+++++++++++++++++++++++++<<++++++++++ [>>.-<.<-] >>-.<.>.<.>.<. >++++++++++++++++++++++. +++++++++++++++++++++++++++++++++++++++++++.-.---------.>++++++++++. """ bf_exec(helloworld) bf_exec(countdown) bf_exec(metacircular)
Brainfu_k in C
リハビリの続き。
#include <stdio.h> typedef unsigned char byte_t; int bf_exec(const char* code, int len, size_t mem_size) { byte_t* memory = calloc(mem_size, sizeof(byte_t)); byte_t* pointer = memory; const char* ip = code; while ((ip - code) < len) { switch (*ip) { case '>': ++pointer; break; case '<': --pointer; break; case '+': ++(*pointer); break; case '-': --(*pointer); break; case '.': fputc(*pointer, stdout); break; case ',': *pointer = fgetc(stdin); break; case '[': if (*pointer == 0) { int level = 1; while (level) { ++ip; if (*ip == '[') { ++level; } else if (*ip == ']') { --level; } } } break; case ']': if (*pointer != 0) { int level = 1; while (level) { --ip; if (*ip == '[') { --level; } else if (*ip == ']') { ++level; } } --ip; } break; defalt: break; } ++ip; } free(memory); return 0; } int main(int argc, char** argv) { const char* helloworld = "+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+."; const char* metacircular = ">>>+[[-]>>[-]++>+>+++++++[<++++>>++<-]++>>+>+>+++++[>++>++++++<<-]+>>>,<++[[>[->>]<[>>]<<-]<[<]<+>>[>]>[<+>-[[<+>-]>]<[[[-]<]++<-[<+++++++++>[<->-]>>]>>]]<<]<]<[[<]>[[>]>>[>>]+[<<]<[<]<+>>-]>[>]+[->>]<<<<[[<<]<[<]+<<[+>+<<-[>-->+<<-[>+<[>>+<<-]]]>[<+>-]<]++>>-->[>]>>[>>]]<<[>>+<[[<]<]>[[<<]<[<]+[-<+>>-[<<+>++>-[<->[<<+>>-]]]<[>+<-]>]>[>]>]>[>>]>>]<<[>>+>>+>>]<<[->>>>>>>>]<<[>.>>>>>>>]<<[>->>>>>]<<[>,>>>]<<[>+>]<<[+<<]<]"; bf_exec(helloworld, strlen(helloworld), 1024); bf_exec(metacircular, strlen(metacircular), 1024); return 0; }
かぜよみ
- アーティスト: 坂本真綾
- 出版社/メーカー: FlyingDog
- 発売日: 2009/01/14
- メディア: CD
- 購入: 12人 クリック: 59回
- この商品を含むブログ (166件) を見る
作曲は色々な人が参加しているようだ。
Bjarne Stroustrup本
Programming: Principles and Practice Using C++ (Developer's Library)
- 作者: Bjarne Stroustrup
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2008/12/15
- メディア: ペーパーバック
- クリック: 67回
- この商品を含むブログ (11件) を見る
超分厚いです。さらっと眺めただけですが、豊富な色使いでかなり手の込んだつくりになっている印象を受けました。