Masukan Anda akan berupa string yang terdiri dari huruf-huruf bahasa Inggris kecil.
Tugas Anda adalah untuk menentukan jumlah permutasi yang berbeda dari string asli yang merupakan palindrom.
String input memiliki hingga 100 huruf. Dalam kasus string yang lebih panjang hasilnya mungkin sangat besar sehingga output harus berupa jumlah permutasi modulo 666013.
Sebagai contoh,
cababaa -> 3
Permutasi yang mungkin adalah:
aabcbaa
abacaba
baacaab
Ini kode-golf , jadi jawaban terpendek menang!
code-golf
string
combinatorics
permutations
palindrome
Andrei Mihailescu
sumber
sumber
abcdabcddddd -> 120
(tidak ada jumlah karakter ganjil) ,abcdabcdddddd -> 120
(satu jumlah karakter ganjil) ,abcdabcddddddeee -> 0
(dua jumlah karakter ganjil) ,aabbccddeeffgghhiijj -> 298735
(dipengaruhi oleh modulo) .Jawaban:
Brachylog (2), 15 byte
Cobalah online!
Penjelasan
sumber
05AB1E ,
171613 byte-1 byte dari Jonathon Allan
-3 byte dari Emigna dan Adnan
Penjelasan:
Cobalah online!
sumber
E›j
mewakili digit[14, 116, 45]
yang dikonversi dari basis214
, dan menjadi14*214^2 + 116*214 + 45 = 666013
. Saya tidak yakin di mana referensi untuk digit, tetapi mereka tampaknya sejalan (ish?) Dengan pesanan mereka di halaman info . @Adnan dapat mencerahkan kami.œÙvyÂQ}O•E›j•%
œÙvyÂQO•E›j•%
.Perl 6 ,
1041088884 byteCobalah online!
Bagaimana itu bekerja
Saya tidak dapat dengan mudah menghasilkan semua permutasi dan memfilternya, bahkan jika run-time astronomi diizinkan, karena built-in Perl 6
permutations
operasi langsung-lurus rutin menolak untuk mengubah daftar dari lebih dari 20 elemen dan deskripsi tugas memerlukan input hingga 100 karakter.Jadi alih-alih saya menggunakan rumus langsung berdasarkan frekuensi huruf dari input:
Fungsi helper yang membagi dua angka dan membulatkannya ke bilangan bulat terdekat, dan kemudian mengambil faktorial dari itu.
Hitung-hitung frekuensi huruf dalam string masukan, dan jadikan itu topik untuk sisa kode. Misalnya untuk input,
abcdabcdddddd
ini akan menjadi daftar(2, 2, 2, 7)
.Jika ada lebih dari satu frekuensi huruf ganjil, gandakan hasilnya dengan nol, karena tidak ada palindrom yang memungkinkan dalam kasus tersebut.
Hitung jumlah permutasi yang mungkin dari karakter yang akan berada di "satu sisi" dari masing-masing palindrome (yang sesuai dengan multiset dengan multiplisitas yang diperoleh dengan membagi dua dan meratakan frekuensi huruf input) . Rumus yang digunakan adalah dari PDF ini :
(n 1 + ... + n k )! / (n 1 ! ⋅ ... ⋅n k 1)
Misalnya untuk frekuensi huruf input
(2,2,2,7)
, huruf-huruf di satu sisi palindrome membentuk multiset dengan banyak(1,1,1,3)
, dan jumlah permutasi demikian(1+1+1+3)! / (1!⋅1!⋅1!⋅3!) = 120
.Ambil hasilnya modulo 666013.
sumber
Python3,
8180 byteIni adalah yang terpendek yang bisa saya lakukan. Tidak yakin apakah permutasi dapat dihasilkan dengan lebih mudah ...
Penjelasan
Catatan
a==a[::-1]
mengembalikan nilai boolean, tetapisum(...)
fungsi secara implisit melemparkannya ke integer (0 atau 1) dan menjumlahkannya.permutations(...)
. Jika tidak diatur ({...}
) akan berisi hanya satu elemen, objek itu sendiri.{...}
) untuk menyimpan hanya permutasi yang berbeda di dalam.Di Floroid, ini (hampir)
z(T(a==aDKaIW(cb(L)))%666013)
, tetapi mencetak hasilnya sebagai gantinya, dan mengambil input melalui baris perintah.Terima kasih kepada @Jonathan Allan karena telah menghemat satu byte! -> Mengubah
import
gayaCobalah online!
sumber
Jelly , 13 byte
Cobalah online!
Bagaimana?
Forcer kasar.
Saya percaya bahwa ini akan melakukannya dengan lebih efisien, tetapi 30 byte (sunting: pdf ini tampaknya mengonfirmasi hal itu, berkat jawaban smls ):
sumber
%
mod.Œ!QŒḂ€S%“µɲ€’
,. Itu terlihat identik dengan saya.Mathematica, 46 byte
Mengambil daftar karakter sebagai input.
Sangat tidak efisien, karena sebenarnya menghasilkan semua permutasi input dan kemudian menghitung yang palindromik.
sumber
0
, jika string memiliki beberapa huruf yang terjadi dengan multiplisitas ganjil (seperti"abcdabcddddddeee"
).Mathematica, 68 byte
Fungsi murni mengambil daftar karakter sebagai input dan mengembalikan integer. Tidak sesingkat jawaban Martin Ender's Mathematica , tapi tetap saja ini pendekatan yang imut, yang tampaknya merupakan pendekatan yang sama dengan jawaban Perl 6 dari smls .
Pertama,
t=Last/@Tally@#/2
hitung jumlah semua karakter berbeda dalam input, dibagi dengan2
; kemudiani=Floor
bulatkan setiap pecahan yang terjadi dit
. Perhatikan bahwa permutasi palindromic dari input ada persis ketika ada paling banyak satu angka ganjil antara jumlah yang asli, yaitu, ketika ada paling banyak satu fraksi dit
. Kita dapat menguji untuk itu dengan hanya menambahkan semua element-i
(menggunakanTr
): jika jawabannya kurang dari1
, ada permutasi palindrom, jika tidak tidak.Jika ada, maka
i
mewakili jumlah karakter yang berbeda di bagian kiri permutasi, yang dapat diatur secara sewenang-wenang. Jumlah cara untuk melakukannya adalah persisMultinomial
koefisien (hasil bagi faktorial tertentu), yang telah dibangun oleh Mathematica.sumber
k, 23 byte
Jika menggunakan oK , atau
cmb
tidak ada, gunakanprm
sebagai ganticmb
.sumber
Pyth - 15 byte
Cobalah online di sini .
sumber
C ++ 14, 161 byte
Sebagai lambda tanpa nama, anggaplah input seperti
std::string
dan kembali melalui parameter referensi.Tidak digabungkan dan digunakan:
sumber
Ruby,
67575259 karaktersumber
->s{ }
, bukan?(s.size)
argumen itu berlebihan?.to_a
juga.undefined method
uniq 'untuk # <Enumerator`), tetapi benar itu bekerja pada ruby 2.4, terima kasih :)mod 666013
?Japt ,
2018 byteDisimpan 2 byte berkat produk ETH.
Cobalah online!
sumber
f_¥Zw}
, seperti_
kependekan dariZ{Z
á fêS â l %666013
akan menghemat satu byte.MATL, 13 byte
Cobalah di MATL Online
Penjelasan
sumber
CJam , 19 byte
Cobalah online!
Penjelasan:
sumber
Ohm, 17 byte
Penjelasan:
sumber
PHP, 182 Bytes
Versi Online
Kerusakan
sumber