Вступление
Большинство разработчиков кода добавляют здесь объяснения к своим материалам, чтобы было легче понять, что происходит. Обычно строки кода идут слева, а соответствующее объяснение справа с каким-то разделителем. Чтобы это выглядело красиво, все разделители находятся в одном столбце. Кроме того, длинный текст объяснения обычно переносится на следующую строку, поэтому читателям не нужно прокручивать текст по горизонтали, чтобы прочитать все.
Однако, когда вы хотите отредактировать это объяснение, потому что вы сделали несколько сумасшедших гольфов, вы часто заканчиваете тем, что тратите время, чтобы сделать это объяснение довольно симпатичным. Поскольку это очень повторяющаяся задача, вы хотите написать программу для этого.
Соревнование
Учитывая несколько строк кода с объяснением и разделителем, выведите красиво отформатированный код с объяснением.
пример
вход
shM-crz1dc4. "ANDBYOROF # z = вход rz1 # преобразовать ввод в верхний регистр cd # разделить ввод по пробелам c4. "ANDBYOROF # создать список слов из упакованной строки, которые должны игнорироваться - # отфильтровать эти слова hM # взять только первую букву всех слов s # объединить их в одну строку
Выход
shM-crz1dc4. "ANDBYOROF # z = вход rz1 # преобразовать ввод в верхний регистр cd # разделить ввод по пробелам c4. "ANDBYOROF # создать список слов из упакованной строки, которая должна быть # игнорируется - # отфильтровать эти слова hM # взять только первую букву всех слов s # объединить их в одну строку
Один файл cookie для первого, кто может узнать, что делает этот код.
Алгоритм форматирования
- Найдите самую длинную строку кода (исключая пояснения и пробелы между кодом и разделителем).
- Добавьте 5 пробелов после этой строки кода и добавьте соответствующий разделитель с пояснениями. Это теперь опорная линия.
- Настройте все остальные строки в этой опорной линии, так что все сепаратора обеспечивают в одном столбце.
- Оберните все строки длиной более 93 символов в новую строку следующим образом:
- Найдите последнее слово, конец которого находится в столбце 93 или ниже.
- Возьмите все слова после этого и перенесите их на новую строку с ведущим разделителем и правильным интервалом. Пробел между этими двумя словами должен быть удален, поэтому первая строка заканчивается символом слова, а вторая строка начинается с одного после разделителя.
- Если полученная строка все еще длиннее 93 символов, делайте то же самое снова, пока каждая строка не станет ниже 94 символов.
Примечания
- Слово состоит из непробельных символов. Слова разделяются одним пробелом.
- Перенос слов всегда возможен. Это означает, что ни одно слово не может быть таким длинным, чтобы сделать обертку невозможной.
- Входные данные будут содержать только печатный ASCII и не будут содержать пробелы в конце
- Разделитель будет отображаться только один раз в строке.
- Хотя объяснение может иметь неограниченную длину, разделитель и код могут иметь только суммарную максимальную длину
93 - 5 = 87
символов. 5 символов - это пробелы между кодом и разделителем. Код и разделитель всегда будут длиной не менее одного символа. - Входные данные могут содержать пустые строки. Они никогда не будут содержать никаких символов (кроме новой строки, если вы берете ввод в качестве многострочной строки). Эти пустые строки также должны присутствовать в выводе.
- Каждая строка будет иметь некоторый код, разделитель и объяснение. Исключение составляют пустые строки.
- Вы можете принять ввод в любом разумном формате, если он не был предварительно обработан. Укажите в своем ответе, какой из них вы используете.
- Вывод может быть многострочной строкой или списком строк.
правила
- Функция или полная программа разрешены.
- Правила по умолчанию для ввода / вывода.
- Стандартные лазейкиПрименяются .
- Это код-гольф , поэтому выигрывает меньшее количество байт. Tiebreaker является более ранним представлением.
Контрольные примеры
Формат ввода здесь представляет собой список строк, представляющих строки и одну строку для разделителя. Оба разделены запятой. Вывод представляет собой список строк.
['shM-crz1dc4. "ANDBYOROF # z = input', '', 'rz1 # преобразовать ввод в верхний регистр', 'cd # разделить ввод пробелами', 'c4." ANDBYOROF # создать список слов из упакованного строка, которая должна игнорироваться ',' - # отфильтровать эти слова ',' hM # взять только первую букву всех слов ',' s # объединить их в одну строку '], "#" -> [' shM-crz1dc4 . "ANDBYOROF # z = input ',' ',' rz1 # преобразовать ввод в верхний регистр ',' cd # разбить ввод на пробелы ',' c4. 'ANDBYOROF # создать список слов из упакованной строки, которая должна быть' , '# игнорируется', '- # отфильтровать эти слова ',' hM # взять только первую букву всех слов ',' s # объединить их в одну строку '] ['codecodecode e # Объяснение', 'sdf dsf sdf e # A Очень, очень, очень, очень, очень, очень, очень, очень, очень долго, долго, долго, долго, долго, долго, долго, долго, долго, долго, и это становится все длиннее и длиннее.', '', 'some больше коде # и еще несколько объяснений '], "e #" -> [' codecodecode e # Объяснение ',' sdf dsf sdf e # A Очень, очень, очень, очень, очень, очень, очень, очень, очень долго, долго, долго, долго, долго »,« e # long. длинное длинное длинное длинное длинное объяснение, и оно становится все длиннее ',' e # и дольше ',' ',' еще немного кода e # и еще больше объяснений ']
Удачного кодирования!
length of the longest code-line + 5
. Это также относится к строкам, которые содержат только пояснения, потому что они были перенесены.Ответы:
Рубин,
245237220216212209205 байтАнонимная функция. Довольно базовый подход (найдите максимальную длину, добавьте 5, затем выполните обработку в каждой строке с рекурсией, чтобы справиться с переносом), и может быть другой подход, который экономит больше байтов.
Ранее я удалил ответ, который не удовлетворял всем требованиям; Я не хотел, чтобы в качестве ответа использовался код с половинным ответом (он тоже получал отрицательные отзывы за то, что он был неполным), но теперь он должен делать все, о чем просит вопрос.
Changelog:
map
вызова и выполнив некоторые ненужныеstrip
функции, основываясь на обещании, что слова в объяснении всегда имеют ровно один пробел между ними. Кроме того," "
теперь присваивается константа, так как я так часто ее использую.map
вызовов объединены, используя мощь функций более высокого порядка, что означает, что первый вызов карты будетl
правильно устанавливать переменную длины, даже если он вызывается после объявления вспомогательной функцииs
. -4 байта.\n
реальными символами новой строки, а также небольшая хитрость с использованиемif
более троичных операторов (приjoin
вызове массива соnil
значениями они становятся пустыми строками).join
по-видимому, может быть заменен на*
.источник
93 - 5 = 87
символов. 5 символов - это пробелы между кодом и разделителем. Код и разделитель всегда будут иметь длину не менее одного символа». Ваш раздел кода далеко за пределом, с 97 символами, поэтому программа имеет неопределенное поведение.LiveScript,
243236233228219225 байтКак это работает: в основном, как код Java. Начните с псевдонима длины (LiveScript позволяет создать функцию из операторов с помощью круглых скобок).
.=
этоa = a.b
- что мы используем здесь, чтобы отобразить.=> blabla ..
является каскадной конструкцией Smalltalk-ih: левая сторона=>
доступна как..
для остальной части блока; и будет возвращен. Здесь это элемент разбит на k. Примечание: я использую интерполяцию строк, потому что/
означает только «разделить» с литеральной строкой.LS позволяет нам использовать и
a-=/regexp/
в этой лямбде (также работает со строковыми литералами): это просто сахар для.replace
вызова.Наконец,
>?=
это комбинаторный>?
оператор -assin, который возвращает больший из двух операндов.У LS есть Python / Haskell-стиль для понимания, в котором нет ничего фантастического, кроме «string * times», чтобы повторять пространство достаточно долго.
Это для понимания служит темой (см. Блок о каскадах anove).
Затем мы зациклились на каждом элементе массива (тот, который мы только что построили с пониманием), и, если какая-либо строка больше 93 символов, мы находим последний индекс, разделяем его и вставляем разделенную строку сразу после текущей итерации ( ... чтобы следующая итерация снова разбилась, если строка слишком большая).
Только последняя вещь фантазии
a[j to]
является диапазон (от J до конца), но так как он использует методы массива мы должны объединить его обратно в строку, которая нам использовать перегруженный*
:*''
.пример
выход:
источник
Java, 347 + 19 = 366 байт
требует
Таким образом, +19 байт.
Берет в формате
f.accept(List<String> code, String seperator)
. Форматы на месте. Версия, которая создает и возвращает новуюList<String>
, будет тривиальна для реализации, но будет стоить несколько байтов.Отступ + пример использования:
... я, наверное, должен запустить это через себя: P
источник
replace(" *"+s)
не работает, ноreplaceAll(" *"+s)
я хотел бы услышать это - я не могу понять это.replace
использует строки, ноreplaceAll
использует регулярные выражения. </ badguess>PowerShell,
224217235 байтОбновлена логика для определения максимальной длины строки кода. Обновлен, чтобы разрешить несколько разделителей, которые включают метасимволы регулярных выражений.
Маленькое объяснение
Это берет целую строку с разделителем новой строки для ввода.
Пример вывода с использованием Lorem Ipsum
источник
MATLAB,
270265262 байтаПрограмма принимает входные данные
I
в виде массива ячеек строк, где каждый элемент массива ячеек является отдельной строкой ввода. Он также принимает второй вход, который указывает, что символ комментария (то есть#
). Функция возвращает многострочную строку, которая правильно отформатирована.Краткое объяснение
Пример ввода
Пример вывода
источник