Jalea , 14 12 bytes
J’ƲœṗZ⁻¦µU⁼
Pruébalo en línea!
Antecedentes
Comenzamos mirando los índices basados en 0 de la cadena de entrada.
H H e H H e l e H H e l l l e H H e l l o l l e H
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Para obtener las filas del triángulo, podemos dividir la cadena antes de los índices 1 , 1 + 3 = 4 , 1 + 3 + 5 = 9 y 1 + 3 + 5 + 7 = 16 . Como (n + 1) ² = n² + (2n + 1) , estas sumas son precisamente los cuadrados positivos y perfectos en la lista de índice. Si también dividimos la cadena antes de 0 , esto es tan simple como dividir antes de todos los índices basados en 0 que son cuadrados perfectos.
Después de dividir, obtenemos las siguientes cadenas.
""
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
A continuación, reemplazamos la cadena vacía al principio con todos los caracteres en la primera columna.
"HHHHH"
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
La tarea ahora se reduce a verificar si invertir todas las cadenas produce la misma matriz de cadenas.
Cómo funciona
Primero Jgenera todos los índices basados en 1 de la cadena de entrada J, luego los disminuye ’para producir todos los índices basados en 0. Ʋprueba todos los índices basados en 0 para la cuadratura. Para nuestro ejemplo de arriba, esto produce la siguiente matriz booleana.
1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
A continuación, llamamos œṗa particionar la cadena de entrada, por ejemplo,
H H e H H e l e H H e l l l e H H e l l o l l e H
antes de todos los 1 '(en realidad, todos los elementos de verdad). Para nuestro ejemplo, esto produce la siguiente matriz de cadenas.
['',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Z⁻¦es posiblemente la parte más interesante de esta respuesta. Analicemos el más directo Z1¦primero.
¦Es el escaso rápido. Consume dos enlaces de la pila, específicamente 1y Zen este caso. Primero Zse aplica a su argumento: la matriz de cadenas de antes. Zes el átomo zip y lee la matriz de cadenas / matriz de caracteres 2D por columnas, produciendo
['HHHHH',
'eeee',
'Hlll',
'ell',
'Hlo',
'el',
'Hl',
'e',
'H'
]
Lo que solía ser el lado izquierdo de la cadena de entrada y la primera columna de la matriz de cadenas ahora se convierte en la primera cadena .
Ahora ¦mira 1y encuentra un solo índice: 1 . Por lo tanto, la primera cadena en la matriz de cadenas original se reemplaza con la primera cadena en el valor de retorno de Z; Las cadenas de otros índices no se ven afectadas.
['HHHHH',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Vamos a llamar a esta matriz A .
Usamos en Z⁻¦lugar de Z1¦, pero esto no hace ninguna diferencia: ⁻compara la matriz de cadenas con la cadena de entrada para la desigualdad, produciendo 1 ya que no son iguales. La diferencia entre los dos es que Z⁻¦es diádica porque ⁻nos permite escribir en œṗZ⁻¦lugar de œṗ¹Z1¦. Esto se debe a que una díada ( œṗ) seguida de una mónada ( œṗ¹Z1¦) es una bifurcación (la mónada se aplica al argumento de la cadena / la cadena de entrada, y el valor devuelto se pasa como el argumento correcto a œṗ), mientras que una díada seguida por otra díada (o al final de la cadena) es un gancho , es decir, su argumento correcto es el argumento de la cadena.
Todo lo que queda por hacer es verificar la palindrómica. µcomienza una nueva cadena (monádico) que está argumento es una . El átomo invertidoU invierte todas las cadenas en A (pero no A en sí), luego ⁼compara el resultado con A para la igualdad. El 1 booleano devuelto indica un triángulo totalmente palindrómico; otras cadenas devolverían 0 .