Желе , 14 12 байт
J’ƲœṗZ⁻¦µU⁼
Спробуйте в Інтернеті!
Фон
Почнемо з ознайомлення з 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
Щоб отримати рядки трикутника, ми можемо розділити рядок перед показниками 1 , 1 + 3 = 4 , 1 + 3 + 5 = 9 і 1 + 3 + 5 + 7 = 16 . Оскільки (n + 1) ² = n² + (2n + 1) , ці суми є саме позитивними, ідеальними квадратами у списку індексів. Якщо ми також розділимо рядок перед 0 , це так само просто, як розділення перед усіма індексами на основі 0, які є ідеальними квадратами.
Після розщеплення отримуємо наступні рядки.
""
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
Далі замінюємо спочатку порожній рядок усіма символами першого стовпця.
"HHHHH"
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
Тепер завдання зводиться до перевірки того, чи повернення всіх рядків дає один і той же рядковий масив.
Як це працює
Спочатку J
генерується всі 1-базисні індекси вхідного рядка J
, потім зменшується їх, ’
щоб отримати всі 0-базисні індекси. Ʋ
перевіряє всі 0-основні індекси на квадратність. У нашому прикладі зверху це дає наступний булівський масив.
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
Далі ми закликаємо œṗ
розділити рядок введення, наприклад,
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
раніше всіх 1 -х (насправді, всі елементари). У нашому прикладі це дає наступний масив рядків.
['',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Z⁻¦
це, мабуть, найцікавіша частина цієї відповіді. Давайте Z1¦
спочатку проаналізуємо більш прямолінійну .
¦
є рідким швидким. Він споживає два посилання зі стека, конкретно 1
і Z
в цьому випадку. Спочатку Z
застосовується до його аргументу: рядковий рядок від раніше. Z
є атомом zip та зчитує масив рядків / 2D-масив символів за стовпцями, поступаючись
['HHHHH',
'eeee',
'Hlll',
'ell',
'Hlo',
'el',
'Hl',
'e',
'H'
]
Те, що раніше було лівою частиною вхідного рядка та першим стовпцем масиву рядків, стає першим рядком .
Тепер ¦
заглядає 1
і знаходить єдиний індекс: 1 . Таким чином, перша рядок у вихідному масиві рядків замінюється першою рядком у зворотному значенні Z
; рядки інших індексів залишаються без змін.
['HHHHH',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Давайте назвемо цей масив .
Ми використовували Z⁻¦
замість Z1¦
, але це не має ніякої різниці: ⁻
порівнює масив рядків із вхідним рядком для нерівності, отримуючи 1, оскільки вони не рівні. Різниця між ними полягає в тому, що Z⁻¦
це діадіальність, оскільки ⁻
це дозволяє нам писати œṗZ⁻¦
замість œṗ¹Z1¦
. Це пояснюється тим, що dyad ( œṗ
), за яким слідує monad ( œṗ¹Z1¦
), - це вилка (монада застосовується до аргументу ланцюга / вхідного рядка, а повернене значення передається як правильний аргумент œṗ
), тоді як діада, за якою слідує інша діада (або в кінці ланцюга) - гачок , тобто його правильним аргументом є аргумент ланцюга.
Залишилося лише перевірити паліндромність. µ
починається нова (одномісний) ланцюгом Хто є аргумент . Вгору ноги атом змінює все рядки в A (але не сам), а потім порівнює результат з А для рівності. Повернений булевий 1 вказує на повністю паліндромний трикутник; інші рядки повернуть 0 .U
⁼