Anda diberi string, yang akan berisi karakter az biasa. (Anda dapat mengasumsikan ini akan selalu menjadi kasus dalam tes apa pun, dan menganggap bahwa semua huruf juga huruf kecil). Anda harus menentukan berapa banyak kombinasi unik yang dapat dibuat dari masing-masing karakter dalam string, dan mencetak nomor itu.
Namun, surat duplikat dapat diabaikan dalam menghitung kemungkinan kombinasi. Dengan kata lain, jika string yang diberikan adalah "halo", maka hanya beralih posisi dua l
s tidak dihitung sebagai frasa unik, dan karena itu tidak dapat dihitung terhadap total.
Kemenangan jumlah byte terpendek, menanti untuk melihat beberapa solusi kreatif dalam bahasa non-golf!
Contoh:
hello -> 60
aaaaa -> 1
abcde -> 120
Jawaban:
Python 2 ,
5048 byteCobalah online!
Tidak ada built-in yang membosankan! Yang mengejutkan saya, ini bahkan lebih pendek daripada pendekatan brute force, menghitung semua permutasi dengan
itertools
dan mengambil panjangnya.Fungsi ini menggunakan rumus
dan menghitungnya dengan cepat. Faktorial dalam pembilang dihitung dengan mengalikan dengan
len(s)
dalam setiap pemanggilan fungsi. Penyebutnya sedikit lebih halus; dalam setiap panggilan, kami membaginya dengan jumlah kemunculan elemen dalam apa yang tersisa dari string, memastikan bahwa untuk setiap karakterc
, semua angka antara 1 dan jumlah kemunculanc
(inklusif) akan dibagi dengan tepat sekali. Karena kami hanya membagi di bagian paling akhir, kami dijamin tidak akan memiliki masalah dengan pembagian lantai standar Python 2.sumber
05AB1E , 3 byte
Cobalah online!
Penjelasan
sumber
CJam , 4 byte
Cobalah online!
Penjelasan
Baca baris sebagai string (
l
), permutasi unik sebagai array string (e!
), length (,
), tampilan implisit.sumber
R ,
6965 byteCobalah online!
4 byte disimpan berkat Zahiro Mor di kedua jawaban.
Menghitung koefisien multinomial secara langsung.
R ,
7268 byteCobalah online!
Menggunakan fungsi distribusi multinomial yang disediakan oleh
dmultinom
untuk mengekstrak koefisien multinomial.Perhatikan bahwa golf (biasa)
x<-table(strsplit(s,""))
tidak berfungsi di dalamdmultinom
panggilan untuk alasan yang tidak diketahui.sumber
function(s,
!=factorial)(!nchar(s))/prod(!table(strsplit(s,"")))
akan bekerja. el () redupant - tabel tahu untuk mencari elemen ....JavaScript (Node.js) , 49 byte
t=t*
digunakan alih-aliht*=
untuk menghindari kesalahan pembulatan (pembulatan ke|t
bawah angka) sebagait=t*
jaminan bahwa semua hasil antara (berdasarkan operator) adalah bilangan bulat.Cobalah online!
sumber
t=t*
jika Anda ingin menghindari itu.)aaadegfbbbccc
persis karena kesalahan pembulatan titik-mengambangAPL (Dyalog Unicode) , 14 byte
Cobalah online!
Mengembalikan hasilnya sebagai singleton.
sumber
⍴
->≢
untuk membuatnya mengembalikan skalar sederhana,÷⍨/g⌸,g←!⊢∘≢
untuk -2Japt ,
53 byte-2 byte terima kasih kepada @Shaggy
Cobalah online!
sumber
â
.J ,
15, 14 byteCobalah online!
-1 byte terima kasih kepada FrownyFrog
sumber
~.
bisa=
Jelly , 4 byte
Cobalah online!
Cukup lakukan apa yang diminta: temukan permutasi input, uniquify, dan cetak panjangnya.
sumber
C # (Visual C # Interactive Compiler) , 59 byte
Port dari jawaban Python 2 dari @ArBo .
Cobalah online.
sumber
Brachylog , 3 byte
Cobalah online!
pᵘl
melakukan hal yang persis sama.sumber
Python 2 , 57 byte
Cobalah online!
Mendokumentasikan sendiri: Mengembalikan panjang himpunan permutasi unik dari string input.
Python 3 , 55 byte
Kredit jatuh ke ArBo untuk yang satu ini:
Cobalah online!
sumber
APL (Dyalog Unicode) , 24 byte
Cobalah online!
Dfn sederhana, mengambil string sebagai argumen.
Bagaimana:
sumber
Ruby , 41 byte
Cobalah online!
sumber
to_a
f=
bagian tersebut. (Di TIO pindahkan ke Header untuk tidak dihitung.)Perl 5 , 43 byte
Menggunakan metode dalam jawaban Python @ ArBo.
Cobalah online!
sumber
Perl 6 ,
3330 karakter (3431 byte)Whatever
Blok lurus ke depan .comb
memecah string menjadi huruf,permutations
mendapatkan semua kemungkinan kombinasi. Karena cara pemaksaan yangSet
perlujoin
diedit terlebih dahulu (»
berlakujoin
untuk setiap elemen dalam daftar).Cobalah online!
(jawaban sebelumnya digunakan
.unique
tetapiSet
menjamin keunikan, dan menghitung sama, sehingga menghemat 3).sumber
K (oK) , 12 byte
Larutan:
Cobalah online!
Penjelasan:
Menggunakan oK built-in
prm
:... yang, karena pada
x^/:x
dasarnya menghasilkan permutasi dari"helo"
tidak"hello"
, maka kita perlu menghasilkan permutasi0 1 2 3 4
, menggunakannya untuk mengindeks ke dalam"hello"
dan kemudian mengambil hitungan unik.sumber
!-n
. pada akhir k5 dan k6 menjadiprm
. k7 (shakti)prm
juga demikian.Java 8,
103102 bytePort dari jawaban Python 2 dari @ArBo .
-1 byte terima kasih kepada @ OlivierGrégoire dengan membuatnya berulang bukan rekursif.
Cobalah online.
Sebenarnya menghasilkan semua permutasi unik dalam Set dan mendapatkan ukurannya akan menjadi 221 byte :
Cobalah online.
sumber
s->{int r=1,i=s.length();for(;i>0;)r=r*i/~-s.substring(--i).split(s.charAt(i)+"",-1).length;return r;}
.s->{long r=1,i=s.length();for(;i>0;)r=r*i/(s.chars().skip(--i).filter(c -> c==s.charAt(i)).count()+1);return r;}
tetapi sejauh ini tidak berhasil ...MATL , 9 byte
Cobalah online!
Penjelasan:
sumber
j
menjadii
, yang dapat dibiarkan implisit. Juga,&nx
simpan byte lebih dariZy1)
tio.run/##y00syfn/P9IholQtr@L/f/WM1JycfHUAOktaf / MATLAB, 35 byte
Fungsi anonim yang mengambil vektor karakter dan menghasilkan angka.
Dalam MATLAB ini dapat disingkat menjadi
size(unique(perms(s),'ro'),1)
(33 byte).Cobalah online!
Penjelasan
sumber
unique
kembali baris unik? Atau hanya untuktable
s?unique
akan linierisasi dulu. Untuk tabel saya pikir Anda benar; Saya tidak tahu itu!unique
di MATLAB mengambil baris untuktables
; R'sunique
mengambil deretan matriks atau bingkai data yang unik. Terlalu banyak bahasa array dengan perintah yang sama yang melakukan hal-hal yang sedikit berbeda ...Retina 0.8.2 , 73 byte
Cobalah online! Menggunakan rumus @ ArBo, tetapi mengevaluasi dari kanan ke kiri karena hal ini dapat dilakukan dalam aritmatika bilangan bulat sambil tetap meminimalkan ukuran nilai unary yang terlibat. Penjelasan:
Untuk setiap karakter, hitung berapa banyak sisa duplikat yang ada dan berapa banyak karakter selanjutnya, tambahkan satu untuk masing-masing untuk memperhitungkan karakter saat ini, dan pisahkan nilainya sehingga kita tahu mana yang harus dibagi dan mana yang akan dikalikan .
Awali 1 untuk menghasilkan ekspresi lengkap.
Lipat gandakan angka terakhir terakhir dan ketiga sambil membaginya dengan angka terakhir kedua. Ini menggantikan tiga angka terakhir.
Konversikan ke desimal.
sumber
K, 27 byte
K, 16 byte - bukan jawaban yang nyata
Ambil 999999 permutasi acak dari string input, ambil set unik dan hitung panjangnya. Sebagian besar waktu itu akan memberikan jawaban yang benar, untuk string pendek.
Peningkatan berkat @Sriotchilism O'Zaic, @Selcuk
sumber
999999
alih-alih100000
?Bahasa Wolfram (Mathematica) , 32 byte
Cobalah online!
Penjelasan: Komposisi kanan dengan
/*
menerapkan tiga operator ini satu demi satu ke argumen fungsi, dari kiri ke kanan:Characters
mengubah string input ke daftar karakter.Permutations
membuat daftar semua permutasi unik dari daftar karakter ini.Length
mengembalikan panjang daftar permutasi unik ini.Metode ini sangat boros untuk string panjang: permutasi unik sebenarnya terdaftar dan dihitung, alih-alih menggunakan a
Multinomial
untuk menghitung nomor mereka tanpa daftar.sumber
F # (Mono) , 105 byte
Cobalah online!
sumber
Pyth ,
54 byteCobalah online!
Ini menganggap input adalah string python literal. Jika input harus berupa teks mentah, versi 5-byte ini akan berfungsi:
Either way, itu hanya menghitung semua permutasi input sebagai daftar, mendupuplikasinya dan mendapatkan jumlah elemen di dalamnya, dan secara implisit mencetak angka itu.
-1 byte terima kasih kepada @ hakr14
sumber
{
deduplicates daftar untuk satu byte kurang dari.{
.J ,
1413 byteCobalah online!
1 byte berkat mil
sumber
#(%*/)&:!#/.~
harus menyimpan byte lainPHP , 77 byte
Cobalah online!
Ini pada dasarnya hanya sebuah port PHP dari jawaban Python @ ArBo yang menang yang jauh lebih pintar daripada jawaban rekursif yang awalnya saya miliki. Bravo!
sumber
Ohm v2 , 4 byte
Cobalah online!
Penjelasan
sumber
Stax , 3 byte
Jalankan dan debug itu
sumber