Выравнивание линий!
Учитывая символ и многострочную строку, ваша задача состоит в том, чтобы заполнить каждую строку строки так, чтобы они располагались среди заданного разделителя.
Примеры
Входные данные:
,
Programming, Puzzles
And, Code golf
Выход:
Programming, Puzzles
And, Code golf
вход
На входе будет многострочная строка и символ (между которыми вы будете выравнивать), вы можете использовать их в любом порядке / формате. Символ появится ровно один раз в строке. Каждая строка ввода может быть разной длины.
Ввод может быть через аргументы функции или STDIN.
Выход
Выходные данные должны быть одинаковыми по центру строки. Вам разрешен один завершающий символ новой строки и нет пробельных пробелов.
Вывод должен быть дополнен минимальным количеством пробелов. Вы не можете удалять любые начальные пробелы во входных данных (если они существуют).
Выход может быть из функции return или STDOUT.
источник
Ответы:
Pyth, 18 байт
источник
APL (37)
APL просто не очень хорош в обработке струн (или, конечно, я не очень хорош в гольфе).
Принимает символ в качестве левого аргумента, а многострочную строку - в качестве правого аргумента. Предполагается, что многострочная строка оканчивается переводом строки (например,
A\nB\nC\n
вместоA\nB\nC
.) Поскольку я могу использовать «любой формат [я] желаю», и это также обычный формат для текстовых файлов, я думаю, что это разумно.Объяснение:
S←⌽⍵
: перевернуть строку и сохранить ее вS
.R←S⊂⍨S=⊃S
: разделитьS
его на первый символ и сохранить массив строк вR
.⍺⍳¨⌽¨R
: перевернуть каждую строкуR
, а затем найти индекс ⍺ (символа) в каждой строке.(⌈/-+)
: вычтите каждый из индексов из наибольшего индекса, указав необходимое количество пробелов' '/⍨¨
: для каждого из этих значений сгенерируйте столько пробеловR,¨
: добавить пробелы к каждой строке вR
.∊
: объединить все строки вместе⌽
: отменить (вернуть исходный заказ)Пример:
источник
CJam,
232220 байтСпасибо Деннису за сохранение 2 байта.
Это читает строки из аргументов командной строки и символ из STDIN.
Онлайн-интерпретатор не поддерживает аргументы командной строки, но вы можете проверить эквивалентную версию здесь.
объяснение
источник
Пип ,
222018 + 1 = 19 байтПринимает строки в качестве аргументов командной строки и разделителя из STDIN ( идея заимствована из ответа Мартина CJam ). Использует
-n
флаг для печати выходных значений в отдельных строках.И пример запуска:
источник
JavaScript ES 2015, 113 байт
Не так коротко, как языки гольфа, опубликованные до сих пор. Принимает ввод как два аргумента функции, например
f(',','Programming, Puzzles\nAnd, Code golf')
. Ниже приведен фрагмент кода, в котором есть простой способ проверки.источник
Pyth,
2724 байтаОбновлено для последней версии Pyth .
Живая демоверсия.
27-байтовая версия
Живая демоверсия.
источник
jbm
в начале своего ответа, вы должны немедленно начать думать оV
.b
Юлия, 117 байт
Ungolfed:
источник
Python 3, 85 (IDLE 3.2.2, Windows)
Довольно просто. Это находит положение символа в строке дважды: один раз, чтобы найти максимум (ну, один раз на строку), и один раз, чтобы найти смещение. Я пытался объединить их, но это было дольше.
Python 3 используется для распаковки ввода. Мой IDLE, кажется, принимает многострочные строки в качестве входных данных.
источник
c
получает разделитель иs
получает пустой список. Последующие звонки, чтобыinput()
вернуть оставшиеся строки одну за другой.Желе , 12 байт
Попробуйте онлайн!
Совершенно и golfed с Caird coinheringaahing в J Elly Н Yper Т дождь (JHT) , наши Желе практик чат.
Как это работает
Третий аргумент командной строки (первый ввод) должен быть многострочной строкой, а символ должен быть четвертым аргументом командной строки (второй ввод).
Я не уверен, разрешено ли использование ввода в качестве списка строк, поэтому в качестве ввода используется многострочная строка. Если бы это было разрешено:
10 байт
Попробуйте онлайн!
источник
Matlab / Octave, 106 байт
Функция, которая использует три отдельных аргумента для символа, строки, строки; и дает результат в стандартный вывод:
Пример в Matlab:
Или попробуйте онлайн с переводчиком Octave.
источник
Юлия, 80 байт
Ungolfed:
источник
JavaScript (ES6), 105
Используя строки шаблона, 2 новых строки значимы и подсчитаны.
Тестовый запуск фрагмента в любом браузере, совместимом с EcmaScript 6 (то есть FireFox. Chrome не поддерживает параметры по умолчанию)
источник
Python 2, 93 байта
Называется так:
источник
C # 4.0,
329320307 байтБезголовая версия:
Он принимает максимум 9999 строк ...
источник
Дьялог АПЛ ,
222016 байт-4 благодаря нгн.
APL на самом деле не так уж и плох при обработке строк, если ему разрешено работать с массивами. В этой задаче мы можем выбрать наиболее подходящий формат, который для APL означает вектор текстовых векторов в качестве левого аргумента, а разделитель в качестве скалярного правого аргумента. Это даже обрабатывает несколько разделителей на строку и выравнивает первый из каждой строки.
⊣,¨⍨
добавьте каждую строку с' '⍴¨⍨
столько пробелов, сколько⌈.⍳
самый правый индекс символа среди строк-
минус⍳¨
индекс символа в каждой строкеПопробуйте APL онлайн! (
↑
добавлено для вывода на печать по вертикали)Бонус? Работает для любого количества строк и разделителей (выравнивается по левому краю).
источник
⊣,¨⍨' '⍴¨⍨⌈.⍳-⍳¨
С #, 191
Как функция. Примерно портирование моего ответа JS.
источник
Рубин, 74 байта
и называть это как
источник
R, 68 байт
Безымянная функция, которая принимает
3
входные данные;c
который является символом для выравнивания,x
является первой строкой иy
второй строкой.В R функция
regexpr
возвращает позицию данного шаблона в строке. Решение работает с применениемregexpr
обеих строк и повторяющихся пробелов, равных разнице, и впоследствии просто печатает оба ввода, разделенные новой строкой.источник
Python 2,
6766 байтВызывается с:
источник
Moonscript, 138 байт
Это возвращает функцию, которая принимает 2 аргумента. Первый - это строка, второй - символ, по которому нужно выровнять. Эти аргументы являются неявным аргументом @ и n.
Сначала я добавляю новую строку в строку, чтобы облегчить обработку.
Теперь я генерирую список позиций каждого символа выравнивания, используя
gmatch
. Затем я заменяю новую строку перед каждой строкой на правильное количество пробелов, затем обрезаю новую строку, добавленную в начале.источник
Луа, 169 байт
Не так коротко, как другие ответы, но это мой первый: D
источник
Сетчатка , 71 байт
Попробуйте онлайн! Примечание: это оставляет символ выравнивания в выводе; его можно удалить по стоимости 4 байта. Если нужно выровнять только две строки, то для 52 байтов:
Объяснение:
Это соответствует символу выравнивания.
Это соответствует первой строке, а также отслеживает, сколько символов было до символа выравнивания. (.NET сохраняет стек совпадений для каждой переменной, в этом случае
$3
.)Это соответствует второй строке, пытаясь учесть столько символов, сколько мы нашли в первой строке.
?<-3>
заставляет совпадение вытолкнуть стек для каждого символа, пока он не станет пустым, и в этот момент совпадение завершится неудачно, а(.)*
затем сопоставит оставшиеся символы до символа выравнивания. На данный момент у нас есть следующие переменные:$1
содержит символ выравнивания$2
содержит первую строку$3
содержит стек, длина которого - префикс первой строки минус префикс второй строки$4
содержит вторую строку$5
содержит стек, длина которого - префикс второй строки минус префикс первой строки$#5$*
затем ставит префикс необходимого количества пробелов, чтобы первая строка выровнялась со второй, и наоборот для$#3$*
.Аналогичная логика применима к основному ответу, за исключением того, что здесь мы должны найти две линии, которые не выровнены, чтобы мы могли выровнять их (это то, что нужно
?(5)
), а затем повторить выравнивание по всем линиям, пока все они не выровняются ,источник
Common Lisp, 101 байт
Первый параметр - это символ, второй - список строк для выравнивания.
Попробуйте онлайн!
источник