J’ƲœṗZ⁻¦µU⁼
Provalo online!
sfondo
Iniziamo osservando gli indici basati su 0 della stringa di input.
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
Per ottenere le righe del triangolo, possiamo dividere la stringa prima degli indici 1 , 1 + 3 = 4 , 1 + 3 + 5 = 9 e 1 + 3 + 5 + 7 = 16 . Poiché (n + 1) ² = n² + (2n + 1) , queste somme sono esattamente i quadrati positivi e perfetti nell'elenco degli indici. Se dividiamo anche la stringa prima di 0 , questo è semplice come dividere prima di tutti gli indici basati su 0 che sono quadrati perfetti.
Dopo la divisione, otteniamo le seguenti stringhe.
""
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
Successivamente, sostituiamo la stringa vuota all'inizio con tutti i caratteri nella prima colonna.
"HHHHH"
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
L'attività è ora ridotta al controllo se l'inversione di tutte le stringhe produce lo stesso array di stringhe.
Come funziona
In primo luogo Jgenera tutti gli indici basati su 1 della stringa di input J, quindi li diminuisce con ’per produrre tutti gli indici basati su 0. Ʋtesta tutti gli indici basati su 0 per la quadratura. Per il nostro esempio dall'alto, questo produce il seguente array booleano.
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
Successivamente, chiamiamo œṗper partizionare la stringa di input, ad es.
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
prima di tutti gli 1 (in realtà, tutti gli elementi di verità). Per il nostro esempio, questo produce il seguente array di stringhe.
['',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Z⁻¦è probabilmente la parte più interessante di questa risposta. Analizziamo prima il più semplice Z1¦.
¦è il rado veloce. Consuma due collegamenti dallo stack, in particolare 1e Zin questo caso. Il primo Zviene applicato al suo argomento: l'array di stringhe di prima. Zè l' atomo zip e legge l'array string / array di caratteri 2D per colonne, cedendo
['HHHHH',
'eeee',
'Hlll',
'ell',
'Hlo',
'el',
'Hl',
'e',
'H'
]
Quello che era il lato sinistro della stringa di input e la prima colonna dell'array di stringhe ora diventa la prima stringa .
Ora ¦dà un'occhiata 1e trova un singolo indice: 1 . Quindi la prima stringa nella matrice di stringhe originale viene sostituita con la prima stringa nel valore restituito di Z; le stringhe di altri indici rimangono inalterate.
['HHHHH',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Chiamiamo questo array A .
Abbiamo usato Z⁻¦invece di Z1¦, ma questo non fa alcuna differenza: ⁻confronta l'array di stringhe con la stringa di input per disuguaglianza, producendo 1 poiché non sono uguali. La differenza tra i due è che Z⁻¦è diadica perché ⁻, permettendoci di scrivere œṗZ⁻¦invece di œṗ¹Z1¦. Questo perché una diade ( œṗ) seguita da una monade ( œṗ¹Z1¦) è un fork (la monade viene applicata all'argomento della catena / stringa di input e il valore restituito viene passato come argomento corretto a œṗ), mentre una diade seguita da un'altra diade (o alla fine della catena) è un gancio , cioè il suo argomento giusto è l'argomento della catena.
Tutto ciò che resta da fare è verificare la palindromicità. µinizia una nuova catena (monade) che è argomento è A . L' atomo ascendenteU inverte tutte le stringhe in A (ma non A stesso), quindi ⁼confronta il risultato con A per l'uguaglianza. Il Booleano 1 restituito indica un triangolo completamente palindromico; altre stringhe restituirebbero 0 .