Желе , 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
, затем уменьшает их на 1, ’
чтобы получить все основанные на 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
является атомом почтового индекса и читает массив строк / массив символов 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
⁼