Introducción
Observemos la cuerda abc
. Las subcadenas que se pueden hacer de esto son:
a, ab, abc, b, bc, c
Ahora necesitamos alinearlos debajo de la cadena inicial, así:
abc
a
b
c
ab
bc
abc
El orden de la cadena no importa, por lo que esto también es perfectamente válido:
abc
a
ab
abc
b
bc
c
Entonces, la subcadena se coloca debajo de la ubicación de la subcadena en la cadena inicial. Entonces para abcdef
y la subcadena cde
, se vería así:
abcdef
cde
La tarea
La tarea es alinear todas las subcadenas con una longitud mayor que 0 , como se muestra arriba. Puede suponer que la cadena en sí solo contendrá caracteres alfabéticos y tendrá al menos 1 carácter. Para el relleno, puede usar un espacio o algún otro carácter ASCII imprimible no alfabético ( 32 - 127
). Tal vez no sea necesario mencionar, pero la cadena en sí solo contendrá caracteres únicos, por lo que no me gusta aba
, ya que a
ocurre dos veces.
Casos de prueba
Entrada: abcde
Salida posible:
a
ab
abc
abcd
abcde
b
bc
bcd
bcde
c
cd
cde
d
de
e
Entrada: abcdefghij
Salida posible:
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
Este es el código de golf , por lo que gana el envío con la menor cantidad de bytes.
Respuestas:
Pyth,
141310 bytesGracias a @FryAmTheEggman por guardar 3 bytes.
Pruébalo en línea!
fuente
jmXQ-Qd;.:
Idea similar, usandoX
.Perl,
322824 bytesIncluye +1 para
-n
Código:
Ejecutar con la cadena en STDIN:
Los idiomas del golf están tan cerca y tan lejos ...
Explicación
/.+/
coincide con una subcadena. Desafortunadamente, se detiene una vez que coincide con uno. Por lo tanto, utilizo la construcción de expresiones regulares en tiempo de ejecución(??{})
para extender la expresión regular para que falle y el retroceso intentará la siguiente subcadena, al final probándolas todas antes de darse por vencido.En el interior
(??{})
, imprimo la subcadena actual con el prefijo de tantos espacios como el desplazamiento de la subcadena usando$"x"@-"
Por lo tanto, el resultado documenta claramente cómo funciona el backgecking de expresiones regulares:
fuente
perl6 -ne 'm/^(.*)(.+)<{+put " "x$0.to,$1}>/'
ab1
(supongo que sesay...
evalúa como1
). (Probado en 5.18.2.) Editar: ¡Oh! lo siento, la pregunta dice "Puedes asumir que la cadena solo contendrá caracteres alfabéticos".MATL ,
2018 bytesInspirado en el patrón de subcadenas generado por la respuesta de @ aditsu
Pruébalo en línea!
El patrón de subcadenas es generado por una matriz triangular superior del mismo tamaño que la entrada, y todas las submatrices obtenidas eliminando sucesivamente la última fila y columna.
Explicación
Enfoque antiguo (poder cartesiano)
Mantengo este enfoque en caso de que sirva de inspiración para otras respuestas
En el compilador en línea esto se queda sin memoria para el caso de prueba más largo.
Pruébalo en línea!
Explicación
Esto genera todos los patrones de valores
0
,1
y2
en orden creciente, y luego se transforma2
en0
. Esto proporciona todos los patrones posibles de0
y1
donde los1
valores son contiguos. Estos se utilizan para marcar qué caracteres se toman de la cadena original.Como ejemplo, para cadenas
'abc'
los patrones se generan de la siguiente manera. Primero[0 1 2]
se obtiene el poder cartesiano de elevado al número de caracteres de entrada:Ordenar cada fila da
Transformarse
2
en0
(es decirmod(...,2)
) y eliminar filas duplicadas da el patrón finalen el que cada fila es una máscara correspondiente a una subcadena (contigua). La primera fila debe eliminarse porque corresponde a la subcadena vacía.
fuente
Retina ,
483231 bytesGracias a Kenny Lau por guardar 3 bytes y allanar el camino para muchos más.
El recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea!
Orden de las subcadenas generadas:
Explicación
Esto nos da todos los prefijos de la entrada. Esto se hace combinando (
M
) cualquier subcadena (.+
) comenzando desde el final (r
), considerando coincidencias superpuestas (&
) y devolviendo todas esas coincidencias unidas con saltos de línea (!
).Ahora todo lo que tenemos que hacer es tallar los prefijos sucesivos de esos prefijos (reemplazándolos con espacios). Hacemos esto paso a paso con un bucle:
Esto
%
significa que todo esto se hace en cada línea individualmente (considerándolo una cadena separada por el momento, y uniendo todo nuevamente con saltos de línea al final). El+
le dice a Retina que ejecute esta sustitución en un bucle hasta que la salida deje de cambiar (lo que en este caso significa que la expresión regular ya no coincide). Luego, la expresión regular intenta hacer coincidir la última línea de la entrada con al menos dos caracteres que no son espacios, y agrega una nueva fila donde el primero de ellos se reemplaza con un espacio.fuente
!
implicaM
y 1char de.+
y.*
?.+
y.*
tendría que tokenizar la expresión regular, y aunque estoy planeando hacerlo en algún momento, no creo que vaya a suceder pronto (y si lo hago, probablemente me centraré en características que en realidad agregue expresividad).Oracle SQL 11.2, 146 bytes
Sin golf
fuente
CJam, 20
Pruébalo en línea
Explicación:
fuente
Python, 57 bytes
Produce un me
set
gusta{' b', 'a', 'ab'}
. La idea es recurrir a dos bifurcaciones que cortan el primer o el último carácter. Ofrece salidas redundantes, peroset
elimina automáticamente los duplicados. Para la alineación, cada vez que se corta el primer carácter, se agrega un espacio al prefijop
, que se concatena en el frente.fuente
PowerShell v2 +, 69 bytes
Toma entrada
$a
, recorre la longitud (configuración$b
en el proceso para su uso posterior). En cada bucle externo, volvemos a hacerlo$b
, configurando$i
para su uso posterior. En cada bucle interno, generamos un$i
número de espacios concatenados con un segmento de la cadena de entrada. Como solo estamos recorriendo la cadena, esto realmente manejará cualquier cadena arbitraria (letras duplicadas, espacios, lo que sea).Ejemplo
fuente
C #,
136132131 bytesGolfed
Sin golf
Código completo
Lanzamientos
-1 byte
- Se ha modificado elString o="",e="";
deString o="",e=o;
ahorrar 1 byte. La idea era de Gallant ( me olvidé de aplicar esta parte en la última actualización, me disculpo ).-4 bytes
- Quitó los corchetes de losfor
bucles y movió el incremento de espacioe
var a la zona de iterador del bucle externo . La idea era de Gallant .for
136 bytes
- Solución inicial.fuente
e=o
para guardar 3 bytes.String o="",...
convar o...
otro 3.String o = "", e = "";
avar
ya que tendría que separarlas en dos, lo que resulta envar o = ""; var e = "";
que es de la misma longitud en comparación con la que tengo. Lo haría, pero VS no permite la declaración de variables múltiples cuando se usan variables tipadas implícitamente, también conocidas comovar
's. Pero gracias por la ayuda. EDITAR: Tener VS gritándome que no puedo hacerlo, supongo que es incorrecto, puede estar equivocado.Python 2.7,
7082 bytesNo pude encontrar la manera de obtenerlo en 1 línea. Llamar con
e("abcde",0)
fuente
Python 3,
8078 bytesRecorra el número de espacios para prefijar y luego el número de caracteres para terminar.
Editar: espacios eliminados antes de los bucles for.
fuente
MATL
1514 bytesGuardado de un byte, debido a @ LuisMendo de punta aquí !
Tantas maneras ... tuve que encontrar una nueva. ¡Felices bits! :)
Pruébalo en línea!
Explotó
fuente
JavaScript (ES6), 89 bytes
Enfoque directo. La salida tiene una nueva línea final.
fuente
=>
significa en Javascript? ¿Es un operador binarioJavaScript (ES6), 72
fuente
Pyth,
1211 bytesLamentablemente, la pregunta nos permite asumir caracteres únicos, por lo que solo busco la primera posición de la subcadena y rellena con espacios.
fuente
;
lugar de\
cuando está dentro del mapa de nivel más bajo.Mathematica 89 bytes
Explicación
i
se refiere a la cadena de entradaSubsequences[y=Characters@i]
devuelve todas las subsecuencias (listas representadas de caracteres) de la entrada. (Subsequences
fue introducido en el v. 10.4)Para cada subsecuencia,
Complement...
devuelve los caracteres de la cadena de entrada que no están presentes. Cada uno de esos caracteres se reemplaza por un espacio vacío víaStringReplace[i,#->" "]
.Column
muestra los resultados en una sola columna. Cada cadena de salida tiene el mismo número de caracteres, lo que resulta en letras alineadas.fuente
J,
32 2928 bytesEsto se evalúa como un verbo monádico. Pruébalo aquí. Uso:
Explicación
Como algunas otras respuestas, calculo el índice de ocurrencia del primer carácter de cada subcadena. Las subcadenas se almacenan en una matriz con espacios finales, por lo que las giro a la derecha por su índice para obtener la cantidad correcta de relleno. Ese espacio en blanco entre
"1
ya:
es realmente molesto ...fuente
a e
no es una subcadena definida por el desafíoJavaScript (Firefox 30-57),
6563 bytesDevuelve una matriz de cadenas. Como ES6 son 78 bytes:
fuente
QBasic, 75 bytes
La
FOR
estrategia básica de doble bucle, modificada un poco para la indexación basada en 1 de QBasic. El truco principal esLOCATE,j
, que mueve el cursor a la columnaj
de la línea actual antes de imprimir. Dado que la columna 1 es la primera columna, esto es equivalente a imprimirj-1
espacios iniciales.fuente
Perl 6 , 34 bytes
La razón del
+
antesput
es para que regrese en1
lugar deTrue
, lo que garantiza que no estará en la entrada, por lo que siempre tiene que retroceder.(Si lo desea en el orden opuesto, use en
(.*?)(.+?)
lugar de(.*)(.+)
)Esto fue inspirado por la respuesta de Perl 5 .
fuente
J,
352322 bytesMe tomó un tiempo pero finalmente lo optimicé.
Uso
Explicación
fuente
[:+./"1' '~:]
lugar de[:-.[:*/"1' '=]
guardar otros 2 bytes.Java, 138 bytes
Formateado:
fuente
Pyke, 15 bytes
Pruébalo aquí!
Asume que la variedad de cuerdas acolchadas es aceptable
Almohadillas primero y luego chuletas.
fuente
Haskell, 65 bytes
Sin embargo, requiere
inits
ytails
de Data.List. Para sacarlo, agrégalomapM_ putStrLn.
al frente.Relativamente sencillo; el
reverse
es asegurarse de que la cadena original es en primer lugar.fuente
(>>=zipWith(++)(inits$cycle" ").init.tails).inits
. Y agregue elimport Data.List;
al conteo de bytes.Ruby,
7567 bytesFunción anónima.
Utiliza la sustitución de expresiones regulares para alinear las subcadenas..
Es el personaje de relleno.fuente
bash + GNU coreutils, 109 Bytes
Quizás haya una solución más corta, pero esta es la mejor que se me ocurrió. La singularidad de los personajes no importa aquí.
fuente
PHP, 151 caracteres
Sin golf
Golfed
Ejemplo
fuente
C ++, 145 bytes
el primer parámetro de inicio se usa como entrada, la consola como salida
fuente
std::cout<<r[0]<<y<<'\n'
lugar de `std :: cout.write (r [0], y) << '\ n'? ¿Puedes por favor agregar una breve explicación? ¡Gracias!Python 2 (Ungolfed) 99 Bytes
Resultado:
fuente