Gelée , 14 12 octets
J’ƲœṗZ⁻¦µU⁼
Essayez-le en ligne!
Contexte
Nous commençons par regarder les indices basés sur 0 de la chaîne d'entrée.
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
Pour obtenir les lignes du triangle, nous pouvons diviser la chaîne avant les indices 1 , 1 + 3 = 4 , 1 + 3 + 5 = 9 et 1 + 3 + 5 + 7 = 16 . Puisque (n + 1) ² = n² + (2n + 1) , ces sommes sont précisément les carrés positifs et parfaits dans la liste d'index. Si nous divisons également la chaîne avant 0 , c'est aussi simple que de diviser avant tous les indices basés sur 0 qui sont des carrés parfaits.
Après le fractionnement, nous obtenons les chaînes suivantes.
""
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
Ensuite, nous remplaçons la chaîne vide au début par tous les caractères de la première colonne.
"HHHHH"
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
La tâche est maintenant réduite à vérifier si l'inversion de toutes les chaînes donne le même tableau de chaînes.
Comment ça fonctionne
J
Génère d' abord tous les indices basés sur 1 de la chaîne d'entrée J
, puis les décrémente avec ’
pour produire tous les indices basés sur 0. Ʋ
teste tous les indices basés sur 0 pour l'équerrage. Pour notre exemple ci-dessus, cela donne le tableau booléen suivant.
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
Ensuite, nous appelons œṗ
à partitionner la chaîne d'entrée, par exemple,
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
avant tous les 1 (en fait, tous les éléments véridiques). Pour notre exemple, cela donne le tableau de chaînes suivant.
['',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Z⁻¦
est sans doute la partie la plus intéressante de cette réponse. Analysons d'abord le plus simple Z1¦
.
¦
est le rapide clairsemé . Il consomme deux liens de la pile, spécifiquement 1
et Z
dans ce cas. Le premier Z
est appliqué à son argument: le tableau de chaînes d'avant. Z
est l' atome zip et lit le tableau de chaînes / tableau de caractères 2D par colonnes, ce qui donne
['HHHHH',
'eeee',
'Hlll',
'ell',
'Hlo',
'el',
'Hl',
'e',
'H'
]
Ce qui était le côté gauche de la chaîne d'entrée et la première colonne du tableau de chaînes devient maintenant la première chaîne .
¦
Regarde maintenant 1
et trouve un seul index: 1 . Ainsi, la première chaîne du tableau de chaînes d'origine est remplacée par la première chaîne dans la valeur de retour de Z
; les chaînes des autres indices ne sont pas affectées.
['HHHHH',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Appelons ce tableau A .
Nous avons utilisé à la Z⁻¦
place de Z1¦
, mais cela ne fait aucune différence: ⁻
compare le tableau de chaînes avec la chaîne d'entrée pour l'inégalité, ce qui donne 1 car elles ne sont pas égales. La différence entre les deux est qu'il Z⁻¦
est dyadique parce qu'il ⁻
nous permet d'écrire à la œṗZ⁻¦
place de œṗ¹Z1¦
. En effet, une dyade ( œṗ
) suivie d'une monade ( œṗ¹Z1¦
) est une fourchette (la monade est appliquée à l'argument de la chaîne / à la chaîne d'entrée, et la valeur renvoyée est transmise comme argument de droite à œṗ
), tandis qu'une dyade suivie d'une autre dyade (ou à la fin de la chaîne) est un crochet , c'est-à-dire que son argument de droite est l'argument de la chaîne.
Tout ce qui reste à faire est de vérifier la palindromicité. µ
commence une nouvelle chaîne (monadique) qui est l' argument est un . Le upend atome U
inverse toutes les chaînes A (mais pas A lui - même), puis ⁼
compare le résultat avec une pour l' égalité. Le booléen renvoyé 1 indique un triangle entièrement palindromique; les autres chaînes retourneraient 0 .