Brainf * ck Loop Problem

19

У меня проблема с кибер-клубом, который просит вас напечатать:

ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!

Использование Brainf ** k в 29 байтах или менее без использования символа «,».

У меня есть рабочий код:

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

Однако мой цикл слишком длинный, отправив мне 16 байтов сверх лимита.

Есть ли более эффективный способ установить вторую и третью ячейки 58 и 90, чтобы я мог запустить свой второй цикл? Или есть лучший способ сделать это все вместе, которого я просто не вижу?

Ник Род
источник
1
Что касается вашего вопроса, то, хотя он сохраняет только четыре байта, на самом деле лучше сгенерировать 59 и 90 и изменить их -.на .-сбрасывая >.<.
Мартин Эндер
Я получил +[--->++<]>++++[.-]19 байтов, но он также печатает контрольные символы ...
Timtech
@MartinEnder Да, извините за это, я увидел ваш комментарий к другому посту и нашел эту группу, которая выглядела намного более подходящей, я удалю одну на SO, так как она не вызвала много ответов.
Ник Род
2
Мне, честно говоря, любопытно, что это за «кибер-клуб», потому что, парень, у них должны быть действительно хорошие игроки в гольф!
Sp3000

Ответы:

23

27 24 байта

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

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

Попробуйте онлайн!

Компонент ++[<++[++<]>>>+]инициализирует ленту

[130, 0, 0, 0, 91, 59, 0]
                       ^

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

Sp3000
источник
8
Wizardry. (∩`-´) ⊃━ ☆ ゚. * ・。 ゚
primo
@primo Честно говоря, я не знаю, что происходит со структурой в первой половине, и я думаю, что тот факт, что вы можете придумать свои собственные алгоритмы / методы, удивителен :)
Sp3000
Лента в конце каждого цикла: codepad.org/ZoJUlQ8M . Это совсем не интуитивно понятно, что он будет заканчиваться на значениях, которые он делает, или даже вообще;)
primo
1
Альтернатива 24:+[[>++<<]>->+>+]<[-<-.>]
Примо
15

30 байтов

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

Попробуйте онлайн!

85 и 171 довольно просто генерировать в мозговом потоке (модульные инверсии 3 и -3 ). 85 довольно близко к 90 , а 171 довольно близко к 177 ( 59 · 3 ), который используется здесь. С некоторой долей хакерства я могу вместо этого производить 88 и 176 .

Тем не менее, на один байт меньше цели.

Другие предложения

В общем, итерация по списку короче, умножается на константу, а не наоборот. Это особенно верно для 3 или более значений. Например, это:

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

можно записать как:

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

Внутренних ценностей было всего два, так что в этом случае улучшение не сильно. На самом деле, просто рефакторинг на один байт короче:

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

Умножение 30 на 2 и 3 , а не 10 на 6 и 9 . По предложению Мартина Бюттнера, это уже до 38 байт, без особых изменений в оригинале:

+++++[>++++++[>++>+++<<-]<-]>>-[>.-<-]
Примо
источник
Я никогда бы не подумал о том, чтобы умножить число 58 и сделать итерацию на большее число, это гораздо эффективнее.
Ник Род
4

34 байта

Вы сэкономили 11 байтов, но все еще 5 байтов слишком длинны ...

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

Я уже часами, надеюсь, кто-то может улучшить это.

Timtech
источник