Escriba un programa o función que tome una cadena de una sola línea no vacía. Puede suponer que solo contiene ASCII imprimible, excluyendo el espacio.
Imprima o devuelva una forma de rombo ASCII similar a un limón o lima hecha de los prefijos de la cuerda.
Supongamos que la cadena de entrada tiene n letras de largo. Luego, dicha forma consta de 2n - 1 columnas de arte ASCII unidas, cada una de las cuales consta de 2n - 1 líneas. Contando desde 1, la columna k -ésima tiene f (k) = min (k, 2n - k) caracteres de ancho, y contiene copias f (k) de los primeros caracteres f (k) de entrada, centrados verticalmente, con un solo espacio en blanco líneas que separan las copias.
Por ejemplo, si la entrada es Lemon
, la salida debería ser:
Lemon
Lemo Lemo
Lem Lemon Lem
Le Lemo Lemo Le
L Lem Lemon Lem L
Le Lemo Lemo Le
Lem Lemon Lem
Lemo Lemo
Lemon
Si la entrada es lime
la salida debe ser:
lime
lim lim
li lime li
l lim lim l
li lime li
lim lim
lime
Y se sigue el mismo patrón para otras entradas:
a
a
Be
Be
B B
Be
/\
/\
/ /
/\
cat
cat
ca ca
c cat c
ca ca
cat
|||
|||
|| ||
| ||| |
|| ||
|||
.__.
.__.
.__ .__
._ .__. ._
. .__ .__ .
._ .__. ._
.__ .__
.__.
$tring
$tring
$trin $trin
$tri $tring $tri
$tr $trin $trin $tr
$t $tri $tring $tri $t
$ $tr $trin $trin $tr $
$t $tri $tring $tri $t
$tr $trin $trin $tr
$tri $tring $tri
$trin $trin
$tring
Las líneas en la salida pueden tener espacios finales y puede haber una nueva línea final opcional.
El código más corto en bytes gana.
Respuestas:
Matlab,
140 136 128124 bytesBásicamente, primero comienza con la sección central, y luego antepone / agrega las versiones acortadas / modificadas paso a paso.
Gracias por 8 bytes @LuisMendo!
Por ejemplo, para
MATLAB
obtener:fuente
flip
: /Python 2,
121110 bytes116 bytes si se usa
raw_input
. El programa esencialmente hace una máscara basada en la norma L1 / distancia de Manhattan desde el centro, así como la paridad de esta distancia en comparación con la paridad de la longitud de entrada.(Gracias a @Lynn por -9 bytes y allanando el camino para 2 más)
fuente
s
se usa al final de la línea larga, así que desafortunadamente eso no es posibleR
.R
hace que el código sea mucho más ordenado!MATL , 44 bytes
Me inspiré en la respuesta de @ flawr (aunque el algoritmo no es el mismo)
La entrada es una cadena con comillas simples.
Pruébalo en línea!
fuente
JavaScript (ES6), 132 bytes
Prueba
fuente
Pyth, 32 bytes
Demostración
fuente
Jalea,
3226 bytesPruébalo en línea!
EDITAR: Dennis guardó 6 bytes. ¡Gracias!
fuente
JavaScript,
187178 bytesUn enfoque bit a bit. La función
m
define una máscara comenzando en2 ** length
, por ejemplo,00100
en binario, y definiendom(n) = m(n-1) << 1 | m(n-1) >> 1
para la primera mitad. Curiosamente, la segunda mitad se puede definir comom(n) = m(n-1) << 1 & m(n-1) >> 1
. (aunque el programa opta por definirm(n) = m(2 * length - 1)
para la segunda mitad) A partir de aquí, estas máscaras se pueden usar para determinar si una palabra o un espacio deben aparecer marcando2 ** column & m(row)
. Por supuesto, en JavaScript es más corto escribir2 ** something
con1 << something
...nota: escrito mientras está cansado.
Mayocasi seguramente tiene errores.fuente
Haskell, 109 bytes
fuente
Brachylog , 46 bytes
Pruébalo en línea!
Terrible recuento de bytes y probablemente peor enfoque (sin mencionar que Brachylog no está diseñado exactamente para el arte ASCII), pero perdí el tiempo suficiente para publicarlo de todos modos.
Casi la única parte inteligente de todo esto es el uso de
a₁
para generar los espacios verticales más grandes primero, mientras quea₀
genera los prefijos de palabras más pequeños primero, yzz
para expandir espacios individuales en bloques de espacio que coinciden con los anchos de los prefijos.fuente
TSQL, 259 bytes
Golfizado:
Sin golf:
Violín
fuente
C, 167 bytes
Este programa espera que el texto de entrada se pase como el primer parámetro al programa (a través de la línea de comando o de lo contrario) y escribirá la salida en stdout.
Este es mi primer intento de código de golf aquí, ya que parecía un desafío razonable, por lo que probablemente se pueda jugar más de lo que pude solo debido a cómo lo hice.
Explicación
Es lo suficientemente significativo como para tener en cuenta el uso de
(n < m) ? n : (m * 2) - n
en el programa al menos dos veces para obtener la distancia invertida desde una posición centralm
en un rango dem * 2
con la entradan
. Si hay una forma más corta de hacerlo, entonces podría reducirse un poco más fácilmente ya que ese algoritmo es importante para la forma en que funciona este programa.fuente
C, 137 bytes
Descompostura:
Esto dibuja cada elemento de la cuadrícula 2n-1 x 2n-1, con una función de máscara que decide si el elemento actual debe ser un espacio en blanco o la palabra de entrada (la máscara verifica la forma de un diamante y el patrón de tablero de ajedrez).
fuente