Код-гольф - Создание генератора кода для печати строк в Brainfuck
1,00
р.
р.
Внимание! Соревнование окончено! Огромное спасибо всем тем, кто принял в нем участие) Вы можете ознакомиться с результатами и различными алгоритмами решения поставленной задачи ниже, а если вдруг у Вас возникнет хорошая идея реализации всего этого дела - не стесняйтесь и публикуйте, ведь пусть конкурс уже и закрыт, идеи, предложенные здесь, возможно, впоследствии порадуют одинокого странника ruSO, изучающего вопросы по меткам code-golf и соревнование)
Товарищи! Давненько не проходило у нас никаких соревнований, так что стоит исправить сие досадное упущение)
Думаю, каждый из нас хоть немного знаком с эзотерическим языком Brainfuck и его в буквальном смысле мозговыносящим синтаксисом. Обычное Hello world выглядит страшнее и сложнее ПО для Аполлона 11... А почему бы не автоматизировать процесс создания кода на Brainfuck для вывода нужных нам строк? Таки вопрос риторический, ибо этим мы и займемся)
Задача: Требуется описать на любом языке программирования функцию, которая в качестве аргумента принимает строку, а на выход дает код на языке Brainfuck (также в виде строки), позволяющий распечатать входную строку
Подробнее: Как Вы понимаете, функцию необходимо максимально ужать. Однако это еще не все: роль также будет играть длина выходного кода, так что решение "в лоб" не подойдет) Вам необходимо будет протестировать свой код на следующих двух строках: s1 = "Hello world" s2 = "Goodbye Brainfuck"
Правила: При решении задачи можно использовать любой язык программирования Можно оставлять несколько вариантов ответа (в разных постах) Запрещено использовать какие-либо сторонние библиотеки для решения поставленной задачи, если они не являются частью используемого языка/платформы Запрещено внутри реализуемой функции использовать строки s1 и s2 в явном или зашифрованном виде Желательно оставлять ссылку на онлайн-компилятор Вашего кода В ответе приводите как минифицированную версию Вашей функции, так и "развернутую" (пояснения приветствуются), чтобы каждый мог разобраться в магии Вашего кода и, возможно, почерпнуть что-то для себя Сгенерированный код на Brainfuck должен быть рабочим и выводить строки s1 и s2 (проверить код можно, скажем, тут или тут) Обязательным условием является наличие у Вашего ответа заголовка в формате
Язык, Кол-воСимволов
(требуется для парсера таблицы лидеров) Рассчет символов определяется следующей формулой:N = func.Length + Ceil(1.5 * (B(s1).Length + B(s2).Length)) N - число символов, которое необходимо указать в ответе func.Length - длина Вашей минифицированной функции (следует учитывать только длину тела функции) B(s1).Length - длина выходного кода для строки s1 B(s2).Length - длина выходного кода для строки s2 Ceil - функция округления к ближайшему целому, которое больше заданного значения (Ceil(2.5) == 3) Продолжительность соревнования: 7 дней
Определение победителей: Победители определяются по следующей градации: Реализация с наименьшим числом символов Реализация с наивысшим активным рейтингом (общее число плюсов - общее число минусов) Реализация с самой ранней первой редакцией P.S. - работа автора поста не принимает участия в подведении итогов
Если возникнут вопросы по правилам проведения конкурса - задавайте их в комментариях)
Удачи в реализации, товарищи!
Итоги: 1 место: @Groxan - c#, ответ занял 745(!) символов 2 место: @b1nary - python, ответ занял 827 символов 3 место: @rjhdby - php, ответ занял 834 символа Собственно, хотелось бы сказать пару слов о прошедшем соревновании) Еще раз огромное спасибо каждому, кто принял участие в сием мероприятии, ведь, думаю, каждый из нас смог почерпнуть из идей других участников что-то новое и интересное! Было очень интересно разбирать код, его ужатый вид, а также и логику во всех ответах, каждый из которых по-своему элегантен и интересен) И отдельно, конечно, хочется сказать про работу @Groxan, которая заняла всего 745 символов! Честно, когда я предложил данный эвент, я даже не предполагал, что хоть одна реализация преодолеет барьер в 800 символов. Но это таки случилось. Работа победителя нашего соревнования проделала уверенный путь от 912 символов к победным и действительно удивительным 745 символам! Почему "удивительным"? Предложенный алгоритм смог посоревноваться не только с участниками данного код-гольфа, но и с решением, приведённым на Wikipedia (111 символов): ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. Сгенерировав код для строки Hello World! (отличается от конкурсной строки s1) алгоритмом из ответа-победителя, мы получим ровно те же 111 символов: -[------->+<]>-.-[->+++++<]>++.+++++++..+++.+[->--<]>.---[->+++<]>.+[--->--<]>-.+++.------.--------.-[--->+<]>. Удивительное совпадение) Очень радует, что наше соревнование и совместные усилия участников смогли создать такой вот замечательный алгоритм! Так что еще раз отдельное спасибо каждому участнику! До новых соревнований!
Ответ Brainfuck, 4277 Конечно же в подобных заданиях веселья ради должен найтись идиот сумасшедший, который напишет код на самом Brainfuck Итак, сама функция (74 символа): ++++++[>+++++++<-]>+>++++++++[>++++++++<-]>-->,[[<<<.>>>-]<<<+++.--->>.>,] Код для s1 (1106 символов): ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.> Код для s2 (1696 символов): +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>
Функция в более читаемом виде: ++++++[>+++++++<-]>+ // Записываем код для знака плюс > ++++++++[>++++++++<-]>-- // Записываем код для знака перехода в следующую ячейку > , // Считываем символ [ // Запускаем цикл зпт который будет идти до символа '\0' [<<<.>>>-] // Печатаем число плюсов зпт необходимое для печати символа <<< +++.--- // Увеличиваем код ячейки плюса до точки зпт печатаем и возвращаем >>.> // Печатаем символ перехода в следующую ячейку , // Читаем следующий символ ] Логика алгоритма: Собственно, думаю, логика ясна из пояснений к коду: мы читаем нуль-терминированную строку, для каждого символа выводим кол-во знаков +, равное его ASCII-коду, а также символы . (для печати) и > (для перехода в следующую ячейку)
Алгоритм совершенно не оптимален (видно из числа символов хД), зато функция короткая да и написана на языке-герое сего мероприятия)