J’ƲœṗZ⁻¦µU⁼
Wypróbuj online!
tło
Zaczynamy od spojrzenia na indeksy ciągu wejściowego oparte na 0.
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
Aby uzyskać rzędy trójkąta, możemy podzielić ciąg przed wskaźnikami 1 , 1 + 3 = 4 , 1 + 3 + 5 = 9 i 1 + 3 + 5 + 7 = 16 . Ponieważ (n + 1) ² = n² + (2n + 1) , sumy te są dokładnie dodatnimi, idealnymi kwadratami na liście indeksów. Jeśli podzielimy również ciąg przed 0 , jest to tak proste, jak podzielenie przed wszystkimi indeksami opartymi na 0, które są idealnymi kwadratami.
Po podzieleniu otrzymujemy następujące ciągi.
""
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
Następnie zastępujemy pusty ciąg na początku wszystkimi znakami w pierwszej kolumnie.
"HHHHH"
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
Zadanie sprowadza się teraz do sprawdzenia, czy odwrócenie wszystkich łańcuchów daje tę samą tablicę łańcuchów.
Jak to działa
Najpierw J
generuje wszystkie indeksy 1 ciągu wejściowego J
, a następnie zmniejsza je, ’
aby uzyskać wszystkie indeksy 0. Ʋ
testuje wszystkie indeksy oparte na 0 na kwadratowość. W naszym przykładzie z góry daje to następującą tablicę boolowską.
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
Następnie wywołujemy œṗ
partycję ciągu wejściowego, np.
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
przed wszystkimi 1 (właściwie wszystkie prawdziwe elementy). W naszym przykładzie daje to następującą tablicę ciągów.
['',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Z⁻¦
jest prawdopodobnie najciekawszą częścią tej odpowiedzi. Przeanalizujmy Z1¦
najpierw bardziej proste .
¦
jest rzadki szybki. Zużywa dwa łącza ze stosu, konkretnie 1
iw Z
tym przypadku. Pierwszy Z
jest stosowany do jego argumentu: tablicy ciągów z wcześniej. Z
jest atomem zip i odczytuje tablicę ciągów / tablicę znaków 2D według kolumn, dając
['HHHHH',
'eeee',
'Hlll',
'ell',
'Hlo',
'el',
'Hl',
'e',
'H'
]
To, co kiedyś było lewą stroną ciągu wejściowego i pierwszą kolumną tablicy ciągów, staje się teraz pierwszym ciągiem .
Teraz ¦
zagląda 1
i znajduje pojedynczy indeks: 1 . Zatem pierwszy ciąg w oryginalnej tablicy ciągów jest zastępowany pierwszym ciągiem w wartości zwracanej przez Z
; ciągi przy innych indeksach pozostają niezmienione.
['HHHHH',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Nazwijmy to tablica .
Użyliśmy Z⁻¦
zamiast Z1¦
, ale to nie robi różnicy: ⁻
porównuje tablicę ciągów z wejściowym ciągiem pod kątem nierówności, dając 1, ponieważ nie są one równe. Różnica między nimi polega na tym, że Z⁻¦
jest diademowa, ponieważ ⁻
pozwala nam pisać œṗZ⁻¦
zamiast œṗ¹Z1¦
. Wynika to z tego, że dyad ( œṗ
), po której następuje monada ( œṗ¹Z1¦
), jest rozwidleniem (monada jest stosowana do argumentu łańcucha / ciągu wejściowego, a zwracana wartość jest przekazywana jako właściwy argument œṗ
), podczas gdy za nią znajduje się inna diada (lub na końcu łańcucha) jest hakiem , tzn. jego prawy argument jest argumentem łańcucha.
Pozostało tylko sprawdzić palindromiczność. µ
rozpoczyna nowy łańcuch (jednowartościowy) kto jest argumentem jest . Odwracania atom cofa wszystkie ciągi w A (lecz nie sobie), a następnie porównuje wynik z A do równości. Zwrócony Boolean 1 wskazuje na w pełni palindromiczny trójkąt; inne ciągi zwracałyby 0 .U
⁼