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 J
genera 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 1
e Z
in questo caso. Il primo Z
viene 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 1
e 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 .