Jelly , 14 12 byte
J’ƲœṗZ⁻¦µU⁼
Cobalah online!
Latar Belakang
Kita mulai dengan melihat indeks berbasis 0 dari string 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
Untuk mendapatkan barisan segitiga, kita dapat membagi string sebelum indeks 1 , 1 + 3 = 4 , 1 + 3 + 5 = 9 , dan 1 + 3 + 5 + 7 = 16 . Karena (n + 1) ² = n² + (2n + 1) , jumlah ini adalah tepat, kuadrat sempurna dalam daftar indeks. Jika kita juga membagi string sebelum 0 , ini sesederhana pemisahan sebelum semua indeks berbasis 0 yang merupakan kuadrat sempurna.
Setelah pemisahan, kami mendapatkan string berikut.
""
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
Selanjutnya, kami mengganti string kosong di awal dengan semua karakter di kolom pertama.
"HHHHH"
"H"
"HeH"
"HeleH"
"HellleH"
"HellolleH"
Tugas sekarang dikurangi untuk memeriksa apakah membalik semua string menghasilkan array string yang sama.
Bagaimana itu bekerja
Pertama-tama, J
buat semua indeks berbasis-1 dari string input J
, lalu turunkan dengan ’
untuk menghasilkan semua indeks berbasis-0. Ʋ
menguji semua indeks berbasis 0 untuk kuadrat. Untuk contoh kita dari atas, ini menghasilkan array Boolean berikut.
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
Selanjutnya, kita panggil œṗ
untuk mempartisi string input, misalnya,
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
sebelum semua 1 (sebenarnya, semua elemen kebenaran). Sebagai contoh kita, ini menghasilkan array string berikut.
['',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Z⁻¦
bisa dibilang bagian paling menarik dari jawaban ini. Mari kita analisa yang lebih mudah Z1¦
dulu.
¦
adalah jarang cepat. Ini mengkonsumsi dua tautan dari tumpukan, khususnya 1
dan Z
dalam hal ini. Pertama Z
diterapkan pada argumennya: array string dari sebelumnya. Z
adalah atom zip dan membaca array string / 2D array karakter oleh kolom, menghasilkan
['HHHHH',
'eeee',
'Hlll',
'ell',
'Hlo',
'el',
'Hl',
'e',
'H'
]
Apa yang dulunya sisi kiri dari string input dan kolom pertama dari array string sekarang menjadi string pertama .
Sekarang ¦
intip 1
dan temukan satu indeks: 1 . Jadi string pertama dalam array string asli diganti dengan string pertama dalam nilai kembalinya Z
; string pada indeks lain tetap tidak terpengaruh.
['HHHHH',
'H',
'HeH',
'HeleH',
'HellleH',
'HellolleH'
]
Mari kita sebut array ini A .
Kami menggunakan Z⁻¦
alih-alih Z1¦
, tetapi ini tidak membuat perbedaan: ⁻
membandingkan array string dengan string input untuk ketidaksetaraan, menghasilkan 1 karena mereka tidak sama. Perbedaan antara keduanya adalah Z⁻¦
karena diad karena ⁻
, memungkinkan kita untuk menulisœṗZ⁻¦
bukan œṗ¹Z1¦
. Ini karena angka dua ( œṗ
) diikuti oleh monad ( œṗ¹Z1¦
) adalah garpu (monad diterapkan pada argumen rantai / string input, dan nilai yang dikembalikan dilewatkan sebagai argumen yang tepat untuk œṗ
), sedangkan angka dua diikuti oleh angka dua lain (atau di akhir rantai) adalah sebuah kait , yaitu, argumen yang benar adalah argumen rantai.
Yang tersisa untuk dilakukan adalah memeriksa palindromicness. µ
dimulai baru (monadik) rantai siapa argumen adalah A . The upend atom U
membalikkan semua string di A (tetapi tidak A itu sendiri), kemudian ⁼
membandingkan hasilnya dengan A untuk kesetaraan. Boolean 1 yang dikembalikan menunjukkan segitiga palindromik sepenuhnya; string lain akan mengembalikan 0 .