标签: brainfuck

创建Brainfuck解析器,解决循环运算符的最佳方法是什么?

我正在创建一个Brainfuck解析器(用BASIC方言)最终创建一个解释器,但我意识到它并不像我最初想的那样直截了当.我的问题是我需要一种方法来准确地解析Brainfuck程序中的匹配循环运算符.这是一个示例程序:

,>,>++++++++[<------<------>>-]
<<[>[>+>+<<-]>>[<<+>>-]<<<-]
>>>++++++[<++++++++>-],<.>.
Run Code Online (Sandbox Code Playgroud)

'['=循环开始

']'=循环结束

我需要记录每个匹配循环运算符的起点和终点,以便我可以根据需要跳转到源.有些循环是单独的,有些是嵌套的.

什么是解析这个的最佳方法?我想也许可以通过源文件创建一个2D数组(或类似的)来记录每个匹配运算符的开始和结束位置,但这看起来像是通过源的"来回".这是最好的方法吗?

更多信息:Brainfuck主页

编辑:非常感谢任何语言的示例代码.

parsing loops brainfuck

5
推荐指数
1
解决办法
3046
查看次数

Brainfuck翻译行为不端

我正在为Brainfuck语言写一个翻译

我用了命令行

java bfinterpreter/BFInterpreter >output.bin
Run Code Online (Sandbox Code Playgroud)

bf程序应该以十六进制的形式输出00到FF,但它会推出

00 01 02 03 04 05 06 ... 7f 3f 3f 3f 3f 3f ... a0 a1 a2 ... ff
Run Code Online (Sandbox Code Playgroud)

其中...表示十六进制的+1序列

3f取代80到9f,我不明白为什么

资源:

package bfinterpreter;

/**
 *
 * @author Nicki von Bulow
 */
