Introdução
Vamos observar a corda abc
. As substrings que podem ser feitas com isso são:
a, ab, abc, b, bc, c
Agora precisamos alinhá-los sob a string inicial, assim:
abc
a
b
c
ab
bc
abc
A ordem da string não importa, então isso também é perfeitamente válido:
abc
a
ab
abc
b
bc
c
Portanto, a substring é posicionada sob o local da substring na string inicial. Portanto, para abcdef
e a substring cde
, ficaria assim:
abcdef
cde
A tarefa
A tarefa é alinhar todas as substrings com um comprimento maior que 0 , como mostrado acima. Você pode supor que a própria string conterá apenas caracteres alfabéticos e tenha pelo menos 1 caractere. Para o preenchimento, você pode usar um espaço ou outro caractere ASCII imprimível não alfabético ( 32 - 127
). Talvez não seja necessário mencionar, mas a própria string conterá apenas caracteres únicos, portanto não é o caso aba
, pois a
ocorre duas vezes.
Casos de teste
Entrada: abcde
Saída possível:
a
ab
abc
abcd
abcde
b
bc
bcd
bcde
c
cd
cde
d
de
e
Entrada: abcdefghij
Saída possível:
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
Isso é código-golfe , então a submissão com a menor quantidade de bytes ganha!
Respostas:
Pitão,
141310 bytesObrigado a @FryAmTheEggman por salvar 3 bytes.
Experimente online!
fonte
jmXQ-Qd;.:
Idéia semelhante, usandoX
.Perl,
322824 bytesInclui +1 para
-n
Código:
Execute com a string em STDIN:
As línguas do golfe são tão próximas e tão distantes ...
Explicação
/.+/
corresponde a uma substring. Infelizmente, ele pára quando corresponde a um. Então, eu uso a construção regex de tempo de execução(??{})
para estender a regex, para que ela falhe e o backtracking tente a seguinte substring, no final, tentando todas elas antes de desistir com nojo.Dentro do
(??{})
eu imprimo a substring atual prefixada por tantos espaços quanto o deslocamento da substring usando$"x"@-"
Portanto, a saída documenta perfeitamente como o regex backtracking funciona:
fonte
perl6 -ne 'm/^(.*)(.+)<{+put " "x$0.to,$1}>/'
ab1
(presumo que sejasay...
avaliado como1
). (Testado em 5.18.2.) Editar: Oh! desculpe, a pergunta diz "Você pode assumir que a própria string conterá apenas caracteres alfabéticos".MATL ,
2018 bytesInspirado no padrão de substrings gerados pela resposta do @ aditsu
Experimente online!
O padrão de substrings é gerado por uma matriz triangular superior do mesmo tamanho da entrada e todas as submatrizes obtidas removendo sucessivamente a última linha e coluna.
Explicação
Abordagem antiga (poder cartesiano)
Estou mantendo essa abordagem caso ela sirva de inspiração para outras respostas
No compilador online, isso fica sem memória para o caso de teste mais longo.
Experimente online!
Explicação
Isso gera todos os padrões de valores
0
,1
e2
em ordem crescente, e depois se transforma2
em0
. Isso fornece todos os padrões possíveis de0
e1
onde os1
valores são contíguos. Eles são usados para marcar quais caracteres são retirados da string original.Como um exemplo, para string,
'abc'
os padrões são gerados da seguinte maneira. Primeiro,[0 1 2]
é obtido o poder cartesiano de elevado ao número de caracteres de entrada:A classificação de cada linha fornece
Transformar
2
em0
(iemod(...,2)
) e remover linhas duplicadas fornece o padrão finalem que cada linha é uma máscara correspondente a uma substring (contígua). A primeira linha precisa ser removida porque corresponde à substring vazia.
fonte
Retina ,
483231 bytesAgradecemos a Kenny Lau por salvar 3 bytes e abrir caminho para muitos mais.
A contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
Ordem das substrings geradas:
Explicação
Isso nos dá todos os prefixos da entrada. Isso é feito combinando (
M
) qualquer substring (.+
) a partir do final (r
), considerando correspondências sobrepostas (&
) e retornando todas essas correspondências associadas a feeds de linha (!
).Agora tudo o que precisamos fazer é esculpir os prefixos sucessivos desses prefixos (substituindo-os por espaços). Fazemos isso passo a passo com um loop:
Os
%
meios que esta coisa inteira é feito para cada linha individualmente (considerando uma string separada para ser tempo, e juntando tudo de volta, juntamente com linefeeds no final). O+
instrui o Retina a executar essa substituição em um loop até que a saída pare de mudar (o que nesse caso significa que o regex não corresponde mais). O regex, em seguida, tenta corresponder a última linha da entrada com pelo menos dois caracteres não espaciais e anexa uma nova linha onde o primeiro deles é substituído por um espaço.fonte
!
implícitasM
e 1char versões de.+
e.*
?.+
e.*
que eu teria que tokenise a regex, e enquanto eu estou planejando fazer isso em algum momento, eu não acho que isso vai acontecer tão cedo (e se eu faço, eu provavelmente vai se concentrar em características que adicione expressividade).Oracle SQL 11.2, 146 bytes
Sem golfe
fonte
CJam, 20
Experimente online
Explicação:
fonte
Python, 57 bytes
Produz um
set
gosto{' b', 'a', 'ab'}
. A idéia é recuar duas ramificações que cortam o primeiro ou o último caractere. O resultado é redundante, mas oset
remove automaticamente duplicatas. Para alinhamento, toda vez que o primeiro caractere é cortado, um espaço é adicionado ao prefixop
, que é concatenado na frente.fonte
PowerShell v2 +, 69 bytes
Recebe entrada
$a
, faz um loop ao longo do comprimento (configuração$b
no processo para uso posterior). A cada loop externo, repetimos o loop$b
novamente, configurando$i
para uso posterior. Cada loop interno, produzimos um$i
número de espaços concatenados com uma fatia da string de entrada. Como estamos apenas percorrendo a string, isso realmente manipulará qualquer string arbitrária (letras duplicadas, espaços, o que for).Exemplo
fonte
C #,
136132131 bytesGolfe
Ungolfed
Código completo
Lançamentos
-1 byte
- Mudou oString o="",e="";
paraString o="",e=o;
salvar 1 byte. A ideia era de Gallant ( esqueci de aplicar esta parte na última atualização, peço desculpas. ).-4 bytes
- Soltou os colchetes dosfor
loops e moveu o incremento de espaçoe
var para a zona do iterador do loop externo . A ideia era de Gallant .for
136 bytes
- Solução inicial.fonte
e=o
para salvar 3 bytes.String o="",...
comvar o...
um outro 3.String o = "", e = "";
para,var
já que eu teria que separá-los em dois, resultando novar o = ""; var e = "";
mesmo comprimento em comparação com o que eu tenho. O faria, mas o VS não permite várias declarações de variáveis ao usar variáveis de tipo implícito - também conhecidas comovar
's. Mas obrigado pela ajuda. Edição: Tendo VS gritando-me que eu não posso fazê-lo, estou assumindo que está incorreto, pode estar errado.Python 2.7,
7082 bytesEu não conseguia descobrir como obtê-lo em 1 linha. Ligue com
e("abcde",0)
fonte
Python 3,
80bytesFaça um loop pelo número de espaços para prefixar e, em seguida, pelo número de caracteres para terminar.
Editar: espaços removidos antes dos loops for.
fonte
MATL,
1514 bytesGuardou um byte devido à dica de @ LuisMendo aqui !
Tantas maneiras ... tinha que encontrar uma nova. Pedaços felizes! :)
Experimente online!
Explodido
fonte
JavaScript (ES6), 89 bytes
Abordagem direta. A saída tem uma nova linha à direita.
fonte
=>
significa Javascript? É um operador binárioJavaScript (ES6), 72
fonte
Pitão,
1211 bytesInfelizmente, a pergunta nos permite assumir caracteres únicos, então apenas procuro a primeira posição da substring e preencho com espaços.
fonte
;
vez de\
quando estiver dentro do mapa de nível mais baixo.Mathematica 89 bytes
Explicação
i
refere-se à sequência de entradaSubsequences[y=Characters@i]
retorna todas as subsequências (listas representadas de caracteres) da entrada. (Subsequences
foi introduzido no v. 10.4)Para cada subsequência,
Complement...
retorna os caracteres da sequência de entrada que não estão presentes. Cada um desses caracteres é substituído por um espaço vazio viaStringReplace[i,#->" "]
.Column
exibe os resultados em uma única coluna. Cada sequência de saída possui o mesmo número de caracteres, resultando em letras alinhadas.fonte
J,
32 2928 bytesIsso avalia um verbo monádico. Experimente aqui. Uso:
Explicação
Como algumas outras respostas, calculo o índice de ocorrência do primeiro caractere de cada substring. As substrings são armazenadas em uma matriz com espaços à direita, então eu as giro para a direita pelo seu índice para obter a quantidade certa de preenchimento. Esse pedaço de espaço em branco entre
"1
ea:
é realmente irritante ...fonte
a e
não é uma subcadeia de caracteres conforme definido pelo desafioJavaScript (Firefox 30-57),
6563 bytesRetorna uma matriz de seqüências de caracteres. Como ES6, são 78 bytes:
fonte
QBasic, 75 bytes
A
FOR
estratégia básica de duplo loop, modificou um pouco a indexação baseada em 1 do QBasic. O principal truque éLOCATE,j
, que move o cursor para a colunaj
da linha atual antes da impressão. Como a coluna 1 é a primeira coluna, isso equivale a imprimirj-1
espaços à esquerda.fonte
Perl 6 , 34 bytes
A razão para o
+
anteriorput
é que ele retorna em1
vez deTrue
, o que é garantido para não estar na entrada, portanto, ele sempre deve retornar.(Se você quiser na ordem oposta, use em
(.*?)(.+?)
vez de(.*)(.+)
)Isso foi inspirado na resposta do Perl 5 .
fonte
J,
352322 bytesDemorei um pouco, mas finalmente o otimizei.
Uso
Explicação
fonte
[:+./"1' '~:]
vez de[:-.[:*/"1' '=]
salva outros 2 bytes.Java, 138 bytes
Formatado:
fonte
Pyke, 15 bytes
Experimente aqui!
Assume que a matriz de cordas acolchoadas é aceitável
Almofadas primeiro e depois costeletas.
fonte
Haskell, 65 bytes
Isso requer
inits
etails
do Data.List, no entanto. Para produzi-lo, adicionemapM_ putStrLn.
à frente.Relativamente simples; o
reverse
é para garantir que a sequência original seja a primeira.fonte
(>>=zipWith(++)(inits$cycle" ").init.tails).inits
. E adicione oimport Data.List;
à contagem de bytes.Ruby,
7567 bytesFunção anônima.
Usa substituição de regex para alinhar as substrings..
é o caractere de preenchimento.fonte
bash + núcleo GNU, 109 bytes
Talvez exista uma solução mais curta, mas é a melhor que me ocorreu. A exclusividade dos caracteres não importa aqui.
fonte
PHP, 151 caracteres
Ungolfed
Golfe
Exemplo
fonte
C ++, 145 bytes
o primeiro parâmetro inicial é usado como entrada, console como saída
fonte
std::cout<<r[0]<<y<<'\n'
vez de `std :: cout.write (r [0], y) << '\ n'? Você pode adicionar uma breve explicação? Obrigado!Python 2 (não jogado) 99 bytes
Resultado:
fonte