Рассмотрим следующий отсортированный по алфавиту список слов:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
Все слова начинаются с b
, а первые 5 начинаются с bal
. Если мы просто посмотрим на первые 2 слова:
balderdash
ballet
мы могли бы написать вместо этого:
balderdash
+let
где ' '
используется, когда слово разделяет префиксный символ с предыдущим словом; за исключением '+'
символа, который указывает последний символ, где второе слово имеет префикс с предыдущим словом.
Это своего рода визуализация "trie" : родительский объект имеет ' bal
' и имеет 2 потомка: 'derdash'
и 'let'
.
С более длинным списком, таким как:
balderdash
ballet
brooding
мы можем дополнительно использовать символ канала, '|'
чтобы прояснить, где заканчивается общий префикс, следующим образом:
balderdash
| +let
+rooding
и эквивалентное дерево будет иметь корень, 'b'
имеющий два дочерних элемента : поддерево, имеющее корень, 'al'
и его два дочерних элемента 'derdash'
и 'let'
; и 'rooding'
.
Если мы применим эту стратегию к нашему первоначальному списку,
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
мы получаем вывод, который выглядит так:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
Если два последовательных слова в списке не имеют общего префикса, никакие специальные символы не подставляются; например, для списка:
broom
brood
crude
crumb
мы хотим вывод:
broom
+d
crude
+mb
вход
Слова на входе будут состоять только из буквенно-цифровых символов (без пробелов и знаков препинания); это может быть в форме списка строк, отдельной строки или любого другого разумного подхода, если вы указываете выбранный вами формат. Два последовательных слова не будут одинаковыми. Список будет отсортирован по алфавиту.
Выход
Ваш вывод может содержать конечные пробелы в строке или в целом, но без начальных пробелов. Список строк или аналогичных также будет приемлемым.
Это код-гольф ; самый короткий код на каждом языке сохраняет права хвастовства. Обычные запреты против лазеек применяются.
Тестовые случаи
Input:
apogee
apology
app
apple
applique
apply
apt
Output:
apogee
|+logy
+p
|+le
| +ique
| +y
+t
Input:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
donald
donatella
donna
dont
dumb
Output:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
donald
| |+tella
| +na
| +t
+umb
ball
послеballoon
. Какой выход мы должны ожидать?+
первыйo
, но я не написал вызов, поэтому я не уверен.Ответы:
Сетчатка 0.8.2 ,
5857 байтПопробуйте онлайн! Ссылка включает в себя один контрольный пример. Редактировать: 1 байт сохранен благодаря @FryAmTheEggman, который указал, что я пропустил переход с
\b
на,^
сделанный возможным благодаряm)
. Объяснение:Включите каждую линию
^
для всей программы.Для каждого слова постарайтесь найти максимально возможное совпадение с начала предыдущего слова. Измените соответствие на пробелы, кроме последнего символа, который становится
+
.Повторно заменяйте все пробелы непосредственно над
+
s или|
s на|
s.источник
m)
чтобы можно было это сделать, поэтому мне досадно, что я пропустил экземпляр.JavaScript (ES6), 128 байт
Ожидает и возвращает список списков персонажей.
Попробуйте онлайн!
Как?
Пробелы и
+
's могут быть вставлены, пройдя от первого до последнего слова по порядку, но|
' s могут быть вставлены апостериори только+
после идентификации a . Этого можно достичь, выполнив два разных прохода, но вместо этого мы сохраняем указатель на каждую измененную запись,a[~y]
чтобы впоследствии ее можно было снова обновить в том жеmap()
цикле.Теоретически, более простой обходной путь состоит в том, чтобы пройтись по словам в обратном порядке и полностью изменить вывод в конце процесса. Но это немного дорого в JS, и я не нашел способа получить более короткую версию с этим методом.
источник
JavaScript (Node.js) ,
125122118117 байтПопробуйте онлайн!
источник
Python,
263260 байт- 3 байта благодаря Джонатану Фреху
Код:
Попробуйте онлайн!
Объяснение:
Это решение создает три из входных слов и рекурсивно анализирует их в требуемый выходной. Функция a принимает три t и строку s и добавляет x к t. Попытки реализованы в виде вложенных словарей. Каждый словарь представляет узел в дереве. Например, словарь, представляющий три, сгенерированный первым тестовым примером, выглядит следующим образом:
Функция p проходит через эту структуру и генерирует строковое представление дерева, ожидаемого вызовом. Функция f принимает несколько строк в качестве аргументов, добавляет их все в три с помощью a, а затем возвращает результат вызова p для этого три.
источник
C (gcc) ,
165155 байтовПринимает три аргумента:
char** a
: массив слов с нулем в концеchar* m
: массив длины каждого словаint n
: количество слов в массивеПопробуйте онлайн!
источник
++i<n&j<m[i]&a[i--]
неопределенное поведение? Могу ли я рассчитывать на gcc, оценивая его слева направо?Perl 6 ,
149, 144,142 байтаПопробуйте онлайн!
Я уверен, что это может быть в гольфе больше, тем более, что я не эксперт по регулярным выражениям. Это использует тот же процесс, что и ответ Нейла на сетчатку .
источник
Python 2 , 191 байт
Попробуйте онлайн!
источник
Рубин , 118 байт
Попробуйте онлайн!
Принимает массив строк, выводит путем изменения исходного входного массива на месте.
объяснение
Базовое преобразование строк не слишком сложно, но для правильной вставки вертикальных каналов нам нужно выполнить итерацию в обратном порядке, и, поскольку
reverse
метод довольно многословен, мы сделаем это более хитрым способом. Здесь мы используемmap
только для запуска цикла, оставляем первое слово в покое, а затем выполняем итерацию с конца, используя отрицательные индексы:источник