Catatan: Pertanyaan ini sangat diedit sejak saya pertama kali diposting di sini. Peraturan dipindahkan ke sini , membacanya sebelum memposting jawaban untuk memahami tujuan ini. Ini adalah pertanyaan pertama yang dibuat dalam kategori trolling kode .
Bayangkan seorang pengguna yang malas di Stack Overflow menanyakan pertanyaan ini:
Saya membutuhkan program di mana pengguna memasukkan array ganda dan program output array diurutkan. Bisakah Anda memberikan kodenya?
Bagaimana Anda bisa membuat sepotong kode yang akan menjebak pengguna ini? Buat sepotong kode yang akan berguna bagi programmer yang tidak berpengalaman tetapi sama sekali tidak berguna dalam praktiknya.
Pemenangnya adalah jawaban yang paling banyak dipilih, kecuali jika jawabannya entah bagaimana tidak memenuhi syarat (untuk persyaratan yang memenuhi syarat, lihat deskripsi wiki tag tentang kode-trolling ). Jika jawaban yang paling banyak dipilih sebelumnya dikalahkan di kemudian hari dalam jumlah upvotes setelah diterima, jawaban terbaik yang baru diterima dan yang sebelumnya tidak diterima. Dalam hal seri, saya akan memilih pemenang sesuka hati di antara yang terikat atau hanya menunggu sedikit lagi.
Jawaban yang tidak memiliki kode tidak memenuhi syarat. Mereka mungkin menyenangkan dan mendapatkan beberapa perbaikan, tetapi mereka tidak akan diterima.
Aturan dapat ditemukan di deskripsi tag .
Catatan: Ini adalah pertanyaan troll kode . Tolong jangan menganggap pertanyaan dan / atau jawaban dengan serius. Informasi lebih lanjut di sini .
sumber
Jawaban:
Terkadang komunitas di sini tidak suka membantu pekerjaan rumah. Itu sebabnya Anda mendapatkan begitu banyak jawaban lelucon. Tapi saya suka membantu. Berikut ini adalah solusi lengkap dalam 'C' (karena saya menganggap Anda ingin belajar "pemrograman", bukan "scripting" dengan Java atau Ruby). Saya sudah memasukkan banyak tips yang saya harap saya tahu ketika saya pertama kali belajar
sumber
1st, 2th, 3th, 4th...
dan operator downto - teknik pemrograman C yang sangat canggih.sscanf(input, "%5s", &input[0])
, jika tidak mungkin ada bug overrun saat mengurai input. Dan input harus dinyatakanchar input[sizeof(int)+1]
, untuk kompatibilitas ke belakang dengan sistem 64-bit.i==1?"st":"th"
hahaha ...Ini dia di java. Ini sangat curang, tidak dapat diterima dan tidak dapat diperbaiki karena menciptakan database MySQL, memasukkan nomor di sana, melakukan pemilihan dengan klausa ORDER BY dan menampilkan angka-angka yang diberikan oleh MySQL. Faktanya, MySQL yang melakukan penyortiran, bukan program.
sumber
C # - Tidak ada pembunuhan seperti pembunuhan yang berlebihan
Pertama-tama, GiMmEtHaCoDeZ yang terhormat, mari kita coba untuk menjabarkan tugas Anda:
Karena "Membagi dan menaklukkan" adalah strategi yang sangat penting ketika bekerja dengan masalah perangkat lunak, mari kita atasi satu per satu
1. Membaca
Masalah penting lainnya dalam perangkat lunak adalah fleksibilitas. Karena tidak ditentukan bagaimana pengguna akan memasukkan angka, itu bisa terjadi melalui konsol, melalui file, melalui layanan web, dll. Mungkin bahkan beberapa metode yang tidak dapat kita pikirkan saat ini. Jadi, penting bahwa solusi kami akan dapat mengakomodasi berbagai jenis input. Cara termudah untuk mencapai itu adalah mengekstraksi bagian penting ke antarmuka, katakanlah
di mana
DoubleArrayReaderType
pencacahan diberikan denganPenting juga untuk membuat perangkat lunak dapat diuji dari bawah ke atas, sehingga implementasi antarmuka akan dilakukan
Selanjutnya, pertanyaan logisnya adalah bagaimana kita akan tahu memuat yang sesuai
IDoubleArrayReader
ke dalam kode. Itu mudah asalkan kita menggunakan pabrik sederhana:Perhatikan bahwa, kami menggunakan refleksi untuk memuat semua pembaca aktif, sehingga ekstensi apa pun di masa mendatang akan tersedia secara otomatis Sekarang, di tubuh utama kode tidak aktif yang baru saja kita lakukan:
2. Memproses (menyortir)
Sekarang kita perlu memproses, yaitu mengurutkan angka yang telah kita dapatkan. Perhatikan bahwa langkah-langkahnya benar-benar independen satu sama lain, jadi untuk subsistem pengurutan, tidak masalah bagaimana angka-angka itu dimasukkan. Selain itu, perilaku penyortiran juga merupakan sesuatu yang dapat berubah, misalnya kita mungkin perlu memasukkan algoritma penyortiran yang lebih efisien. Jadi, tentu saja, kami akan mengekstrak perilaku pemrosesan yang diminta dalam antarmuka:
Dan perilaku penyortiran hanya akan mengimplementasikan antarmuka:
Tentu saja, kita akan membutuhkan pabrik untuk memuat dan mengelola instance pemrosesan.
3. Menulis output
Tidak banyak yang bisa dikatakan di sini, karena ini adalah proses yang mencerminkan input. Bahkan, kita bisa menggabungkan pabrik baca dan tulis menjadi satu
DoubleArrayInputOutputFactory
, seperti ini:Menyatukan semuanya
Akhirnya, program utama kami hanya akan menggunakan semua kehebatan yang telah kami bangun, jadi kodenya adalah:
di mana, misalnya kita dapat mendefinisikan
reader
,writer
danprocessor
menggunakansumber
Penafsiran yang lebih harfiah:
yaitu, "array" diurutkan.
sumber
sort.sh
dan panggil sebagaish sort.sh "an array of doubles"
"an array of doubles"
dapat diteruskan ke skrip sebagai argumen baris perintah.Perl
Dari semua hal yang saya lakukan untuk CodeGolf.SE, ini mungkin paling lama, setidaknya beberapa jam.
Input berbentuk
[2,4,5,7,7,3]
dan output berbentuk[2,3,4,5,7,7]
.Saya tidak punya waktu untuk menjelaskan sekarang ... kembali lagi nanti.Bagaimanapun, ada sesuatu yang disebut array anonim di Perl. Ini adalah array, tetapi tidak memiliki nama. Apa yang kita ketahui, bagaimanapun, adalah referensi (lokasi memori) yang menunjuk padanya. Serangkaian angka dalam kurung siku menciptakan array anonim, dan mengembalikan referensi ke sana.
Jawaban ini dibangun dari serangkaian array anonim, referensi yang disimpan dalam
@_
. Input diubah menjadi array anonim. Kami kemudian membuat array anonim lainnya, masing-masing elemen yang merupakan referensi ke elemen dalam array sebelumnya. Alih-alih mengurutkan elemen dalam array, kami mengurutkan pointer ke elemen dalam array itu. Kami juga membuat array baru untuk setiap langkah (dan banyak lagi) dalam operasi sortir.sumber
$_
adalah string kosong pada saat itu. Saya menyimpan keluaran yang saya inginkan$\
, yang merupakan pemisah catatan keluaran.Python
Memberi pengguna array yang diurutkan dengan menghapus semua elemen yang tidak berurutan dari array input.
Algoritma berjalan melalui daftar hanya menambahkan setiap elemen jika tidak membuat daftar dibatalkan. Jadi outputnya adalah daftar yang diurutkan, hanya saja tidak ada yang berisi semua elemen dari daftar asli. Jika op hanya memeriksa apakah daftar dalam urutan diurutkan, ia mungkin tidak memperhatikan bahwa outputnya hilang nilainya.
sumber
sys.stdin.read()
salah ketik atau bagian dari jawaban trolling yang sebenarnya? Tentunya akan membuat OP frustrasi untuk memberikan array sebagai input dan terus menunggu hasilnya ...O(n)
algoritma semacam. Bagus.Bash, 54 karakter
Banyak jawaban menggunakan bahasa lambat yang tidak efisien seperti C dan Python ... mari kita mempercepat sedikit dengan menawarkan solusi pada ibu dari semua bahasa scripting: Bash.
Saya tahu apa yang Anda pikirkan - Bash bahkan tidak bisa menangani aritmatika floating point, jadi bagaimana cara memilah, kan? Nah, lihatlah, implementasi saya dari algoritma SleepSort yang perkasa:
Program ini dilengkapi dengan input sebagai argumen commandline. Contoh dijalankan:
Ini juga memiliki keunggulan mungkin yang paling pendek dari semua algoritma yang disajikan di sini. Itu benar - satu garis besar bash , hanya menggunakan bash builtin dan tidak memanggil binari eksternal (yaitu, jika Anda tidak menghitung output verbose murni opsional). Berbeda dengan bogosort, runtime-nya bersifat deterministik.
Kiat: Optimalisasi yang efektif adalah membagi angka input dengan faktor sebelum mengurutkan. Implementasi diserahkan kepada pembaca.
Sunting:
Versi golf 54-char yang diperpendek dengan pencetakan yang kurang cantik:
sumber
/proc/cpuinfo
.JavaScript memiliki
sort()
fungsi bawaan, Anda dapat menggunakannya seperti ini:... oh, benar-benar lupa menyebutkan, itu mengurutkan dalam urutan leksikografis, yaitu
10 < 9
dan9 < -100
. Mungkin memang itu yang Anda harapkan.sumber
(jPL) jQuery Programming Language
Anda harus menggunakan jQuery untuk itu. Solusi sederhana untuk masalah ini adalah yang berikut:
sumber
$
, array menggunakan,a
dan hasilwindow.prompt
asp
.C
Solusi ini menggabungkan keringkasan dan akses tingkat OS yang disediakan oleh C dengan komponen perangkat lunak yang kuat dan dapat digunakan kembali di GNU / Linux:
sumber
#!/usr/bin/sort
.Rubi
Cukup jelas.
Atau minta input untuk benar-benar menjadi "array ganda":
Tidak menggunakan
gets.chomp
kejahatan ekstra. Juga menggunakan regex setelah trailing sampai, yang merupakan sesuatu yang saya bahkan tidak tahu Anda bisa lakukan (terima kasih Jan Dvorak) untuk membuat OP lebih bingung!sumber
an array of doubles
.gets
bukangets.chomp
).Python3.3
Trolling adalah dalam memberikan solusi yang berfungsi sempurna yang melakukan persis apa yang diinginkan OP, tetapi dengan cara yaitu:
Singkatnya jawaban ini akan sangat meningkatkan frustrasi siswa mengejek permintaan mereka dengan jawaban yang benar-benar valid dari sudut pandang tertentu.
(Jangan membaca jika Anda menganggap tantangan memahami kode di atas)
Saya harus menambahkan bahwa trolling juga ditingkatkan oleh fakta bahwa algoritma sorting yang diterapkan sebenarnya
sumber
C - Lambat, sulit digunakan, gaya pengkodean tidak dapat diterima
Algoritma pengurutan itu sendiri dikenal sebagai slowsort, dan memiliki kompleksitas kasus terbaik (simpleksitas) sekitar n ^ (log n / 2) . Algoritme telah diterbitkan oleh Andrei Broder dan Jorge Stolfi dalam makalah besar mereka "Pessimal Algorithms and Simplexity Analysis" yang sangat saya rekomendasikan untuk tertawa dan makanan untuk dipikirkan.
Namun pengurutan itu sendiri tidak berguna, jadi kami membutuhkan cara bagi pengguna untuk memasukkan data yang ingin mereka urutkan. Parsing ganda adalah rasa sakit, jadi mengapa tidak memasukkan mereka byte demi byte.
Untuk membuktikan bahwa itu berfungsi:
Pada akhirnya kami memiliki:
sumber
Ruby, Bogosort jahat! (Bonus: bogosort berdasarkan input pengguna)
Liku "jahat":
.map &:to_f
ditambahkan ke baris kedua, tetapi OP mungkin tidak tahu ituchomp
sehingga nomor terakhir memiliki baris baru yang misterius di akhirstrip
sehingga ada spasi putih misterius di sekitar angka jika input dengan spasi di sekitar koma (mis. Spasi di1.5, 2
)Atau, bagaimana dengan bogosorting dengan input pengguna ?! >: D
sumber
COBOL
Tentu! "Bahkan monyet bisa melakukan ini!"
Ini adalah program COBOL sederhana yang akan mengurutkan input untuk Anda. Baca komentar untuk melihat seberapa sepele dan extensible itu. Manfaat nyata dari ini adalah bahwa ia dicoba dan mekanisme yang sebenarnya, tidak bergantung pada bahasa yang baru dan relatif belum diuji seperti Java dan apa pun berbasis web atau dari Microsoft. Ini mengkompilasi dengan sangat efektif, dan prosedur seperti ini digunakan oleh perusahaan keuangan paling sukses di Fortune500 dan para pemimpin industri lainnya. Kode ini telah ditinjau oleh banyak ahli dan diakui sebagai mekanisme penyortiran yang sangat baik.
sumber
OP tidak pernah mengatakan BAGAIMANA cara menyortirnya ... atau apa definisi rangkapnya. Dengan asumsi tipe data
double
tetapi menafsirkannya sebagai duplikat . Menggunakan JavaScript di sini.Hasil: urutan bergantian
[4, 11, 4, 9, 5, 7, 6, 7]
sumber
PHP
Berikut ini adalah implementasi penuh dengan penanganan kesalahan. Ini adalah yang tercepat untuk siapa pun
array of doubles
.sumber
Permutasi berikutnya dalam C ++ berfungsi dengan mengembalikan true ketika array diurutkan dan false sebaliknya (setelah diizinkan). Jadi Anda seharusnya mengurutkan array dan kemudian menggunakannya dalam do-while seperti di atas (sehingga akan membuat lingkaran penuh kembali ke array yang diurutkan).
sumber
next_permutation
jawaban saya, tetapi ini jauh lebih bersih daripada yang saya pikirkan.[solusi dengan penyesatan yang rumit]
Silakan baca standar yang relevan, IEC 60559: 1989 Spesifikasi untuk aritmetika titik mengambang biner untuk sistem mikroprosesor , yang dapat Anda beli di sini . Dalam catatan kaki ke §5.10 Rincian predikat totalOrder , dicatat bahwa:
Jadi kita melihat bahwa tidak mungkin untuk menulis kode untuk mengurutkan ganda. Ini pertanyaan jebakan. Ha, ha, sangat pintar! Tolong beri tahu profesor Anda, saya sangat menikmati kursusnya.
[edit: tidak ada yang mengharuskan saya untuk tidak menganggap bahwa masalah tersebut menuntut pesanan total]
sumber
JavaScript yang jahat:
OP, saya tidak ingin memberi Anda segalanya jadi saya akan membiarkan Anda mencari cara untuk mendapatkan input dari pengguna sendiri (petunjuk: gunakan
prompt
).Setelah Anda memilikinya, inilah fungsi yang bisa Anda gunakan untuk mengurutkannya. Anda hanya perlu memberikan array, nilai terendah dalam array, dan peningkatan:
Berikut adalah biola untuk melihatnya beraksi dengan input pengguna contoh [1.5, -3.5, 12, 10, -19.5].
Catatan: Selain berkinerja buruk, rumit, dan tidak dapat dipertanggungjawabkan untuk masalah yang dihadapi, ini akan sangat membuat frustasi jika OP tidak tahu tentang matematika floating point. Misalnya, jika input pengguna adalah
[8.1, 5, -.8, 2.3, 5.6, 17.9]
dan OP memilih nilai langsung (yaituminimumVal=-.8
danincrement=.1
), program akan berjalan selamanya. Pada catatan terkait, saat ini saya bangga memiliki 2 tab browser yang tidak berfungsi karena masalah ini :)Catatan II: Saya merasa menjijikkan bahkan menulis kode di atas.
Catatan III: MWA HAHAHAHA!
sumber
Inilah jawaban aktual yang saya sukai untuk Java:
Tidak ada penjelasan, membingungkan OP , tetapi berfungsi dan akan mendapatkan upvotes dari programmer yang lebih berpengalaman.
Jawaban serupa lainnya :
Secara tidak langsung mengatakan kepada OP untuk melakukan penelitian sendiri sambil memberinya jawaban yang benar-benar samar. Tanpa penelitian lebih lanjut, OP masih bingung . Saya juga suka bahwa tautannya menunjuk ke dokumentasi yang lebih lama.
sumber
Algoritma genetik / metode Monte Carlo untuk masalah penyortiran di JAVA
Masalah penyortiran dikenal untuk ilmu komputasi untuk waktu yang lama dan banyak solusi bagus telah ditemukan. Dalam beberapa tahun terakhir telah ada kemajuan besar dalam biocomputing dan melihat bagaimana pemecahan masalah biologi telah terbukti sangat membantu dalam memecahkan masalah-masalah sulit. Algoritma pengurutan ini mengambil yang terbaik dari ide-ide ini untuk menggunakannya untuk menyelesaikan masalah pengurutan. Idenya cukup sederhana. Anda mulai dengan array yang tidak berurutan dan mencari tahu bagaimana ini sudah diurutkan. Anda memberinya skor "pengurutan" dan kemudian mengubah urutan array dengan komponen acak - seperti dalam biologi di mana tidak jelas bagaimana anak-anak akan terlihat seperti bahkan jika Anda tahu semua tentang orang tua! Ini adalah bagian dari algoritma genetika. Anda membuat keturunan array yang bisa dikatakan. Kemudian Anda melihat apakah keturunannya lebih baik disortir daripada induknya (alias survival of the fittest!). Jika ini adalah kasus Anda melanjutkan dengan array baru ini sebagai titik awal untuk membangun permutasi berikutnya dan seterusnya sampai array sepenuhnya diurutkan. Hal yang keren tentang pendekatan ini adalah dibutuhkan lebih pendek, jika array sudah agak diurutkan dari awal!
Ekstra
sumber
Python
Mengurutkan array (daftar) dengan jumlah dari 3 rd dan 5 th tempat desimal.
sumber
lambda x:
dan menggantinya denganx
. Namun, seorang programmer pemula tidak akan pernah tahu itu, jadi pujian!C ++
Ini berhasil ... akhirnya.
Inilah algoritma pengurutan saya:
Inilah program lengkapnya:
sumber
Di sini, pesta mata Anda:
Sepotong kode ini menampilkan array dan meminta pengguna untuk memasukkan ganda terkecil dari array. Itu kemudian menambahkan nomor ke daftar nomor yang diurutkan, menghapus ganda dari array dan menampilkan nomor array yang tersisa.
* Salah tafsir: Titik lemah, tetapi OP tidak persis mengharapkan program untuk meminta pengguna membantu menyortir.
* Kecurangan: pengguna yang melakukan penyortiran yang sebenarnya.
* Kinerja: Setiap nomor array memerlukan pulang-pergi server, dan itu mengharuskan pengguna untuk menemukan nomor terkecil secara manual. Performa tidak bisa jauh lebih buruk.
* Tidak dapat diterima: Saya pikir saya dapat hal itu. Dan semoga berhasil menggunakannya kembali. Terburuk menjadi yang terburuk, pengguna dapat menyingkirkan 90% kode dan mengulanginya berulang-ulang untuk menemukan nilai terkecil dan menghapusnya setiap kali, yang akan memberinya salah satu algoritma penyortiran yang paling efisien.
* Kreatif dan jahat: Anda memberi tahu saya.
sumber
Sortir Desain Cerdas Javascript
sumber
Python - req. # 1
Kode ini akan mengurutkan ganda dalam urutan leksikografis daripada meningkatkan urutan numerik, dengan membuat pohon angka awal dan kemudian mengulanginya secara rekursif.
Ini bekerja
n log n
tepat waktu, dan sebenarnya cara yang cerdas untuk menyimpan daftar yang diurutkan sebaliknya, tetapi sayangnya untuk OP, ia melakukan hal yang sepenuhnya salah.sumber
2, 1, 3, 8, 5
,.Mengurutkan array ganda. Di Jawa:
Misalnya:
[0.0, 1.5, 123]
pergi dari representasi biner yang tidak disortir dari
011111111111000000000000000000000000000000000000000000000000000100000001011110110000000000000000000000000000000000000000000000
untuk diurutkan dengan elegan
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111
sumber
Edit per @kealist, saya kira lebih baik jika berkomentar untuk membuat pembagian itu tampak masuk akal. Dalam Rebol ...
Memainkan gagasan bahwa mereka tidak benar-benar tahu apa itu ganda, dan mungkin percaya daftar ganda hanyalah sekelompok angka dikalikan dua.
sumber
Sengaja salah paham pertanyaan:
Menggunakan pendekatan rekursif:
Array yang diurutkan dijamin akan dikeluarkan pada titik tertentu, untuk semua jenis data dalam array, bahkan segala jenis urutan penyortiran, dan bahkan segala jenis pemisah untuk input, yang membuat pendekatan ini sangat fleksibel. Kelemahan utamanya adalah agak lambat untuk array besar, tetapi Anda bisa menyelesaikannya dengan mudah dengan multithreading.
sumber