brainfuck Powershell interpreter

From Esolang
Jump to navigation Jump to search
Back to brainfuck

The following is a Powershell implementation of brainfuck by User:None1, the first line in the input is the program, and the rest are the input. EOF returns 0.

$code=Read-Host
function getchar(){
    return [System.Console]::Read()
}
function putchar($x){ # Output a character
    [System.Console]::Write([Convert]::ToChar($x))
}
$ip=0
$tape=[int[]]::new(1000000)
$p=0
while($ip -lt $code.Length){
    $c=$code[$ip]
    if($c -eq "+"){
        $tape[$p]=($tape[$p]+1)%256
    }
    if($c -eq "-"){
        $tape[$p]=($tape[$p]+255)%256
    }
    if($c -eq ","){
        $tape[$p]=getchar
        if($tape[$p] -eq -1){ # Deal with EOF
            $tape[$p]=0
        }
        if($tape[$p] -eq 13){ # Deal with Windows's CRLF
            $tape[$p]=getchar
        }
    }
    if($c -eq "."){
        putchar($tape[$p])
    }
    if($c -eq '>'){
        $p++;
    }
    if($c -eq '<'){
        $p--;
    }
    if($c -eq '['){
        if($tape[$p] -eq 0){
            $loop=1
            while($loop -gt 0){
                $ip++
                if($code[$ip] -eq '['){
                    $loop++
                }
                if($code[$ip] -eq ']'){
                    $loop--
                }
            }
        }
    }
    if($c -eq ']'){
        $loop=1
        while($loop -gt 0){
            $ip--
            if($code[$ip] -eq '['){
                $loop--
            }
            if($code[$ip] -eq ']'){
                $loop++
            }
        }
        $ip--
    }
    $ip++
}