Siapa yang tidak benar-benar menyukai permutasi, bukan? Saya tahu, mereka luar biasa –– sangat menyenangkan!
Nah, mengapa tidak bersenang-senang ini dan membuatnya lebih lucu ?
Inilah tantangannya:
Diberikan input dalam bentuk yang tepat:, di nPr
mana n
pool diambil dari dan r
jumlah seleksi dari pool itu ( n
dan r
adalah bilangan bulat), output / kembalikan jumlah permutasi yang tepat. Bagi Anda yang agak berkarat dengan terminologi: Permutasi, def. 2a .
Namun, di sinilah tantangannya bermain (membuatnya tidak terlalu mudah):
Anda tidak dapat menggunakan pustaka, kerangka kerja, atau metode bawaan apa pun untuk fungsi permutasi Anda. Anda tidak boleh menggunakan metode faktorial, metode permutasi, atau semacamnya; Anda harus menulis semuanya sendiri.
Jika diperlukan klarifikasi lebih lanjut, jangan ragu untuk memberi tahu saya di komentar dan saya akan segera bertindak sesuai.
Berikut ini adalah contoh I / O:
Fungsi sampel adalah permute(String) -> int
Memasukkan:
permute("3P2")
Keluaran:
6
Ini kode-golf, jadi kode terpendek menang!
sumber
split
untuk membagi input diP
? Bagaimana dengan fungsi yang mengubah string menjadi angka?0 <= r <= n
?Jawaban:
CJam,
1514 byteCobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
Perl, 27 byte
Menghitung shebang sebagai 4, input diambil dari stdin.
Contoh Penggunaan
sumber
l61
?$\
ke1
(char 49, octal 61).Haskell,
7166 byteHal-hal yang cukup mudah: pisah di 'P' lalu bawa produk antara (n-k + 1) dan n.
Berkat nimi karena idenya menggunakan pengawal pola daripada
where
klausa, itu mengurangi 5 byte.sumber
Minkolang 0,11 ,
132519 byteTerima kasih kepada Sp3000 untuk menyarankan ini!
Coba di sini.
Penjelasan
Ini menggunakan algoritma yang sama dengan Alex:
n P k
=n(n-1)(n-2)...(n-k+1)
.sumber
Julia,
635848 byteIni menciptakan fungsi tanpa nama yang menerima string dan mengembalikan integer. Untuk menyebutnya, berikan nama, mis
f=s->...
.Tidak Disatukan:
Ini menggunakan fakta bahwa jumlah permutasi adalah n ( n -1) ( n -2) ... ( n - k +1).
Disimpan 10 byte berkat Glen O!
sumber
Int
, jadi Anda bisa menggunakannyamap(parse,...)
.Int
itu perlu dalam situasi itu. Terima kasih banyak!Utilitas Bash + Linux, 33
jot
menghasilkan urutanr
bilangan bulat mulai darin-r+1
, dan memisahkannya dengan*
. Ungkapan ini disalurkan kebc
untuk evaluasi aritmatika.sumber
MATLAB, 54 byte
Mencoba membuatnya lebih kecil, tetapi salah satu hal yang benar-benar buruk dari MATLAB adalah mendapatkan input. Dibutuhkan 32 karakter hanya untuk mendapatkan dua angka dari string input!
Kode penjelasan cukup jelas. Dapatkan input dalam bentuk di
%dP%d
mana% d adalah bilangan bulat. Pisahkan itu menjadin
danr
. Kemudian tampilkan produk dari setiap bilangan bulat dalam kisarann-r+1
ken
. Menariknya ini bekerja bahkan untukxP0
memberikan jawaban yang benar dari 1. Ini karena dalam MATLABprod()
fungsi mengembalikan 1 jika Anda mencoba dan melakukan produk dari array kosong. Setiap kalir
nol, rentang akan menjadi array kosong, jadi bingo kita dapatkan 1.Ini juga berfungsi sempurna dengan Oktaf juga. Anda dapat mencobanya online di sini .
sumber
Javascript,
5957 bytesumber
Java (594 - byte)
sumber
J, 23 byte
Fungsi anonim. Contoh:
Penjelasan:
Fungsi stope yang saya gunakan mungkin berbatasan dengan penghitungan sebagai built-in ... Itu terletak di suatu tempat antara generalitas operator multiplikasi dan spesifisitas operator faktorial.
sumber
APL, 23
Mengambil string sebagai argumen. Penjelasan:
sumber
⎕ML←3
di Dyalog.Python 2, 66
Cukup mudah. Memproses input angka sebagai
a,b
. Mempertahankan produk yang berjalan sebagaiP
, yang dikalikan denganb
persyaratan pertamaa, a-1, a-2, ...
.sumber
input()
tidak dapat menghasilkan kesalahan."3P2"
, yang saya pikir biasanya diperbolehkan, tetapi di sini tantangannya mengatakan "input dalam bentuk yang tepat", jadi saya mengubahnya menjadi fungsi yang membutuhkan string.TI-BASIC, 52 byte
TI-BASIC memiliki fungsi "produk daftar", jadi mengatasi batasan pada builtin tidak terlalu sulit. Namun, TI-BASIC tidak mendukung daftar kosong — jadi kami perlu
Untuk mengekstrak dua angka, saya mengekstrak angka pertama sebagai substring. Ini mahal ; itu mengambil seluruh baris kedua. Agar tidak perlu melakukan ini lagi untuk nomor kedua, saya mengatur variabel P ke nomor itu, dan mengevaluasi seluruh string menggunakan
expr(
, kemudian bagi dengan P².Akhirnya, saya mengambil permutasi acak daftar antara dua angka (berhati-hati untuk menambahkan satu ke nomor kedua) dan mengambil produk.
sumber
Ouroboros ,
4745 byteBeberapa di antaranya sangat jelek - saya membayangkan bisa bermain golf lebih jauh.
Setiap baris kode di Ouroboros mewakili ular yang memakan ekornya.
Ular 1
S
beralih ke tumpukan bersama.r.r
membaca satu angka, menduplikatnya, dan membaca yang lain. (Karakter non-numerik sepertiP
dilewati.)-
Kurangi keduanya. Jika input tadi7P2
, sekarang kita miliki7
,5
pada stack bersama. Akhirnya,1(
makan karakter terakhir ular. Karena ini adalah karakter tempat penunjuk instruksi aktif, ular mati.Ular 2
)s
tidak melakukan apa pun pertama kali melalui..!+
menduplikasi bagian atas tumpukan ular 2, memeriksa apakah nol, dan jika demikian menambahkan 1. Pada iterasi pertama, tumpukan kosong dan diperlakukan seolah-olah mengandung nol tanpa batas, jadi ini mendorong1
; pada iterasi selanjutnya, stack berisi nilai bukan nol dan ini tidak berpengaruh.Selanjutnya,
S
beralih ke tumpukan bersama, di mana kita memiliki nomorn
dan penghitung untuk menghitung produk.1+
menambah konter..@@.@\<!
menduplikasi kedua angka dan mendorong 1 jikan
masih lebih besar atau sama dengan penghitung, 0 sebaliknya.@@*Y
kemudian mengalikan penghitung dengan kuantitas ini dan menarik salinannya ke tumpukan ular 2.s.!+
beralih kembali ke tumpukan snake 2 dan menggunakan kode yang sama seperti sebelumnya untuk mengubah angka teratas menjadi 1 jika 0 dan tetap sama jika tidak. Kemudian*
gandakan hasilnya dengan produk parsial yang ada di tumpukan ini.Kami sekarang kembali ke tumpukan bersama (
S
), menduplikasi penghitung-atau-nol (.
), dan meniadakannya dua kali (!!
) untuk mengubah penghitung nol ke 1.4*.(
mengalikan ini dengan 4, duplikat, dan makan yang banyak karakter dari ujung ular.(
dimakan, dan kontrol loop sekitar ke awal kode. Di sini)
memuntahkan empat karakter,s
beralih kembali ke tumpukan 2 ular, dan eksekusi berlanjut.n
, kami memiliki 0 di tumpukan, dan tidak ada yang dimakan.sn
beralih ke tumpukan ular 2 dan menampilkan nilai teratas sebagai angka; lalu1(
makan karakter terakhir dan mati.Hasilnya adalah produk
(r+1)*(r+2)*...*n
dihitung dan diproduksi.Cobalah
Tampilkan cuplikan kode
sumber