Jelly , 14 12 Bytes
J’ƲœṗZ⁻¦µU⁼
Probieren Sie es online!
Hintergrund
Zunächst betrachten wir die 0-basierten Indizes der Eingabezeichenfolge.
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
Um die Zeilen des Dreiecks zu erhalten, können wir den String vor den Indizes 1 , 1 + 3 = 4 , 1 + 3 + 5 = 9 und 1 + 3 + 5 + 7 = 16 teilen . Da (n + 1) ² = n² + (2n + 1) , sind diese Summen genau die positiven, perfekten Quadrate in der Indexliste. Wenn wir den String auch vor 0 teilen , ist dies so einfach wie das Teilen vor allen auf 0 basierenden Indizes, die perfekte Quadrate sind.
Nach dem Aufteilen erhalten wir die folgenden Zeichenfolgen.
""
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
Als nächstes ersetzen wir die leere Zeichenfolge am Anfang durch alle Zeichen in der ersten Spalte.
"HHHHH"
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
Die Aufgabe beschränkt sich nun darauf, zu prüfen, ob das Umkehren aller Zeichenfolgen dasselbe Zeichenfolgenarray ergibt.
Wie es funktioniert
Zuerst J
erzeugt alle 1-basierten Indizes der Eingabezeichenfolge J
, dekrementiert sie dann mit ’
allen 0-basierte Indizes zu ergeben. Ʋ
Testet alle 0-basierten Indizes auf Rechtwinkligkeit. Für unser Beispiel von oben ergibt dies das folgende Boolesche Array.
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
Als nächstes rufen wir auf, œṗ
um die Eingabezeichenfolge zu partitionieren, z.
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
vor allen 1 ‚s (eigentlich alle truthy Elemente). In unserem Beispiel ergibt dies das folgende String-Array.
['',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Z⁻¦
ist wohl der interessanteste Teil dieser Antwort. Lassen Sie uns zuerst die einfacheren analysieren Z1¦
.
¦
ist das spärlich schnell. Speziell 1
und Z
in diesem Fall werden zwei Links aus dem Stapel verbraucht . Zuerst Z
wird auf sein Argument angewendet: das String-Array von vorher. Z
ist das zip- Atom und liest das Zeichenkettenarray / 2D-Zeichenarray spaltenweise, was ergibt
['HHHHH',
'eeee',
'Hlll',
'ell',
'Hlo',
'el',
'Hl',
'e',
'H'
]
Was früher links von der Eingabezeichenfolge und der ersten Spalte des Zeichenfolgenarrays war, wird jetzt zur ersten Zeichenfolge .
Nun ¦
guckt auf 1
und findet einen einzigen Index: 1 . Daher wird die erste Zeichenfolge im ursprünglichen Zeichenfolgenarray durch die erste Zeichenfolge im Rückgabewert von ersetzt Z
. Zeichenfolgen bei anderen Indizes bleiben unberührt.
['HHHHH',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Lassen Sie uns dieses Array nennen A .
Wir haben Z⁻¦
stattdessen verwendet Z1¦
, aber das macht keinen Unterschied: ⁻
Vergleicht das Zeichenfolgenarray mit der Eingabezeichenfolge auf Ungleichheit und ergibt 1, da sie nicht gleich sind. Der Unterschied zwischen den beiden ist, dass Z⁻¦
es dyadisch ⁻
ist, weil es uns erlaubt zu schreiben œṗZ⁻¦
anstatt œṗ¹Z1¦
. Dies liegt daran, dass eine Dyade ( œṗ
) gefolgt von einer Monade ( œṗ¹Z1¦
) eine Verzweigung ist (die Monade wird auf das Argument / die Eingabezeichenfolge der Kette angewendet und der zurückgegebene Wert wird als das richtige Argument an übergeben œṗ
), während eine Dyade von einer anderen Dyade gefolgt wird (oder am Ende der Kette) ist ein Haken , dh sein rechtes Argument ist das Argument der Kette.
Sie müssen nur noch auf Palindromie prüfen. µ
beginnt eine neue (monadische) Kette, deren Argument A ist . Das Upend- Atom U
kehrt alle Strings in A um (aber nicht A selbst) und ⁼
vergleicht dann das Ergebnis mit A, um die Gleichheit zu gewährleisten . Der zurückgegebene Boolesche Wert 1 gibt ein vollständig palindromisches Dreieck an. andere Zeichenfolgen würden 0 zurückgeben .