Input: urutan huruf besar (ASCII [65; 90]) yang merupakan permutasi leksikografis ke- N dari multiset karakternya
* permutasi diberi nomor dari 0 atau 1 ke atas
Output: basis-10 integer N
Rulez
- Mungkin ada duplikat (itulah sebabnya tantangan ini berbeda dari yang ini )
- Karakter diperintahkan oleh nilai ASCII mereka
- Dalam hal input dengan panjang kurang dari atau sama dengan 1, input adalah permutasi pertama dan hasilnya masing
0
-1
masing - Permutasi pertama adalah di mana karakter paling kiri memiliki nilai terendah, karakter paling kanan memiliki nilai tertinggi, dan urutan karakter antara karakter pertama dan terakhir adalah permutasi pertama dari multiset karakternya (definisi rekursif!)
- Entri terpendek menang
Contoh
- Input
AAB
menghasilkan output0
- Input
ABA
menghasilkan output1
- Input
BAA
menghasilkan output2
- Input
ZZZ
menghasilkan output0
- Input
DCBA
menghasilkan output23
EDIT
Kudos ekstra untuk orang yang dapat menemukan solusi yang tidak menghasilkan semua permutasi dan kemudian mencari input. Itu beberapa tantangan.
code-golf
permutations
kyrill
sumber
sumber
zzz
dandcba
bukan huruf besar.Jawaban:
Jelly , 5 byte
Cobalah online!
Output 1-diindeks.
sumber
Python 2, 69 byte
Cobalah online
sumber
Python,
302287 byteDead Possum telah memposting solusi Pythonic pendek, jadi saya memutuskan untuk mencari pujian tambahan. Solusi ini tidak menghasilkan semua permutasi. Ini dapat dengan cepat menghitung indeks permutasi string yang agak besar; itu juga menangani string kosong dengan benar.
Kode pengujian:
keluaran
Versi non-golf:
Tentang
lexico_permute_string
Algoritma ini, karena Narayana Pandita, berasal dari https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order
Untuk menghasilkan permutasi berikutnya dalam urutan leksikografis
a
FWIW, Anda dapat melihat versi beranotasi dari fungsi itu di sini .
FWIW, inilah fungsi terbalik.
keluaran
Dan inilah fungsi yang saya tulis saat mengembangkan
perm_unrank
yang menunjukkan pengelompokan sub-bagian.keluaran
sumber
z=0
dan pengganti dit[0]
dant[1:]
di mana mereka digunakan (saat inih
dant
) untuk menyimpan 8 byte.True
nilai 1 atau lebih rendah, tapi saya pikir dengan kode Anda yang seharusnya baik-baik saja?f=lambda n:n<2or n*f(n-1)
05AB1E , 5 byte
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
05AB1E , 5 byte
Cobalah online!
Ditemukan secara independen dari jawaban Adnan.
sumber
PHP, 124 Bytes
PHP, 136 Bytes
Versi Online
Jalankan dengan
Hitung dengan faktorial
Versi yang Diperluas
Output untuk string PPCG
Versi Online
sumber
print+$n´ with ´die("$n")´ and the loop will stop after the permutation is found. And I must add
$ n = 0` dalam loop kemudian para pemain untuk integer bekerja tidak dalam perubahan iniJulia,
121125 byteTidak bersaing, karena tidak berurusan dengan surat duplikat dengan benar. Saya porting ini dari bahasa lain, dari bagian dari solusi untuk masalah Project Euler yang saya lakukan beberapa tahun yang lalu, dan yang pertama, versi 121-byte memiliki bug karena saya telah mengubah penggunaan string yang di-permutasi dan referensi kanonik yang diurutkan dan diurutkan. tali.
Untuk input besar, versi ini menggunakan bignum dengan biaya 8 byte tambahan:
Tidak Terkumpul:
Menggunakan sistem angka factoriadic , qv Jadi, itu tidak menghasilkan semua permutasi dan untuk input besar akan berjalan jauh lebih cepat daripada yang melakukannya.
Sebagai contoh, alfabet dapat diubah menjadi kalimat yang agak dibuat-buat, "Pekerjaan mesin pencari kuarsa yang membuat cemas." Kalimat itu adalah 259.985.607.122.410.643.097.474.123 permutasi leksikografis dari huruf-huruf alfabet. (Kira-kira 260 septillionth permutasi.) Program ini menemukan bahwa sekitar 65 μs pada mesin saya.
Perhatikan bahwa nomor berakhir pada ... 122 daripada ... 123 karena OP meminta agar permutasi diberi nomor dari 0 daripada dari 1.
Julia, 375 byte
Saya telah meninggalkan lekukan untuk dibaca, tetapi jumlah byte tanpa itu.
Yang ini hanyalah port Julia langsung dari solusi Python brilian PM 2Ring. Saya merasa lapar, jadi saya memutuskan bahwa saya menginginkan kue itu. Sangat menarik untuk melihat persamaan dan perbedaan antara kedua bahasa. Saya menerapkan
itertools.groupby
(dalam bentuk terbatas) sebagaig(w)
.Tapi logikanya bukan milikku, jadi pergi dan pilih jawaban PM 2Ring .
Ganti
f=factorial
denganf(x)=factorial(BigInt(x))
jika Anda ingin dapat menangani input besar seperti p ("QUARTZGLYPHJOBVEXDCWMFINKS").sumber
BAA
- yang diharapkan2
, aktual3
.MATL ,
131211 byte1 byte disimpan berkat GB !
Output berbasis 1.
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
q
benar?Mathematica,
3331 byteMengubah spec masalah memungkinkan penghematan 2 byte.
Fungsi murni mengambil daftar sebagai input dan mengembalikan bilangan bulat negatif
N
dalam formulir{{N}}
.sumber
-1
.JavaScript (ES6), 130 byte
Kurang golf
Uji
sumber
CJam , 7 byte
Cobalah online!
sumber
Pyth, 5 byte
Penerjemah online
Mengambil input yang dikutip.
sumber
'BAA'
harus kembali2
karena ini tidak diindeks, tetapi4
sebaliknya dikembalikan .Scala, 40 byte
Untuk menggunakannya, tetapkan fungsi ini ke variabel:
Cobalah online di ideone
Sayangnya,
permutations
mengembalikan iterator, yang tidak memilikisorted
metode, jadi harus dikonversi ke aSeq
sumber
C ++, 96 byte
Kita dapat memanfaatkan sepenuhnya pustaka standar di sini. Daftar huruf dilewatkan sebagai iterator awal / akhir dalam gaya C ++ standar.
Kami tidak perlu membuat semua permutasi - karena kami memiliki transformasi dari satu permutasi ke pendahulunya, kami hanya menghitung berapa banyak iterasi yang diperlukan untuk mencapai nilai nol.
Program uji:
Hasil tes:
sumber
Japt, 6 byte
Diindeks 0
Cobalah
sumber
Ruby, 50 byte
Saya berharap ini lebih pendek. Saya tidak akan menambahkan
sort
jika dokumen tidak mengatakan "implementasi tidak memberikan jaminan tentang urutan permutasi yang dihasilkan."sumber