代码之家  ›  专栏  ›  技术社区  ›  Ryan Tenney

在Brainfuck中实现控制结构

  •  7
  • Ryan Tenney  · 技术社区  · 14 年前

    对于没有经验的人, Brainfuck 是一种图灵完整的语言,只有8个命令,所有命令在C语言中都有对应的文字:

    bf    c
    ----------------------
    >     ++ptr;
    <     --ptr;
    +     ++*ptr;
    -     --*ptr;
    .     putchar(*ptr);
    ,     *ptr=getchar();
    [     while (*ptr) {
    ]     }
    

    在任何有包管理器的Linux发行版上,您应该能够找到并安装包。 beef 他妈的翻译,这样你就可以在家里玩了。

    正如你在上面看到的,布伦他妈的 控制结构, […] 转换为c表示:

    while (*ptr) { … }
    

    这让你可以控制 IF VAR = 0 THEN GOTO 10 从基础。下面将调用 getchar() 直到它回来 0 :

    ,    # *ptr = getchar();
    [    # while (*ptr) {
      >,    # *(++ptr) = getchar();
    ]    # }
    

    但是如果我只想读一个换行符呢 \n ?在经历了一些困难之后,我的大脑就开始思考如何适应这个简单的工作。 if 我想到了以下几点:

    ,            # *ptr = getchar();      /* store input                               */
    ----------   # *ptr -= 10;            /* test for \n by subtracting 10 before loop */
    [            # while (*ptr) {         /* if *ptr == 0, last char read was \n       */
      ++++++++++   # *ptr += 10;          /*   wasn't \n, add 10 back to val under ptr */
      >,           # *(++ptr) = getchar();
      ----------   # *ptr -= 10;
    ]            # }
    

    (如果有人有更好的方法,请告诉我)

    现在假设我想在 \r 除了 \n . 如果我只有一个机会打破这个循环,我如何测试这两者呢?我的目标是能够模仿 switch 嵌套的 如果 S或 if/else if S.

    3 回复  |  直到 12 年前
        1
  •  3
  •   Community CDub    7 年前

    我还没看链接,但我想 AShelly's answer 可能是更普遍的有用…但是,由于我以前不敢让我的手指打字,我决定现在是一个很好的时间,并能够得到以下,我 认为 作品。

    下半部分只是打印出第一部分捕获的内容。而且,我不会说谎,我的大脑在尝试解决这个问题后确实感到彻底的“操”…一种非常贴切的语言,呵呵。

    +
    [
        >,
        ----------
        [
            ---
            [
                +++++++++++++
                >>
            ]
        ]
    
        <
        [
          >>
        ]
        <
    ]
    
    ++++++++++++
    [
        <
    ]
    
    >
    [
        .>
    ]
    
        2
  •  4
  •   Jigar Joshi    14 年前

    Here 是执行基本逻辑但复杂操作的算法吗?

        3
  •  3
  •   AShelly    13 年前

    this page 为了说明如何从单个BF控制结构开始,并定义一系列表示更复杂操作的越来越复杂的序列。

    推荐文章