📌  相关文章
📜  在 Brainfuck 中打印“GEEKS FOR GEEKS”

📅  最后修改于: 2021-10-19 05:49:37             🧑  作者: Mango

几个月前,在查看我的一位大学前辈的 HackerEarth 开发人员简介时,我发现他的语言活动中的一种语言包括BRAINFUCK 。这激起了我的兴趣,所以我用谷歌搜索了它,令我惊讶的是我没有找到一个链接到 GeeksForGeeks 上的一篇关于brainfuck 的文章。所以无论如何我在 Wikiwand 和 LearnXinYMinutes 上阅读了一些关于它的内容,之后我解决了我在 SPOJ 上的第一个问题,这给了我 0.6 分并将我的全球排名从44000提升到22296

从那时起,我想在 GeeksForGeeks 上写一篇关于 Brainfuck 的文章,因为它是学生参考任何编程相关文章的第一个网站。

由于它是一种极简语言,在其中编写代码可能会非常冗长,您必须仔细跟踪您键入的每条语句、操作和字符。它测试您作为程序员的耐心,并且绝对令人沮丧(因此得名),但是当您获得公认的刻度线时,这是程序员可以体验到的最令人满意的感觉之一。

在我们开始实际代码之前,让我们先看看它的一些特性 =>

  • 它是一种深奥的编程语言(Esolang)
  • 它仅包含下面列出的 8 个命令。
    1. >增加数据指针(指向右边的下一个单元格)。
    2. <递减数据指针(指向左边的下一个单元格)。
    3. +增加(增加一)数据指针处的字节。
    4. 减少(减一)数据指针处的字节。
    5. .输出数据指针处的字节。
    6. ,接受一个字节的输入,将其值存储在数据指针处的字节中。
    7. [如果数据指针处的字节为零,则不是将指令指针向前移动到下一个命令,而是将其向前跳转到匹配之后的命令]命令。
    8. ]如果数据指针处的字节非零,则不是将指令指针向前移动到下一个命令,而是将其跳回到匹配 [ 命令之后的命令。
  • Brainfuck 以 8 位大小的单元格(单元格为字节)的形式存储数据。
  • 在经典分布中,单元格数组有 30,000 个单元格,指针从最左边的单元格(单元格 0)开始。

为了将我们新获得的关于脑力劳动的知识付诸实践,我们将编写一个简单的程序来打印GEEKS FOR GEEKS

方法很简单。首先,我们需要列出我们想要打印的字符类型并列出它们的 ASCII 代码。然后我们需要在所需数量的单元格中存储最接近其 ASCII 代码的值,以便我们可以通过递增或递减这些单元格值并打印所需字符来获得准确的 ASCII 代码。

在不同单元格中存储 ASCII 值

在进一步向下滚动并查看代码之前,我强烈建议您尝试自己编写代码。您可以在此 IDE 上测试您的代码 – Le Brainfuck 专门用于编译 BrainFuck 代码。

// You need to use https://copy.sh/brainfuck/ to run 
// this code.
  
/** Using different cells to store different numeric values
  * Cell 1 = 70; Cell 2 = 80; Cell 3 = 30
  * These base values can then be incremented or decremented
  * to store ASCII values of the characters we need to print */
++++++++++ //Cell 1 = 70(To run the loop 10 times)
[
>+++++++ // Cell 1 = 7*10 
>++++++++ // Cell 2 = 8*10
>+++ // Cell 3 = 3*10
<<<- // Setting the pointer back to cell 0 & decrement
] // end of loop
  
/**Final numeric values in each cell
   *Cell 0 = 0; Cell 1 = 70; Cell 2 = 80; Cell 3 = 30*/
  
// Moving from Cell 0 to Cell 1
>+.--..++++++. // Printing "GEEK"(ASCII 71, 69, 69 75)
  
// Moving from Cell 1 to Cell 2
>+++. // Printing "S"(ASCII 83)
  
// Moving from Cell 2 to Cell 3
>++. // Printing " "(ASCII 32)
  
// Moving the pointer back to Cell 1
<<-----. // Printing "F"(ASCII 70)
  
//Moving from Cell 1 to Cell 2
>----.+++. // Printing "OR"(ASCII 79, 82)
  
// Moving from Cell 2 to Cell 3
>. // Printing " "(ASCII 32)
  
//Moving from Cell 3 to Cell 1
<<+.--..++++++. //Printing "GEEK"(ASCII 71, 69, 69 75)
  
//Moving from Cell 1 to Cell 2
>+. //Printing "S"(ASCII 83)
Output : GEEKS FOR GEEKS

脑筋急转弯的应用:
1) Brainfuck 没有很多实际用途。
2) 它的创造者 Urban Müller 设计了 Brainfuck,目的是用尽可能小的编译器来实现它。
3)深奥的编程语言通常用于测试计算机编程语言设计的边界,作为软件艺术或仅用于娱乐编程。

如果您想查看更多用 Brainfuck 编写的程序,请访问此链接。

练习的问题:
1) 极客
2) BFMUL

资料来源:
Brainfuck-Wikiwand