Лучший способ получить кратные числа в клетках в мозге?

Поэтому я пытаюсь заставить ячейки удерживаться так, чтобы первая ячейка содержала ноль (0), вторая - 9*4, вторая - 9*10, третья 9*12, 4-я, 9*13 и так до тех пор, пока у последней используемой ячейки не будет 9*15. То есть, следующий код в brainfuck:

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

Есть ли способ сжать этот код? То есть, имеют ли соответствующие ячейки нужные числа, но используют меньше символов для этого? Я думал об использовании вложенных циклов, но я не совсем уверен, как создать такую ​​вещь. Я новичок в языке, и я пытаюсь проверить его, и я думаю, что я переосмысливаю проблему.

1 ответ

Решение

Чтобы использовать внутренние циклы, найдите факторы числа, которое вы хотите поместить в ячейку.

Предположим, вы хотите установить ячейку на 48

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

Теперь предположим, что я хочу разбить тело цикла, который в настоящее время добавляет 24 на каждую итерацию. Вы делаете тот же процесс. Определите коэффициенты 24: для этого примера давайте выберем 6 и 4. Итак, во внутреннем цикле вы помещаете 2-й цикл (который использует 2-ю временную ячейку для хранения счетчика итераций внутреннего цикла), цикл 4 раза, добавляя 6 каждый раз. Каждый раз, когда этот внутренний цикл выполняется, целевая ячейка заканчивается 24 добавленными к нему, и внутренний цикл выполняется дважды (внешний цикл повторяется дважды), поэтому целевая ячейка заканчивается 48.

Вот пример использования только 1 временной ячейки

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

Это использует ячейку 0 в качестве счетчика и устанавливает ячейку 1 в 48, добавляя 24 дважды.

И вот второй пример с 3 факторами: 2, 4, 6 (2*4*6==48)

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

Это использует ячейки 0 и 1 как временные ячейки и устанавливает целевую ячейку (ячейку 2) также на 48. Как видите, содержимое внутреннего цикла (++++[>++++++<-]) это просто нормальный цикл, как в первом примере.

Совершенно очевидно, что второй короче, но он может работать немного медленнее (не то, что это реальная проблема... во-первых, вы используете BF, вы не ищете производительность)

Теперь, так как вы хотите установить несколько ячеек одновременно, применить код к вашему коду довольно просто. Вы обнаруживаете факторы таким же образом, как я описал выше, и помещаете фактор, который является общим для всех них, в качестве счетчика внешнего цикла, а затем вы создаете отдельные внутренние циклы для каждой ячейки внутри него, используя их оставшиеся факторы. Вы можете даже объединить некоторые из них, если какие-то из внутренних факторов также имеют общие факторы.

Еще одна хитрость, которая может сократить ваш код, когда число не так просто делится, состоит в том, чтобы максимально приблизиться к нужному числу и настроить его в конце.

Чтобы использовать тот же пример, который я использовал выше, если бы я хотел установить ячейку на 49 вместо 48, я бы использовал тот же код, который устанавливает его на 48, а затем добавил бы 1 в конце (или установил бы его на 50 и вычел бы 1) и полученный код может быть еще короче.

Другие вопросы по тегам