pengantar
Tantangan ini adalah tentang tiga algoritma penyortiran (buruk):, Bogosort
dan dua varian lainnya yang saya buat (tetapi mungkin telah dipikirkan oleh orang lain pada suatu saat): Bogoswap
(AKA Bozosort) dan Bogosmart
.
Bogosort
bekerja dengan mengocok array secara acak dan memeriksa apakah array tersebut diurutkan (menaik). Jika tidak, ulangi.
Bogoswap
bekerja dengan memilih dua elemen, secara acak, dan menukarnya. Ulangi sampai diurutkan (menaik).
Bogosmart
bekerja dengan memilih dua elemen, secara acak, dan hanya menukar mereka jika itu membuat array lebih dekat untuk diurutkan (menaik), yaitu. jika elemen dengan indeks lebih rendah pada awalnya lebih besar dari pada yang lebih tinggi. Ulangi sampai diurutkan.
Tantangan
Tantangan ini mengeksplorasi efisiensi (atau kurangnya) masing-masing dari ketiga algoritma penyortiran ini. Kode golf akan
menghasilkan 8 elemen array shuffled bilangan bulat 1-8 inklusif (terus membaca untuk melihat bagaimana Anda harus melakukan ini);
terapkan setiap algoritma ke larik ini; dan
menampilkan array asli, diikuti oleh jumlah perhitungan yang diperlukan untuk masing-masing algoritma, dipisahkan oleh satu spasi (trailing space ok), dalam format
<ARRAY> <BOGOSORT> <BOGOSWAP> <BOGOSMART>
.
Program ini akan menghasilkan 10 kasus uji; Anda dapat menghasilkan semua sepuluh di awal atau menghasilkan satu per satu, apa pun. Contoh output di bawah ini.
Detail:
Sebab Bogosort
, harus mencatat berapa kali array dikocok.
Sebab Bogoswap
, harus mencatat jumlah swap yang dilakukan.
Sebab Bogosmart
, harus mencatat jumlah swap yang dilakukan.
Contoh output:
87654321 1000000 100 1
37485612 9050000 9000 10
12345678 0 0 0
28746351 4344 5009 5
18437256 10000 523 25
15438762 10000 223 34
18763524 58924 23524 5
34652817 9283 21 445
78634512 5748 234 13
24567351 577 24 34
Saya mengarang angka-angka ini; tentu saja, program Anda akan mencetak keluaran yang berbeda tetapi dalam format yang sama.
Aturan
- Semua keacakan yang digunakan dalam program Anda harus berasal dari generator nomor pseudorandom yang tersedia untuk Anda, dan jika tidak dihitung secara luas oleh Anda. Anda tidak perlu khawatir tentang benih.
- Tidak ada batasan waktu pada program.
- Array harus diurutkan secara naik.
- Ruang tertinggal atau baris baru ekstra bukan masalah besar.
- Sebab
Bogosort
, array akan dikocok menggunakan algoritma pengocokan tidak bias seperti Fisher-Yates atau Knuth Shuffling , yang secara eksplisit ditentukan dalam penjelasan Anda. Metode pengocokan bawaan tidak diizinkan. Buat array pengujian Anda dengan cara yang sama. - Jika setelah mengocok atau menukar array tetap sama, itu masih dihitung dan harus dimasukkan dalam hitungan program. Misalnya, mengocok array ke dirinya sendiri secara kebetulan dianggap sebagai acak, dan menukar elemen dengan dirinya sendiri dianggap sebagai swap, meskipun tidak ada operasi yang mengubah array.
- Jika ingatanku benar, array 8 elemen seharusnya tidak terlalu lama untuk salah satu dari ketiga algoritma. Bahkan, saya pikir beberapa kali untuk elemen array 10, ketika saya mencobanya,
Bogoswap
hanya diperlukan beberapa ribu (atau kurang) mengocok aktual dan jauh di bawah 10 detik. - Kode Anda harus benar-benar mengurutkan array, jangan hanya memberikan nilai yang diharapkan atau perhitungan matematis untuk jawaban yang diharapkan.
- Ini adalah tantangan kode-golf, jadi program terpendek dalam byte menang.
Berikut adalah beberapa langkah sampel untuk setiap algoritma pengurutan:
BOGOSORT
56781234
37485612
28471653
46758123
46758123
12685734
27836451
12345678
BOGOSWAP
56781234
16785234
17685234
12685734
12685743
12685734
12485763
12385764
12385764
12345768
12345678
BOGOSMART
56781234
16785234
12785634
12785364
12785364
12385764
12385674
12345678
Dalam hal ini, program akan menampilkan 56781234 7 10 7
, dan kemudian melakukan hal yang sama 10 kali. Anda tidak harus mencetak array saat pengurutan sedang berlangsung, tetapi saya memberikan langkah-langkah sampel di atas sehingga Anda dapat memahami bagaimana setiap algoritma bekerja dan bagaimana cara menghitung perhitungan.
Jawaban:
Pyth,
6260 byteIni sangat menyenangkan. Tidak yakin apakah ini valid, saya mungkin menggunakan beberapa celah tidak tertulis.
Output sampel akan menjadi:
Penjelasan:
Fungsi shuffle saya menggunakan fungsi bawaan
order-by
. Pada dasarnya saya menetapkan setiap elemen daftar sejumlah acak interval[0-1)
dan mengurutkan daftar oleh mereka. Ini memberi saya acak acak tidak bias.Lingkaran luar
Di
VT
awal mengulang kode berikut 10 kali.Persiapan
Bogosort
Bogoswap
Bogosmart
Pencetakan
sumber
=JXJO.cJ2)
sama dengan=XJO.cJ2)
- penambahan tugas. Sama berlaku untuk=bXb
nanti. Juga, saya pikir swap seharusnya memiliki pasangan yang dipilih dengan penggantian (.C
).c
atau.C
tidak. Misalnya.C[3 1 2)2
tidak mengembalikan pasangan[2, 1]
. Yang merupakan properti, yang saya eksploitasi dalam algoritma saya.*JJ
kemudian? Ini juga satu karakter lebih pendek, yang bagus.JavaScript ( ES6 ), 319
345Tidak mengherankan ini cukup lama.
Untuk Acak acak, kredit ke @ core1024 (lebih baik dari milikku untuk chellenge yang sama)
Tes menjalankan cuplikan (Firefox hanya seperti biasanya)
sumber