Comments 17
Кстати, весь исходный код можно было бы хорошо сжать. Кажесь, там большую часть кода занимают смещения по регистрам. У меня их всего 32, но можно было бы обойтись восьмью: четыре общего назначения, четыре временных. Это бы сделало код в несколько раз короче
Можно и без сокращения числа регистров сократить код. Набросал простенький оптимизатор на js :)
let program = '>>><<<<+<<>>>';
let oldp, newp = program;
do { oldp = newp; newp = oldp.replace(/><|<>/g, ''); } while (oldp != newp);
console.log(newp); // <+>
Ох, эта красота заставила улыбнуться
И в целом хороший туториал по теме «как и желудей и веток получились процессоры»
Годнота! итоговый код на brainfuck выглядит сильно оптимальнее того что генерирует C2bf - там такая лютая стек-машина генерируется, что производительность падает в сотни раз по сравнению с нативым кодом на bf.
Возьму себе на вооружение - буду программки для лампового компьютера генерировать. Осталось только выучить хаскель :)
Продвинутые эйчары еще не начали на литкоде предлагать быстренько порешать задачи на bf?
Давно буханки на хабре не было..
Я конечно нуб в BF, но имея только указанные операции, как присваивается начальное значение для того, что будет изменяться?
[-]++...+
. В си это эквивалентно
while(*ptr) {
*ptr --;
}
// Тут *ptr == 0
*ptr ++;
*ptr ++;
// ...
*ptr ++;
// Тут у *ptr нужное значение
Спасибо. Стало понятнее.
В качестве дополнительного комментария. Первые три символа - это очищение ячейки (можно и опускать, но никто не гарантирует, что там раньше был 0), потом плюсиками увеличиваем значение ячейки до нужного значения. И вот здесь можно применить небольшую хитрость.
например надо в ячейку записать число 27.
решение в лоб - вбиваем 27 плюсов.
+++++++++++++++++++++++++++
решение два. представим число 27 как 5*5+2 на bf это будет выглядеть так:
>[-]+++++[<+++++>-]<++
прыгаем на следующую ячейку, заносим туда число 5. возвращаемся на текущую ячейку. увеличиваем ее на 5, прыгаем на следующую ячейку, уменьшаем ее на 1 и если не ноль, то возвращаемся на знак "[" и повторяем цикл. получаем 5*5. осталось только добавить 2.
В результате получили сокращение кода. И чем больше число, тем больше будет сокращение.
Для автора, это кстати, идея для организации дальнейшей оптимизации получаемого кода.
Промахнулся.
Ломаем хаскелем Brainfuck