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 .
Japt ,
252117 byteDisimpan 2 byte berkat @obarakon
Uji secara online!
Bagaimana itu bekerja
Perhatikan bahwa kita tidak perlu memeriksa kedua sisi; jika sisi-sisinya tidak sama, setidaknya satu baris bukanlah palindrom.
sumber
05AB1E , 18 byte
Menggunakan penyandian 05AB1E . Cobalah online!
sumber
gÅÉ£ÐíQs€¬āÈÏJÂQ*
gÅÉ£
Anda rubah licik ... Saya meremehkan merekalist-commands.py
Jelly ,
1816 byteCobalah online!
Terima kasih kepada Jonathan Allan untuk penghematan sepele tapi tidak begitu jelas.
sumber
JƲ0;œṗ⁸ZḢ$ṭ$ŒḂ€Ạ
J²‘Ṭœṗ⁸ZḢ$ṭ$ŒḂ€Ạ
½
sama sekali? SekarangJ
lebih masuk akal ...JavaScript (ES6), 112 byte
t
danu
kumpulkan sisi-sisinya sehingga mereka dapat diuji pada akhirnya.sumber
C #, 184 byte
Kupikir solusinya kelihatan bagus sampai aku sampai di bagian palindrome
Versi tidak disatukan:
sumber
e=..
ke garis loop for untuk menyimpan byte? Tidak perlu menghitung baris baru ke dalam hitungan byte jadi saya berasumsi Anda tidak.....; i < s;e = f.Substring(s - k)){c+=....
Java 8,
358301 byteInput adalah a
String
, output adalah aboolean
.Penjelasan:
Coba di sini.
sumber
Jelly ,
2021 byte+2 byte - Saya merilis kode buggy :(
-1 byte - dipindahkan dari pencetakan seperti bilangan bulat ganjil ke partisi pada indeks persegi
Tautan monadik yang menerima daftar karakter dan kembali
1
(Kebenaran) atau0
(Falsey).Catatan: ini menggunakan bagian dari spesifikasi yang membatasi input hingga panjang persegi.
Cobalah online! atau lihat test suite .
Ini dapat disederhanakan menjadi 17 byte dengan mencatat bahwa jika semua baris adalah palindrom, hanya satu "sisi" yang perlu diperiksa (
JƲ0;œṗ⁸ZḢ$ṭ$ŒḂ€Ạ
), namun Erik the Outgolfer sudah memperhatikan fakta ini dan menggunakannya dalam jawaban mereka sehingga saya telah memberikan metode konstruksi segitiga untuk menghemat satu byte di sana.Selain itu, yang pada gilirannya dapat ditingkatkan menjadi 16 byte dengan mencatat bahwa mempartisi pada indeks kebenaran tidak masalah jika ada kelebihan dalam argumen kiri (
J²‘Ṭœṗ⁸ZḢ$ṭ$ŒḂ€Ạ
).Bagaimana?
sumber
Mathematica, 156 byte
memasukkan
sumber
If[<stuff>, True, False]
dengan adil<stuff>
? Dan saya pikirAnd@@(...)
lebih pendek dariCount[...,True]==s
, yang juga berarti Anda tidak perlu mendefinisikans
sebagai variabel."1202"
dan"160625052"
).PHP , 97 byte
Cobalah online!
sumber
Java, 136 byte
Menggunakan a
MutableList<Character>
dari koleksi Eclipsesumber
Perl 5 , 81 + 1 (
-p
) = 82 byteCobalah online!
Keluaran
undef
(yaitu, kosong, nol) untuk true, angka apa saja untuk falsesumber
Excel VBA, 87 Bytes
Fungsi jendela langsung VBE anonim yang mengambil input dari sel
[A1]
dan output ke jendela langsung VBEsumber
Python 2 ,
128118115 byteCobalah online!
sumber