Введение
Давайте посмотрим на строку abc
. Подстроки, которые могут быть сделаны из этого:
a, ab, abc, b, bc, c
Теперь нам нужно выровнять их по исходной строке, например так:
abc
a
b
c
ab
bc
abc
Порядок строки не имеет значения, поэтому это также совершенно верно:
abc
a
ab
abc
b
bc
c
Таким образом, подстрока расположена под местоположением подстроки в исходной строке. Так что для abcdef
подстроки cde
это будет выглядеть так:
abcdef
cde
Задание
Задача состоит в том, чтобы выровнять все подстроки длиной больше 0 , как показано выше. Вы можете предположить, что сама строка будет содержать только буквенные символы и иметь по крайней мере 1 символ. Для заполнения вы можете использовать пробел или другой не алфавитный печатный символ ASCII ( 32 - 127
). Возможно, нет необходимости упоминать, но сама строка будет содержать только уникальные символы, так что это не так aba
, поскольку a
происходит дважды.
Контрольные примеры
Входные данные: abcde
Возможный вывод:
a
ab
abc
abcd
abcde
b
bc
bcd
bcde
c
cd
cde
d
de
e
Входные данные: abcdefghij
Возможный вывод:
a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi
abcdefghij
b
bc
bcd
bcde
bcdef
bcdefg
bcdefgh
bcdefghi
bcdefghij
c
cd
cde
cdef
cdefg
cdefgh
cdefghi
cdefghij
d
de
def
defg
defgh
defghi
defghij
e
ef
efg
efgh
efghi
efghij
f
fg
fgh
fghi
fghij
g
gh
ghi
ghij
h
hi
hij
i
ij
j
Это код-гольф , поэтому выигрывает представление с наименьшим количеством байтов!
Ответы:
Pyth,
141310 байтСпасибо @FryAmTheEggman за сохранение 3 байтов.
Попробуйте онлайн!
источник
jmXQ-Qd;.:
Похожая идея, используяX
.Perl,
322824 байтаВключает +1 для
-n
Код:
Запустите со строкой на STDIN:
Языки игры в гольф так близки и все же так далеки ...
объяснение
/.+/
соответствует подстроке. К сожалению, он останавливается, как только он совпадает. Поэтому я использую конструкцию регулярного выражения во время выполнения,(??{})
чтобы расширить регулярное выражение, чтобы оно не сработало, и обратный путь будет пробовать следующую подстроку, в конце пробуя их все, прежде чем с отвращением сдатьсяВнутри
(??{})
я печатаю текущую подстроку с префиксом столько пробелов, сколько смещение подстроки, используя$"x"@-"
Таким образом, вывод аккуратно документирует, как работает обратное отслеживание регулярных выражений:
источник
perl6 -ne 'm/^(.*)(.+)<{+put " "x$0.to,$1}>/'
ab1
(я полагаю, потому чтоsay...
оценивает1
). (Проверено в 5.18.2.) Редактировать: О! извините, вопрос говорит: «Вы можете предположить, что сама строка будет содержать только буквенные символы».MATL ,
2018 байтВдохновленный шаблоном подстрок, генерируемых ответом @ aditsu
Попробуйте онлайн!
Шаблон подстрок генерируется верхней треугольной матрицей того же размера, что и входные данные, а все подматрицы получают путем последовательного удаления последней строки и столбца.
объяснение
Старый подход (декартова сила)
Я придерживаюсь этого подхода на случай, если он послужит вдохновением для других ответов
В онлайн-компиляторе это исчерпывает память для самого длинного теста.
Попробуйте онлайн!
объяснение
Это порождает все шаблоны значений
0
,1
и2
в порядке возрастания, а затем превращается2
в0
. Это дает все возможные образцы0
и1
где1
значения являются смежными. Они используются, чтобы отметить, какие символы взяты из исходной строки.Например, для строки
'abc'
шаблоны генерируются следующим образом. Сначала[0 1 2]
получается декартова степень, возведенная в число вводимых символов:Сортировка каждого ряда дает
Преобразование
2
в0
(т.е.mod(...,2)
) и удаление повторяющихся строк дает окончательный образецв которой каждая строка является маской, соответствующей (смежной) подстроке. Первую строку необходимо удалить, поскольку она соответствует пустой подстроке.
источник
Сетчатка ,
483231 байтСпасибо Кенни Лау за то, что он сэкономил 3 байта и проложил путь для многих других.
Число байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
Порядок сгенерированных подстрок:
объяснение
Это дает нам все префиксы ввода. Это делается путем match (
M
) любой substring (.+
), начиная с end (r
), учитывая перекрывающиеся match (&
) и возвращая все эти совпадения, объединенные с linefeeds (!
).Теперь все, что нам нужно сделать, это выделить последовательные префиксы этих префиксов (заменив их пробелами). Мы делаем это шаг за шагом с помощью цикла:
Это
%
означает, что все это делается для каждой строки индивидуально (рассматривая ее как отдельную строку на данный момент, и объединяя ее все вместе с переводами строки в конце).+
Говорит Retina запустить эту замену в цикле , пока на выходе не перестает изменяться (что в данном случае означает , что регулярное выражение не больше совпадений). Затем регулярное выражение пытается сопоставить последнюю строку ввода по крайней мере с двумя непробельными символами и добавляет новую строку, где первый из них заменяется пробелом.источник
!
подразумеваетM
и 1char версии.+
и.*
?.+
и.*
я должен был бы токенизировать регулярное выражение, и хотя я планирую сделать это в какой-то момент, я не думаю, что это произойдет в ближайшее время (и если я это сделаю, я, вероятно, сосредоточусь на функциях, которые на самом деле добавить выразительности).Oracle SQL 11.2, 146 байт
Un-golfed
источник
CJam, 20
Попробуйте онлайн
Объяснение:
источник
Python, 57 байт
Выводит
set
как{' b', 'a', 'ab'}
. Идея состоит в том, чтобы отбросить две ветви, отсекающие первый или последний символ. Дает избыточные выходы, ноset
автоматически удаляет дубликаты. Для выравнивания, каждый раз, когда первый символ обрезается, к префиксу добавляется пробелp
, который соединяется вперед.источник
PowerShell v2 +, 69 байт
Принимает ввод
$a
, зацикливается на длину (настройка$b
в процессе для использования позже). Каждый внешний цикл мы повторяем до следующего$b
, настраивая$i
для использования позже. В каждом внутреннем цикле мы выводим$i
количество пробелов, соединенных с фрагментом входной строки. Поскольку мы просто перебираем строку, она фактически обрабатывает любую произвольную строку (повторяющиеся буквы, пробелы и т. Д.).пример
источник
C #
136132131 байтGolfed
Ungolfed
Полный код
релизы
-1 byte
- ИзмененString o="",e="";
для ,String o="",e=o;
чтобы сохранить 1 байт. Идея была от Галанта ( я забыл применить эту часть в последнем обновлении, извиняюсь. ).-4 bytes
- Удалил скобки изfor
циклов и переместил приращение пространстваe
var в зону итератора внешнего цикла. Идея была от галанта .for
136 bytes
- Исходное решение.источник
e=o
для сохранения 3 байта.String o="",...
сvar o...
другим на 3.String o = "", e = "";
в,var
поскольку мне пришлось бы разделить их на две части, в результатеvar o = ""; var e = "";
чего длина была бы такой же, как и у меня. Сделал бы это, но VS не допускает объявление нескольких переменных при использовании неявно типизированных переменных - иначеvar
. Но спасибо за помощь. РЕДАКТИРОВАТЬ: VS кричал мне, что я не могу это сделать, я предполагаю, что это неправильно, может быть неправильно.Python 2.7,
7082 байтаЯ не мог понять, как получить это на 1 линии. Позвонить с
e("abcde",0)
источник
Python 3,
8078 байтПереберите количество пробелов для префикса, а затем количество символов в конце.
Редактировать: Удалены пробелы перед циклами for.
источник
MATL,
1514 байтовСохраненный один байт из - за @ LuisMendo в наконечнике здесь !
Так много способов ... пришлось найти новый. Счастливые биты! :)
Попробуйте онлайн!
взорванный
источник
JavaScript (ES6), 89 байт
Прямой подход. Выход имеет завершающий перевод строки.
источник
=>
значит в Javascript? Это бинарный операторJavaScript (ES6), 72
источник
Pyth,
1211 байтовК сожалению, вопрос позволяет нам принимать уникальные символы, поэтому я просто ищу первую позицию подстроки и дополняю ее пробелами.
источник
;
вместо того,\
когда внутри карты самого низкого уровня.Mathematica 89 байт
объяснение
i
относится к входной строкеSubsequences[y=Characters@i]
возвращает все подпоследовательности (представленные списки символов) ввода. (Subsequences
было введено в ст. 10.4)Для каждой подпоследовательности
Complement...
возвращает те символы из входной строки, которые отсутствуют . Каждый из этих символов заменяется пустым пробелом черезStringReplace[i,#->" "]
.Column
отображает результаты в одном столбце. Каждая выходная строка имеет одинаковое количество символов, что приводит к выравниванию букв.источник
J,
32 2928 байтЭто дает монадический глагол. Попробуй это здесь. Использование:
объяснение
Как и некоторые другие ответы, я вычисляю индекс появления первого символа каждой подстроки. Подстроки хранятся в матрице с конечными пробелами, поэтому я поворачиваю их вправо по их индексу, чтобы получить нужное количество отступов. Этот кусок пробела между
"1
иa:
действительно раздражает ...источник
a e
не является подстрокой в соответствии с заданиемJavaScript (Firefox 30-57),
6563 байтаВозвращает массив строк. Как ES6 это 78 байтов:
источник
QBasic, 75 байтов
Базовая
FOR
стратегия с двойным циклом, немного измененная для индексации на основе 1 в QBasic. Основной трюк заключается в томLOCATE,j
, чтобыj
перед печатью переместить курсор на столбец текущей строки. Поскольку столбец 1 является первым столбцом, это эквивалентно печатиj-1
начальных пробелов.источник
Perl 6 , 34 байта
Причина
+
этого вput
том, что он возвращает1
вместоTrue
, что гарантированно не будет во входных данных, поэтому он всегда должен возвращаться назад.(Если вы хотите в обратном порядке, используйте
(.*?)(.+?)
вместо(.*)(.+)
)Это было вдохновлено ответом Perl 5 .
источник
J,
352322 байтаЭто заняло у меня некоторое время, но я наконец оптимизировал его.
использование
объяснение
источник
[:+./"1' '~:]
вместо[:-.[:*/"1' '=]
сохранения еще 2 байта.Java, 138 байт
отформатирован:
источник
Пайк, 15 байт
Попробуй это здесь!
Предполагается, что массив мягких строк является приемлемым
Сначала прокладки, а затем отбивные.
источник
Haskell, 65 байт
Требуется
inits
иtails
из Data.List, правда. Чтобы вывести его, добавьтеmapM_ putStrLn.
на фронт.Относительно просто;
reverse
чтобы убедиться , что исходная строка является первой.источник
(>>=zipWith(++)(inits$cycle" ").init.tails).inits
, И, пожалуйста, добавьтеimport Data.List;
количество байтов.Рубин,
7567 байтАнонимная функция.
Использует регулярное выражение для выравнивания подстрок..
является символом наполнителя.источник
bash + GNU coreutils, 109 байт
Может быть, есть более короткое решение, но это лучшее, что пришло мне в голову. Уникальность персонажей здесь не имеет значения.
источник
PHP, 151 символ
Ungolfed
Golfed
пример
источник
C ++, 145 байт
первый параметр запуска используется как вход, консоль как выход
источник
std::cout<<r[0]<<y<<'\n'
вместо `std :: cout.write (r [0], y) << '\ n'? Можете ли вы добавить краткое объяснение? Благодарность!Python 2 (Ungolfed) 99 байт
Результат:
источник