Если дана строка ASCII, выведите ее разнесенные суффиксы. Например, если строка была abcde
, есть 5 суффиксов, упорядоченных от самого длинного до самого короткого:
abcde
bcde
cde
de
e
Каждый суффикс затем разбирается , что означает, что каждый символ копируется столько раз, сколько его одноиндексное местоположение в этом суффиксе. Например, взрывая суффиксы abcde
,
abcde
12345
abbcccddddeeeee
bcde
1234
bccdddeeee
cde
123
cddeee
de
12
dee
e
1
e
В целом, в разобранном суффиксы abcde
являются
abbcccddddeeeee
bccdddeeee
cddeee
dee
e
правила
- Это код-гольф, поэтому выигрывает самый короткий код.
- Ввод будет состоять из печатных символов ASCII. (Это исключает переводы строки, но включает пробелы.)
- Выход будет иметь каждую строку в отдельной строке.
- Конечные пробелы разрешены в каждой строке, и в конце может быть дополнительный символ новой строки.
Тестовые случаи
''
'a'
a
'bc'
bcc
c
'xyz'
xyyzzz
yzz
z
'code-golf'
coodddeeee-----ggggggooooooollllllllfffffffff
oddeee----gggggoooooolllllllffffffff
dee---ggggooooollllllfffffff
e--gggoooolllllffffff
-ggooollllfffff
goolllffff
ollfff
lff
f
's p a c e'
s ppp aaaaa ccccccc eeeeeeeee
pp aaaa cccccc eeeeeeee
p aaa ccccc eeeeeee
aa cccc eeeeee
a ccc eeeee
cc eeee
c eee
ee
e
Ответы:
Желе , 5 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
J,
22128 байтСпасибо миль за сохранение 14 байтов!
Теперь это действительно хорошее решение. Довольно лаконично, тоже.
Этот хук
#~#\
применяется к суффиксам (\.
) ввода. Хук, когдаy
вызывается на входе , раскладывается следующим образом:Вот некоторые промежуточные результаты:
Контрольные примеры
источник
Python, 61 байт
Альтернатива 63:
источник
Python 3,
916865 байтЗавершается с ошибкой после печати желаемого результата. Проверьте это на Ideone .
Как это устроено
Прежде чем f сможет вызвать себя рекурсивно,
s[1:...]
необходимо вычислить индексы .Сначала
enumerate(s[0]+s)
выдает все пары (i, c) символов c of s - с дублированным первым символом - и соответствующие индексы i . Preedings[0]
служит двум целям здесь.Первый символ s должен быть повторен один раз, но первый индекс равен 0 .
Как только все символы будут обработаны,
s[0]
будет возникать ошибка IndexError , в результате чего f завершается с ошибкой, а не выводит символы новой строки, пока не будет достигнут предел рекурсии.''.join(i*c for i,c in ...)
строит плоскую строку каждого c, повторенного i раз, чтоprint
отражается на STDOUT.Наконец, так как
print
возвращает None иs[1:None]
простоs[1:]
, рекурсивный вызовf(s[1:...])
повторяет описанный выше процесс для s без его первого символа.источник
Perl 6 , 38 байт
37 байт + 1 для
-n
переключателя командной строкиПример:
Expanded:
источник
Брахилог , 17 байт
Попробуйте онлайн!
объяснение
источник
05AB1E , 13 байтов
Попробуйте онлайн!
объяснение
источник
CJam , 14 байтов
Попробуйте онлайн!
объяснение
источник
C #, 101 байт
Рекурсивная анонимная функция, которая также печатает ведущий символ новой строки. Если начальный символ новой строки не разрешен, 3 дополнительных байта превращают его в завершающий символ новой строки:
Полная программа с методикой ungolfed и тестовыми примерами:
источник
Haskell, 48 байтов
связан с любым из
источник
putStr.
, мы принимаем в качестве функции вывода. Вы должныimport Data.List
хотя бы использоватьtails
.uncurry ... zip
сzipWith
:unlines.map(concat.zipWith replicate[1..]).tails
.zipWith replicate
Укоротить также произошло со мной , когда я проснулся. Жаль, чтоtails
нет,Prelude
я мог бы получитьtails
отData.List
неявно без полногоimport
и все еще не перерастаяfoldr
эквивалент. Что касается чистоты безIO
котельной, я бы также оставилmapM_ putStrLn
приправу на усмотрение читателей и ничего неunlines
сделал. Определение блокаe=
будет стоить количество байтов.imports
- это не стандартный Haskell, а особенностьghci
реплики. В зависимости от таких вещей считается отдельным языком, поэтому я предлагаю изменить название вашего ответа на что-то вродеHaskell (ghci)
. ( Смотрите также эту мета-дискуссию ).Perl, 36 + 1 (
-n
) = 37 байтНеобходимо
-n
и-E
(или-M5.010
) запустить:Обратите внимание, что он работает только с одним экземпляром каждый раз, когда вы его запускаете (поскольку он использует переменную,
$.
которая увеличивается каждый раз при чтении строки, поэтому он удерживает1
только первый раз, когда строка читается). (Но нет проблем здесь, просто^D
и запустите его снова!)источник
Сетчатка , 31 байт
Число байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
источник
Джава,
150127 байтРедактировать:
Snipet:
Ungolfed:
источник
f->{String s[]=f.split(""),o="";int i=-1,j,l=s.length;for(;++i<l;)for(j=-2;++j<i;o+=s[i]);return l<1?o:o+"\n"+f.substring(1);}
Ракетка 184 байта
Ungolfed:
Выход:
источник
JavaScript (ES6), 65 байт
Предыдущие попытки:
источник
PHP, 103 байта (99 с короткими тегами)
Я уверен, что это не самый короткий ответ.
источник
MATL , 12 байт
Мне нравится, когда кавычки собираются вместе!
Попробуйте онлайн!
объяснение
Это работает путем построения матрицы, столбцы которой используются один за другим для декодирования входной длины. Например, для ввода
'abcde'
матрицаКод:
источник
Python 3, 95 байт
Это было на удивление сложнее, чем я ожидал. Я переделал всю свою функцию, может быть, 4 раза.
источник
Java 7,140 байт
Ungolfed
Следующая строка причиняет мне большую боль. Я не знаю, как я могу сыграть в гольф (потому что есть две петли, чтобы нарушить условие, чтобы вставить
"\n"
в печать заявление).System.out.println();
источник
Пайк, 12 байт
Попробуй это здесь!
источник
Рубин, 51 байт
Использует
-n
флаг для +1 байта.источник
R, 108 байт
Чтение ввода из стандартного ввода и печать на стандартный вывод
Я чувствовал, что использование
do.call
здесь было уместно. В основном требуется два входа: 1. имя функции в форме строки (rep
здесь) и список аргументов и 2. итеративно применяет вызовы функции, используя аргументы в списке.Например:
rep("c",3)
производит вектор"c" "c" "c"
do.call("rep",list(c("a","b","c"),1:3))
производит вектор"a" "b" "b" "c" "c" "c"
rep("a",1)
,rep("b",2)
иrep("c",3)
источник
Vim, 43 байта
qqYlpx@qq@qqr0<C-H><C-V>{$:s/\v%V(.)\1*/&\1/g<CR>@rq@r
Первый макрос разделяет суффиксы, второй макрос «взрывает» их. Вероятно, победим. Пространства раздражают.
источник
C 186 байт
Это, вероятно, можно немного сократить, но я просто хотел попробовать. Это моя вторая попытка в гольфе, так что дай мне подсказки (* lol), которые ты можешь. Он принимает строку в качестве параметра и оттуда взрывается. u используется в качестве буфера для хранения разнесенной строки.
Ungolfed:
источник
Точность !! 150 байт
Ожидается ввод в stdin, оканчивающийся символом табуляции.
объяснение
Это на самом деле довольно хорошая задача для Acc! , поскольку требуется только чтение строки и итерация по ней с некоторыми вложенными циклами. Мы читаем строку в аккумулятор, рассматривая ее как последовательность цифр из 128 оснований, с первым символом в конце младшего разряда. После
Count c
разомкнутого цикла значение аккумулятора можно представить следующим образом (используя вxyz
качестве примера ввод):(Фактическое значение аккумулятора для этого примера
9*128^3 + 122*128^2 + 121*128 + 120
=20888824
.)Затем мы можем перебрать строку, перебирая возрастающую степень 128. И мы можем перебрать суффиксы, разделив аккумулятор на 128 после каждой итерации, отсекая символ.
С отступом и комментариями:
источник