Squeak.ru - шаблоны программирования

Мозговое умножение

Я только что узнал об очень простом синтаксисе Brainfuck и попытался быстро бросить себе вызов, запрограммировав сценарий «Hello World». На данный момент у меня есть почти все буквы до "о" в приветствии. Насколько я знаю, код ASCII для o111. Вот мой код для получения этого числа и печати o:

+++++[>>++<<-][-]>>+[<<+++++[>>>++<<<-]>>-]>+.

Разбивая его, я устанавливаю [2] равным 11, оперируя 2*5+1. Затем я добавляю 10 к [3] при каждом уменьшении [2], то есть 11 раз. Должно получиться 110, поэтому я добавляю единицу в конце перед печатью. Тем не менее, я продолжаю появляться с кодом ASCII 91 или Hell[. Где я ошибся?

Заранее спасибо!

РЕДАКТИРОВАТЬ: я просто изменил его на 6+ в начале, и теперь он работает? Даже при том, что будет работать 13*10+1 = 131, а не 11? Хмммммм

12.11.2016

Ответы:


1

Я только что попытался запустить это в своем (самозапрограммированном) Brainfuck-интерпретаторе и получил 'o', как вы и ожидали. Так что, возможно, у вас проблемы с вашим переводчиком.

Другая возможная (и более вероятная!) причина вашей проблемы заключается в том, что ваши ячейки использовались ранее и все еще имеют значения, не равные нулю. Я предполагаю, что они использовались раньше, потому что вы показываете здесь только небольшую часть своего кода (вы уже напечатали 'hell' (кстати, очень смешно, xD) и пропускаете cell[1]).

Лично я разбил ASCII-таблицу на блоки по 16 символов. Поэтому, если я хочу получить определенный символ, я умножаю 16 на 3 (для цифр), 4 (для прописных букв) или 6 (для строчных букв). Однако для некоторых букв я умножаю 16 на 5 или 7, если это "быстрее" (более короткий код). Например, 'o' я бы получил так:

++++                write 4 in cell(0)
[                   while cell(0) != 0
    >++++           write 4 in cell(1)
    [               while cell(1) != 0
        >+++++++    add 7 to cell(2)
        <-          decrement cell(1)
    ]               go back to 'while cell(1) != 0'
    <-              decrement cell(0)
]                   go back to 'while cell(0) != 0'
>>                  go to cell(2) (has value 4*4*7 = 0x70 or 'p')
-                   decrement cell(2) (it's an 'o' now)
.                   print cell(2)
15.11.2016

2

Я знаю, что Brainf*ck не заботятся об отступах и прочем. Но вы должны подумать о том, чтобы сделать отступ в коде, потому что это облегчает чтение.

Давайте посмотрим на ваш код:

+++++                  intialize counter (cell #0) to 5
[                      use loop to set cell #2 to 10
    >>++                   add 2 to cell #2
    <<-                
]
[-]                    does actually nothing
>>+                    add 1 to cell #2
[                      use outside with cell #2 as counter
    <<+++++            sets cell #0 to 5
    [                  use inner loop to add 10 to cell #3
        >>>++
        <<<-
    ]
    >>-
]
>+.                    add 1 to cell #3 and print result

Ваш код на самом деле работает так, как ожидалось, причина того, что он не работает, может заключаться в том, что код, который выполняется перед этой частью, устанавливает для ячеек другие начальные значения.

Это много кода, чтобы просто напечатать «о», вы могли бы напечатать его после первого цикла из ячейки № 2, второй цикл не нужен. Вот пример печати «Hello World» с помощью Brainf*ck:

+++++ +++++             initialize counter (cell #0) to 10
[                       use loop to set 70/100/30/10
    > +++++ ++              add  7 to cell #1
    > +++++ +++++           add 10 to cell #2
    > +++                   add  3 to cell #3
    > +                     add  1 to cell #4
<<<< -                  decrement counter (cell #0)
]
> ++ .                  print 'H'
> + .                   print 'e'
+++++ ++ .              print 'l'
.                       print 'l'
+++ .                   print 'o'
> ++ .                  print ' '
<< +++++ +++++ +++++ .  print 'W'
> .                     print 'o'
+++ .                   print 'r'
----- - .               print 'l'
----- --- .             print 'd'
> + .                   print '!'
> .                     print '\n'

Следующий веб-сайт может помочь вам протестировать код Brainf*ck: Brainfck Visualizer.

15.11.2016
  • хорошие упоминания, хотя это не дает прямого ответа на вопрос. Вы анализируете его код, но не говорите, что в нем не так (код на самом деле не является неправильным, но вы также не говорите об этом). Вы говорите, что для печати 'o' требуется много кода, но это херня: вам нужно много кода, чтобы делать простые вещи. Вы приводите ему пример Hello World!-программы, хотя он явно пытался найти собственное решение. Тем не менее, некоторые упоминания по-прежнему хороши, например does actually nothing (может быть, вы могли бы объяснить, почему [-] ничего не делает в этом случае, но ладно). 16.11.2016
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...