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 J
genera 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 1
y Z
en este caso. Primero Z
se aplica a su argumento: la matriz de cadenas de antes. Z
es 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 1
y 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 .