Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
Полностью выровненный означает, что он выровнен по левому и правому краям и достигается путем увеличения расстояния между словами до тех пор, пока не совпадет каждая строка.
Связанный:
- Обоснуйте текст, добавив пробелы
- Выровнять текст по блоку
- И в некотором смысле это можно считать следующим шагом в Обработка текста № 1: переносы слов (который, кажется, никогда не был опубликован).
вход
Вы можете принять вход в любом формате, который вам нравится. Вам будет предоставлено:
- Целевая ширина (в символах), в диапазоне 5-100 (включительно);
- Блок текста, содержащий возможно дефисные слова. Это может быть строка, разделенная пробелом, массив слов или массив массивов фрагментов слов (или любое другое представление данных, которое вы пожелаете).
Типичный ввод может быть:
Width: 25
Text: There's no bu-si-ne-ss lik-e s-h-o-w busine-ss, n-o bus-iness I know.
Где дефисы обозначают возможные точки переноса, а пробелы обозначают границы слов. Возможное альтернативное представление текста:
[["There's"], ["no"], ["bu", "si", "ne", "ss"], ["lik", "e"], (etc.)]
Выход
Входной текст с пробелами, добавленными между словами, символами новой строки по ширине столбца и точками переноса, выбранными для полного выравнивания по ширине столбца. Для функций массив строк (по одной на каждую строку) может быть возвращен вместо использования разделения новой строки.
Возможный вывод для вышеуказанного ввода может быть:
There's no business like
show business, no bus-
iness I know.
Обратите внимание, что все дефисы были удалены, кроме одного в последнем «bus-iness», которое используется, чтобы показать, что слово переносится на следующую строку, и было выбрано так, чтобы вторая строка содержала как можно больше текста.
правила
В каждой строке количество пробелов между словами не может изменяться более чем на 1, но если вы вставляете лишние пробелы, это зависит от вас:
hello hi foo bar <-- not permitted (1,1,5) hello hi foo bar <-- not permitted (2,1,4) hello hi foo bar <-- OK (2,2,3) hello hi foo bar <-- OK (2,3,2) hello hi foo bar <-- OK (3,2,2)
Никакая строка не может начинаться или заканчиваться пробелами (кроме последней строки, которая может заканчиваться пробелами).
Последняя строка должна быть выровнена по левому краю и содержать одинарные пробелы между каждым словом. За ним может следовать произвольный пробел / символ новой строки, если это необходимо, но это не обязательно.
Слова будут состоять из AZ, az, 0-9 и простой пунктуации (
.,'()&
)Можно предположить, что ни один фрагмент слова не будет длиннее целевой ширины, и всегда будет возможно заполнить строки в соответствии с правилами (т. Е. В каждой строке будет как минимум 2 фрагмента слова или 1 фрагмент слова, заполняющий строку в совершенстве)
Вы должны выбрать точки переноса, которые максимизируют количество символов слова в более ранних строках (т.е. слова должны жадно потребляться строками), например:
This is an input stri-ng with hyph-en-at-ion poi-nts. This is an input stri- <-- not permitted ng with hyphenation points. This is an input string with hyph- <-- not permitted enation points. This is an input string with hyphen- <-- OK ation points.
Самый короткий код в байтах выигрывает
Примеры
Width: 20
Text: The q-uick brown fox ju-mp-s ove-r t-h-e lazy dog.
The quick brown fox
jumps over the lazy
dog.
Width: 32
Text: Given a width and a block of text cont-ain-ing pos-sible hyphen-ation points, for-mat it ful-ly-just-ified (in mono-space).
Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
Width: 80
Text: Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.
Programming Puzzles & Code Golf is a question and answer site for programming
puzzle enthusiasts and code golfers. It's built and run by you as part of the
Stack Exchange network of Q&A sites. With your help, we're working together to
build a library of programming puzzles and their solutions.
Width: 20
Text: Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.
Programming Puzzles
& Code Golf is a
question and answer
site for programming
puzzle enthusiasts
and code golfers.
It's built and run
by you as part of
the Stack Exchange
network of Q&A
sites. With your
help, we're working
together to build a
library of program-
ming puzzles and
their solutions.
Width: 5
Text: a b c d e f g h i j k l mm nn oo p-p qq rr ss t u vv ww x yy z
a b c
d e f
g h i
j k l
mm nn
oo pp
qq rr
ss t
u vv
ww x
yy z
Width: 10
Text: It's the bl-ack be-ast of Araghhhhh-hhh-h-hhh-h-h-h-hh!
It's the
black be-
ast of
Araghhhhh-
hhhhhhhhh-
hhh!
источник
anybod-y
с шириной 7, мы можем выбрать для вывода сигналаanybody
илиanybod-\ny
?Ответы:
JavaScript (ES6), 218 байт
Принимает аргументы в каррирующем синтаксисе (
f(width)(text)
), а ввод текста осуществляется в формате двойного массива, описанного в задании. Строки конвертируются в этот формат через.split` `.map(a=>a.split`-`))
. Кроме того, новые строки - это буквальные новые строки внутри строк шаблона.Без игры в гольф и переставил
Идея состояла в том, чтобы пройти каждую часть всей строки и построить каждую строку по одной части за раз. После завершения строки увеличивается расстояние между словами слева направо, пока не будут помещены все лишние пробелы.
Тестовый фрагмент
источник
GNU sed
-r
, 621 байтПринимает ввод в виде двух строк: ширину в качестве первого унарного числа и вторую строку.
Я уверен, что это может быть гораздо лучше, но я уже потратил слишком много времени на это.
Попробуйте онлайн!
объяснение
Программа работает в два этапа: 1. Разделить и 2. Обоснуйте. Для ниже предположим, что наш вход:
Настроить
Сначала мы читаем ввод, перемещая первую строку (ширину как унарное число) в область удержания (
x
), затем добавляя следующую строку (N
), а затем копируем ширину из области удержания (G
) в пространство образца. Так какN
оставил нам ведущий,\n
мы заменим его!@
, который мы будем использовать в качестве курсоров в Фазе 1.Теперь содержимое пространства удержания равно
1111111111111
(и не изменится впредь), а пространство образца - (в формате команды sed «print однозначно»l
):Фаза 1
На этапе 1 основной
@
курсор перемещается по одному символу за раз, и для каждого символа a1
удаляется из «счетчика» в конце пространства шаблона. Другими словами,@foo\n111$
,f@oo\n11$
,fo@o\n1$
и т.д.В
!
курсор Трассы позади@
курсора, отмечая места , где мы могли бы сломаться , если счетчик достигает 0 в середине строки. Пара раундов будет выглядеть так:Здесь есть образец, который мы распознаем: пробел, за которым сразу следует
@
курсор. Поскольку счетчик больше 0, мы продвигаем маркер разрыва, затем продолжаем продвигать основной курсор:Вот еще один шаблон:
-@
у нас все еще 7 в счетчике, поэтому мы снова перемещаем курсор разрыва и продолжаем двигаться вперед:Вот другой шаблон: дефис, непосредственно предшествующий курсору разрыва, и другой, предшествующий основному курсору. Мы удаляем первый дефис, перемещаем курсор разрыва и, поскольку мы удалили символ, добавляем 1 к счетчику.
Мы продолжаем продвигать основной курсор:
Аналогично предыдущему, но на этот раз основной курсор предшествует пробелу, а не после дефиса. Мы удаляем дефис, но так как мы также перемещаем основной курсор, мы не увеличиваем и не уменьшаем счетчик.
Наконец наш счетчик достиг нуля. Поскольку символ после основного курсора является пробелом, мы вставляем новую строку и ставим оба курсора сразу после нее. Затем мы пополняем счетчик (
G
) и начинаем снова.Фаза 1 продолжается, продвигая курсоры и сопоставляя различные шаблоны, пока
@
курсор не достигнет конца строки.В конце фазы 1 наше пространство шаблонов выглядит так:
Или:
Фаза 2
На втором этапе мы используем
%
курсор и используем счетчик аналогичным образом, начиная примерно так:Сначала мы подсчитываем символы в первой строке, перемещая курсор и удаляя 1 из счетчика, после чего имеем;
Поскольку счетчик равен 0, мы больше ничего не делаем в этой строке. Вторая строка также имеет то же количество символов, что и счетчик, поэтому давайте перейдем к третьей строке:
Счетчик больше 0, поэтому мы перемещаем курсор назад к началу строки. Затем мы находим первый пробел и добавляем пробел, уменьшая счетчик.
Счетчик больше 0; так как курсор уже находится в последнем (единственном) ряду пробелов в строке, мы перемещаем его обратно в начало строки и делаем это снова:
Теперь счетчик равен 0, поэтому мы перемещаем курсор в начало следующей строки. Мы повторяем это для каждой строки, кроме последней. Это конец фазы 2 и конец программы! Окончательный результат:
источник
gsed (GNU sed) 4.4
я получаюgsed: -e expression #1, char 16: ":" lacks a label
. Можете ли вы добавить примечание о том, как именно вы вызываете его? (Я используюprintf "%s\n%s" "$1" "$2" | gsed -r '<code here>';
)-r
флаг, поэтому ссылка TiO выше ведет на страницу bash.!
(хотя, поскольку я пропустил!
из списка возможных специальных символов, я не будет держать это против этого).JavaScript (ES6), 147 байт
Принимает вход как
(width)(text)
.Попробуйте онлайн!
комментарии
источник
APL (Dyalog Unicode) ,
129 123 121 118 111 109 107 104 10095 байтов SBCSПопробуйте онлайн!
источник
Stax ,
5150 байтЗапустите и отладьте его
источник
Python 2 , 343 байта
Попробуйте онлайн!
источник
print'\n'.join(L[:-1])
вместоfor e in L[:-1]:print e