2013-05-30 1 views
7

현재 Brainfuck 통역사를 언어로 작성하여 Nimrod을 (를) 이용하고 있습니다. 그것은 성공적으로 컴파일Nimrod의 Brainfuck 통역자

import os, unsigned 

const RamSize = 200 

type 
    TRam = array[0..RamSize, int] 

var 
    ram : TRam 
    ip : int = 0 
    dp : int = 0 

proc readCode(path: string) = 
    var 
    f : TFile = open(path) 
    i : int = 0 
    while i < RamSize and not EndOfFile(f): 
    ram[i] = ord(readChar(f)) 
    inc(i) 

proc main(path: string) = 

    readCode(path) 
    while ip < RamSize: 
    case chr(ram[ip]) 
    of '>' : inc dp 
    of '<' : dec dp 
    of '+' : inc ram[dp] 
    of '-' : dec ram[dp] 
    of '.' : write stdout, chr(ram[dp]) 
    else : nil 
    inc(ip) 
    echo() 

if paramcount() == 1: main(paramstr(1)) 
else: echo("usage: bfrun PATH") 

,하지만 난 그것을 입력을 던질 때처럼 : 현재 루프를 구현하지 않고, 내가 가진

가 문자를 인쇄해야
> 
+++++ +++++ 
+++++ +++++ 
+++++ +++++ 
+++++ +++++ 
+++++ +++++ 
+++++ +++++ 
+++++ . 

는 'A'는이 반환 'N을 ' 어떤 아이디어?

답변

6

정확히 이해하면 dp이 1로 설정되고 ram[dp]이 65 번 증가합니다. 그러나 ram[dp] (별칭 ram[1])은 프로그램의 두 번째 문자 인 캐리지 리턴 문자 (ASCII 13)를 보유하기 시작합니다. A는 ASCII 65이고 N은 ASCII 78이며 65 + 13은 78입니다.

메모리 셀을 증가시키기 전에 dp을 프로그램 공간 밖으로 설정하거나 별도의 RAM을 사용하여 프로그램을 유지하십시오.

+0

감사합니다. 해결책은 캐리지 리턴에서 증가하는 문제를 피하기 위해 또 다른 RAM "테이프"를 추가하는 것입니다. –

관련 문제