Dada uma sequência ASCII, produza os sufixos explodidos dela. Por exemplo, se a sequência fosse abcde
, existem 5 sufixos, ordenados do maior para o menor:
abcde
bcde
cde
de
e
Cada sufixo é explodido , o que significa que cada caractere é copiado tantas vezes quanto a sua localização indexada nesse sufixo. Por exemplo, explodir os sufixos de abcde
,
abcde
12345
abbcccddddeeeee
bcde
1234
bccdddeeee
cde
123
cddeee
de
12
dee
e
1
e
Ao todo, os sufixos explodidos de abcde
são
abbcccddddeeeee
bccdddeeee
cddeee
dee
e
Regras
- Isso é código-golfe, então o código mais curto vence.
- A entrada consistirá nos caracteres ASCII imprimíveis. (Isso exclui novas linhas, mas inclui espaços.)
- A saída terá cada sequência em uma linha separada.
- Espaços à direita são permitidos em cada linha e pode haver uma nova linha extra no final.
Casos de teste
''
'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
Respostas:
Geléia , 5 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
J,
22128 bytesGraças a milhas por economizar 14 bytes!
Agora, esta é uma solução muito boa. Bem sucinto também.
Este é o gancho
#~#\
aplicado aos sufixos (\.
) da entrada. O gancho, quando chamado na entraday
, é decomposto da seguinte forma:Aqui estão alguns resultados intermediários:
Casos de teste
fonte
Python, 61 bytes
Alternativa 63:
fonte
Python 3,
916865 bytesTermina com um erro após imprimir a saída desejada. Teste em Ideone .
Como funciona
Antes que f possa se chamar recursivamente, os índices de
s[1:...]
precisam ser calculados.Primeiro
enumerate(s[0]+s)
produz todos os pares (i, c) dos caracteres c de s - com seu primeiro caractere duplicado - e os índices correspondentes i . Anexars[0]
serve a dois propósitos aqui.O primeiro caractere de s deve ser repetido uma vez, mas o primeiro índice é 0 .
Depois que todos os caracteres forem processados,
s[0]
um IndexError aumentará , fazendo com que f seja encerrado com um erro, em vez de imprimir novas linhas até que o limite de recursão seja atingido.''.join(i*c for i,c in ...)
cria uma sequência plana de cada c repetido i vezes, queprint
ecoa para STDOUT.Finalmente, como
print
retorna None es[1:None]
é simplesmentes[1:]
, a chamada recursivaf(s[1:...])
repete o processo acima para s sem seu primeiro caractere.fonte
Perl 6 , 38 bytes
37 bytes + 1 para
-n
opção de linha de comandoExemplo:
Expandido:
fonte
Braquilog , 17 bytes
Experimente online!
Explicação
fonte
05AB1E , 13 bytes
Experimente online!
Explicação
fonte
CJam , 14 bytes
Experimente online!
Explicação
fonte
C #, 101 bytes
Função anônima recursiva, que também imprime uma nova linha principal. Se a nova linha principal não for permitida, 3 bytes extras a transformarão em uma nova linha à direita:
Programa completo com método não destruído e casos de teste:
fonte
Haskell, 48 bytes
está em interface com qualquer um
fonte
putStr.
, aceitamos como saída de função. Você precisaimport Data.List
usartails
.uncurry ... zip
comzipWith
:unlines.map(concat.zipWith replicate[1..]).tails
.zipWith replicate
encurtamento também ocorreu quando acordei. Pena quetails
não está naPrelude
i poderia buscartails
a partirData.List
implicitamente sem um completoimport
e ainda sem superando ofoldr
equivalente. Em relação à pureza semIO
caldeira, eu também deixaria omapM_ putStrLn
tempero ao gosto dos leitores eunlines
também não funcionaria . Definir um blocoe=
custaria contagem de bytes.imports
o Haskell não é padrão, mas um recurso daghci
substituição. Dependendo dessas coisas, conta como um idioma separado, então sugiro alterar o título da sua resposta para algo assimHaskell (ghci)
. ( Veja também esta meta discussão ).Perl, 36 + 1 (
-n
) = 37 bytesPrecisa
-n
e-E
(ou-M5.010
) para executar:Observe que ele funciona em apenas uma instância cada vez que você a executa (porque usa a variável
$.
que é incrementada toda vez que uma linha é lida, portanto, ela mantém1
apenas a primeira vez que uma linha é lida). (Mas não há problema aqui, apenas^D
e execute-o novamente!)fonte
Retina , 31 bytes
A contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
fonte
Java,
150127 bytesEditar:
Snipet:
Ungolfed:
fonte
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);}
Raquete 184 bytes
Ungolfed:
Saída:
fonte
JavaScript (ES6), 65 bytes
Tentativas anteriores:
fonte
PHP, 103 bytes (99 com tags curtas)
Tenho certeza de que essa não é a resposta mais curta possível.
fonte
MATL , 12 bytes
Adoro quando as aspas se juntam!
Experimente online!
Explicação
Isso funciona através da construção de uma matriz cujas colunas são usadas, uma a uma, para decodificar em tempo real a entrada. Como exemplo, para entrada,
'abcde'
a matriz éCódigo:
fonte
Python 3, 95 bytes
Isso foi surpreendentemente mais difícil do que eu esperava. Eu refiz minha função inteira talvez 4 vezes.
fonte
Java 7.140 bytes
Ungolfed
A seguinte linha me dá muita dor. Eu não sei como posso jogar golfe (porque existem dois loops para quebrar a condição e colocar
"\n"
na declaração impressa).System.out.println();
fonte
Pyke, 12 bytes
Experimente aqui!
fonte
Ruby, 51 bytes
Usa o
-n
sinalizador para +1 byte.fonte
R, 108 bytes
Leia a entrada do stdin e imprima no stdout
Eu senti que o uso de
do.call
era apropriado aqui. Basicamente, são necessárias duas entradas: 1. um nome de função na forma de uma string (rep
aqui) e uma lista de argumentos e 2. iterativamente se aplica chama a função usando os argumentos da lista.Por exemplo:
rep("c",3)
produz o vetor"c" "c" "c"
do.call("rep",list(c("a","b","c"),1:3))
produz o vetor"a" "b" "b" "c" "c" "c"
rep("a",1)
,rep("b",2)
erep("c",3)
fonte
Vim, 43 bytes
qqYlpx@qq@qqr0<C-H><C-V>{$:s/\v%V(.)\1*/&\1/g<CR>@rq@r
A primeira macro separa os sufixos, a segunda macro os "explode". Provavelmente superável. Os espaços são irritantes.
fonte
C, 186 bytes
Provavelmente isso pode ser encurtado um pouco, mas eu só queria tentar. É a minha segunda tentativa no golfe, então me dê todas as dicas (* lol) que puder. Ele pega uma string como parâmetro e explode a partir daí. u é usado como um buffer que armazena a string explodida.
Ungolfed:
fonte
Acc !! , 150 bytes
Espera a entrada no stdin, finalizada com um caractere de tabulação.
Explicação
Esta é realmente uma tarefa muito boa para Acc !! , pois exige apenas a leitura de uma sequência e a iteração sobre ela com alguns loops aninhados. Lemos a string no acumulador, tratando-a como uma sequência de dígitos de base 128, com o primeiro caractere no fim de ordem baixa. Após o
Count c
loop de abertura , o valor do acumulador pode ser conceituado assim (usandoxyz
como entrada de exemplo):(O valor real do acumulador para este exemplo é
9*128^3 + 122*128^2 + 121*128 + 120
=20888824
.)Podemos iterar sobre a string, repetindo os poderes crescentes de 128. E podemos iterar sobre os sufixos, dividindo o acumulador por 128 após cada iteração, cortando um caractere.
Com recuo e comentários:
fonte