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;
}

Bjarne Stroustrup本

Programming: Principles and Practice Using C++ (Developer's Library)

Programming: Principles and Practice Using C++ (Developer's Library)

先週末やっと届きました。
超分厚いです。さらっと眺めただけですが、豊富な色使いでかなり手の込んだつくりになっている印象を受けました。