Tugas Anda adalah menentukan seberapa besar palindrome yang sempurna dari sebuah string. Palindrom khas Anda (mis. 12321) adalah palindrom sempurna; kesempurnaannya adalah 1.
Untuk menentukan kesempurnaan string, Anda melihat berapa banyak bagian yang dapat Anda bagi menjadi setiap bagian dari palindrom. Jika ada ambiguitas, seperti dengan aaaa
, ketika Anda dapat membaginya menjadi [aa, aa]
atau [aaaa]
atau [a, aaa]
atau [aaa, a]
, set terpendek akan menimpanya, memberikan aaaa
skor 1, yang merupakan panjang dari set terpendek.
Oleh karena itu, Anda harus menulis sebuah program atau fungsi yang akan mengambil satu input dan mengosongkan non-kosong seberapa sempurna itu (yang merupakan panjang dari set terpendek yang Anda dapat membaginya menjadi di mana setiap elemen dalam set adalah palindrom).
Contoh:
1111 -> 1 [1111]
abcb -> 2 [a, bcb]
abcbd -> 3 [a, bcb, d]
abcde -> 5 [a, b, c, d, e]
66a -> 2 [66, a]
abcba-> 1 [abcba]
x -> 1 [x]
ababacab -> 2 [aba, bacab]
bacababa -> 2 [bacab, aba]
26600 -> 3 [2, 66, 00] [my user id] [who has a more perfect user id?]
ababacabBACABABA -> 4 [aba, bacab, BACAB, ABA]
Perhatikan bahwa dalam contoh apa pun dalam tanda kurung tidak boleh menjadi bagian dari output.
ababacab
dan kebalikannya,,bacababa
tampaknya merupakan ujian yang baik.ababacabBACABABA
juga merupakan test case yang baik (beberapa jawaban gagal).Jawaban:
Brachylog , 7 byte
Cobalah online!
Penjelasan
sumber
Jelly ,
131211 byteCobalah online!
Spesifikasi
"ababacab"
(sebagai argumen)2
sumber
"\"
, karena itu sintaks yang tidak valid.ababacab
dan sebaliknyabacababa
,.Pyth, 9 byte
Suite uji
Ini membentuk semua partisi input, dari terpendek ke terpanjang. Kemudian, ia memfilter partisi tersebut pada invarian di bawah memfilter elemen pada invarian di bawah pembalikan. Akhirnya, kami mengambil elemen pertama dari daftar partisi yang difilter, dan mengembalikan panjangnya.
Untuk menjelaskan bahwa langkah rumit, mari kita mulai dengan invarian di bawah pembalikan:
_I
. Itu memeriksa apakah inputnya adalah palindrome, karena memeriksa apakah membalikkan mengubah nilai.Berikutnya, penyaringan untuk palindromicity:
_I#
. Ini hanya akan menyimpan elemen palindrom dari daftar.Berikutnya, kita memeriksa invarian di bawah penyaringan untuk palindromicity:
_I#I
. Ini benar jika dan hanya jika semua elemen dalam daftar adalah palindrom.Akhirnya, kami menyaring untuk daftar di mana semua elemen dari daftar adalah palindrom:
_I#I#
.sumber
Haskell , 83 byte
Cobalah online!
Ini menggunakan tip hebat dari Zgarb untuk menghasilkan partisi string .
sumber
Clojure, 111 byte
Pisahkan pada semua posisi yang memungkinkan, dan ketika bagian pertama adalah palindrome, hasilkan untuk mencari partisi untuk sisa string.
Cobalah online .
Tidak disatukan, menggunakan makro thread-last
->>
.Versi yang tidak jelas, tolong jangan menulis kode seperti ini: D
sumber
f
harus menyebut dirinya dalam untuk:(f b)
. Pada posisi tail-call yang bisa Anda gunakanrecur
.defn
denganfn
dan hanya memiliki fungsi.(fn f[s]( ... ))
? Oh benar Anda menyimpan 2 karakter dengan itu.JavaScript (ES6),
143126124 byteDisimpan 2 byte berkat Neil
Terinspirasi oleh metode NikoNyrh .
Diformat dan dikomentari
Uji kasus
Tampilkan cuplikan kode
Pendekatan awal,
173168 byteFungsi rekursif yang cukup panjang yang menghitung semua kemungkinan partisi dari string input.
Diformat dan dikomentari
Uji kasus
Tampilkan cuplikan kode
sumber
,p=0
,s[p++]?
dan,F(s,i,p)
.Jelly , 10 byte
Cobalah online!
Bagaimana?
Menggunakan fakta bahwa
[0]<[0,0]<[0,0,0],...,<[0,...,0,1]<...
- jadi jika kita mengurutkan partisi dengan kunci "tidak palindrom untuk setiap bagian" entri pertama akan semuanya palindrom dan panjang minimal.
Catatan: string panjang n yang tidak kosong akan selalu menghasilkan kunci dengan n nol, karena semua string 1 panjang adalah palindromik.
sumber
Haskell , 69 byte
Menentukan fungsi
f
. Cobalah online!Penjelasan
Fungsi pembantu infiks
x ! y
menghitung daftar bilangan bulat, yang merupakan panjang dari beberapa kelengkapanreverse x ++ y
menjadi palindromreverse x
yang dibiarkan utuh. Dijamin mengandung panjang pemisahan minimum jikay
tidak kosong. Cara kerjanya adalah ini.y
tidak kosong, char dikeluarkan dan didorong ke dalamx
. Jikax
menjadi palindrome, kami memanggil fungsi utamaf
di bagian ekory
dan menambahkan 1 untuk menjelaskanx
. Kami juga memanggil!
yang barux
dany
tidak ketinggalan potensi pemecahan.y
kosong, kami kembali[0]
(satu pemisahan dengan panjang 0) jikax
juga kosong, dan[]
(tidak ada pemisahan) jika tidak.Fungsi utama
f
hanya memanggil"" ! x
dan mengambil hasil minimum.sumber
JavaScript (Firefox 30-57), 97 byte
Port ES6:
Tampaknya solusi yang sangat sederhana sehingga saya terus berpikir saya telah melupakan sesuatu tetapi setidaknya lulus semua test case.
sumber
Haskell,
139116109 byteMasih hijau di golf Haskell, tetapi ini adalah upaya terbaik yang bisa saya lakukan dengan cepat.
(and.map r)
untuk menghapus sub daftar yang tidak mengandung palindrom, di mana panjang titik diterapkan ke daftar, dan hasilnya adalah disortir sehingga kita bisa mengambil kepala yang merupakan jawabannya.Saya berpikir jawaban yang lebih baik mungkin dapat memanfaatkan sifat Daftar yang tidak deterministik di Haskell melalui penggunaan Applicatives. Dimungkinkan untuk memotong banyak byte dari fungsi h dengan menggunakan aplikasi, bahkan jika kita harus mengimpor Control.Applicative. Komentar untuk perbaikan dipersilahkan.
UPDATE1
Penghematan besar berdasarkan pengingat Laikoni tentang fungsi minimum. Menghapus semacam sebenarnya memungkinkan saya untuk menjatuhkan impor Data.List karena minimum didefinisikan di Prelude!
UPDATE2
Berkat saran nimi tentang penggunaan daftar pemahaman sebagai pengganti yang berguna untuk filter.map. Itu menyelamatkan saya beberapa byte. Saya juga meminjam trik partisi String yang rapi dari Laikonis dan menyimpan beberapa byte di sana juga.
sumber
h []=[[]]
danh (x:y)=map ([x]:)
mengandung ruang putih yang tidak perlu.head.sort
adalahminimum
.filter
&map
:g x=head$sort[length y|y<-h x,and$r<$>y]
.PHP, 319 Bytes
Versi Online
Diperluas
Versi yang lebih panjang tanpa E_NOTICE dan Output array yang dihasilkan
sumber
ababacabBACABABA