Лучший способ получить кратные числа в клетках в мозге?
Поэтому я пытаюсь заставить ячейки удерживаться так, чтобы первая ячейка содержала ноль (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) и полученный код может быть еще короче.