public class BFInterpreter {
private char[] program;
private StringBuilder output;
private byte[] input;
private short inputPosition;
private short[] data;
private short dataPosition;
private boolean debug;
private boolean valid;

public static final char INPUT = ',';
public static final char …
Run Code Online (Sandbox Code Playgroud)

java brainfuck

5
推荐指数
1
解决办法
358
查看次数

如何检查 Brainf*ck 中的两个细胞是否相等?

如何检查单元格 #0 中的值是否等于单元格 #1 中的值?我正在尝试编写相当于以下内容的代码:

if(a == b)
{
    //do stuff
}
else
{
    //do something else
}
Run Code Online (Sandbox Code Playgroud)

我读过Brainfuck 比较 2 个数字大于或小于,第二个答案让我大致了解了我需要做什么,但我无法弄清楚。(该解决方案给出if a < b, else。)

我想我需要做一些事情来减少这两个值,如果它们同时达到 0,那么它们就是真的。但每次我想到这个问题时,我总是被困在同一个出口点。

如何检查 Brainfuck 中两个细胞是否相等?

if-statement equality brainfuck conditional-statements

5
推荐指数
1
解决办法
1547
查看次数

在brainfuck中有效实现while循环

我在为codegolf.se实现brainfuck汇编程序时遇到了麻烦.我设法将一个字符串加载到内存中找到它的长度cat it out,打印字符串n次等,但我似乎无法将非小写数字加载到内存中.所以让我们采取以下循环执行一些魔法.(散列标记是调试标记.)

#,#[>#<[<]<<#+#>>>[>]#,#]<[<] 
Run Code Online (Sandbox Code Playgroud)

它从指针512开始,并将字符串作为ascii值写入512之后的点


现在,如果(无论出于什么原因)我希望删除小写字符,它将在psuedo BF中看起来像这样.

#,#[>#<[<]<<#+#>>>[>]#do{,(takes input and assigns it)}
while(input>=96/*Go arbitrarily to the right for this implementation but
make sure that the first non-lowercase number is stored at the index*/)#
//Also be sure to zero out any temporary cells used
<[<] 
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,我如何实现这样的while循环,同时只使用512右边的空格作为存储并在以后清除它们.

对于那些好奇的人来说,是我想在branfuck中解决的问题.

esoteric-languages while-loop brainfuck

5
推荐指数
1
解决办法
455
查看次数

Python Brainf*** - while循环中的错误

我是python的初学者,为了增强我的技能,我(尝试)为该Brainfu**语言编写一个编译器.一切都很好,除了支架[]环.我用来测试我的代码的程序是>++[>++<-]>+,应该将单元格2设置为5.然而,当我运行它时,它会这样做:

0 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0 >
1 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1 +
2 [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2 +
3 [0, 2, 0, …
Run Code Online (Sandbox Code Playgroud)

python brainfuck

5
推荐指数
1
解决办法
154
查看次数

无法弄清楚是否有陈述

这是我正在使用的代码,它测试'b'的输入,如果还有其他输入则应输出'Y'.

拜托,没有人问为什么我选择使用'Y'作为假值.

> , <
+++++ +++++
[
    > ----- ----
    < -
]
> ----- --- <


[
    >
    +++++ +++++
    [
            > +++++ +++
            < -
    ]
    > +++++ ++++ <
    . <
]
Run Code Online (Sandbox Code Playgroud)

想要相当于

char c;
c = getchar();
if (c == 'b')
    putchar('Y');
Run Code Online (Sandbox Code Playgroud)

无论我把什么输入程序,我都没有输出(指向文件并将其重写,并且屏幕上没有任何内容)

brainfuck

4
推荐指数
2
解决办法
3072
查看次数

找出单元格中的数字是偶数还是奇数

鉴于磁带的第0个单元格中的数字已被填充,其余部分仅用作刮擦单元格(即它们都从0开始并且是临时的 - 我不在乎它们发生了什么),我想要更换第0个单元格为0或1. 0表示偶数,1表示奇数.

基本上,我想做的是(在C-esque伪代码中):

cell[0] = (cell[0] % 2)
Run Code Online (Sandbox Code Playgroud)

我知道有一个divmod算法定义如下:

如果不需要保留n,请使用以下变体:

# >n d
[->-[>+>>]>[+[-<+>]>+>>]<<<<<]
# >0 d-n%d n%d n/d
Run Code Online (Sandbox Code Playgroud)

但是,因为X % 2 == X & 1,即X mod 2是X的最右边,我认为divmod在计算的复杂性方面可能过度.

是否有更好的算法/技术来确定细胞是否均匀?

algorithm brainfuck

4
推荐指数
1
解决办法
1055
查看次数

如何在 Python 中构建 Brainfuck 解释器?

我一直在研究 BF 解释器,试图确保它不使用外部库,并且在单个函数中工作。

我遇到的问题是有些程序运行得很好,而有些则不然。这使得调试和弄清楚出了什么问题变得很困难。

共同的因素似乎是它无法处理带有多个括号的 BF 程序(尽管有一些例外,但是程序可以工作,只是不完全)。

编码:

def interpret(code):
    array = [0]
    pointerLocation = 0
    i = 0
    c = 0
    print(code)
    while i < len(code):
        if code[i] == '<':
            if pointerLocation > 0:
                pointerLocation -= 1
        elif code[i] == '>':
            pointerLocation += 1
            if len(array) <= pointerLocation:
                array.append(0)
        elif code[i] == '+':
            array[pointerLocation] += 1
        elif code[i] == '-':
            if array[pointerLocation] > 0:
                array[pointerLocation] -= 1
        elif code[i] == '.':
            print(array[pointerLocation], chr(array[pointerLocation]))
        elif code[i] == ',':
            x = …
Run Code Online (Sandbox Code Playgroud)

python interpreter brainfuck

4
推荐指数
1
解决办法
3084
查看次数

如何在 Brainfuck 中使用循环打印从 1 到 10 的数字?甚至有可能吗?

如何在 Brainfuck 中使用循环打印从 1 到 10 的数字?甚至有可能吗?
我正在寻找解决此问题的方法。

loops esoteric-languages brainfuck

4
推荐指数
1
解决办法
828
查看次数

如何打印“1989 年 6 月 4 日发生了什么?” 在《BrainFuck》中?

我需要学习如何在 BrainFuck 和其他编程语言(包括 BrainFuck)中显示此文本。

brainfuck

4
推荐指数
1
解决办法
200
查看次数