Mengapa kontestan kompetisi pemrograman menggunakan C ++ dan Java? [Tutup]

93

Setelah berkompetisi dan mengikuti kompetisi Google Code Jam tahun ini , saya tidak bisa tidak melihat banyaknya kontestan [sukses] yang menggunakan C / C ++ dan Java. Distribusi bahasa yang digunakan selama kompetisi dapat dilihat di sini .

Setelah memprogram di C / C ++ selama beberapa tahun, saya baru-baru ini jatuh cinta dengan Python karena sifatnya yang mudah dibaca / langsung. Baru-baru ini, saya belajar bahasa fungsional seperti OCaml, Skema, dan bahkan bahasa logika seperti Prolog. Bahasa-bahasa ini tentunya memiliki kelebihan dan, menurut saya, dapat diterapkan lebih mudah daripada C ++ dan Java untuk situasi tertentu. Misalnya, penggunaan panggilan / cc Skema menyederhanakan pelacakan balik (alat yang diperlukan untuk menjawab beberapa masalah) dan spesifikasi logika Prolog, meskipun tidak efisien karena sifat brute force-nya, dapat secara drastis menyederhanakan (dan bahkan secara otomatis menyelesaikan) masalah tertentu yang sulit untuk diselesaikan. membungkus otak seseorang.

Jelas bahwa kontestan kompetisi harus menggunakan alat yang paling sesuai untuk tantangan tersebut. Bahkan perakitan x86 sudah Turing selesai - itu tidak membenarkan penyelesaian masalah dengannya. Dalam kasus ini, mengapa kontestan yang menggunakan bahasa yang kurang umum seperti Scheme / Lisp, Prolog, dan bahkan Python secara signifikan kurang berhasil daripada kontestan yang menggunakan C / C ++ dan Java? Dengan kata-kata yang berbeda, mengapa kontestan yang sukses tidak menggunakan bahasa yang, meskipun mungkin kurang umum, merupakan alat yang lebih baik untuk pekerjaan itu?

Ada beberapa motivasi untuk pertanyaan saya. Yang terpenting, saya ingin menjadi programmer yang lebih baik - baik dalam aspek praktis maupun aspek persaingan. Setelah diperkenalkan dengan paradigma yang indah seperti pemrograman fungsional dan logika, sangat mengecewakan melihat begitu banyak orang membuangnya demi C / C ++ dan Java. Bahkan membuat saya mempertanyakan kekaguman saya atas paradigma tersebut, khawatir saya tidak bisa sukses sebagai programmer Lisp / Scheme / Prolog dalam kompetisi pemrograman.

advait
sumber
11
Saya kira kecepatan eksekusi mungkin menjadi faktornya.
Zaki
Pertanyaan menarik; akan menyenangkan mendapatkan jawaban dari peserta, di Code Jam atau kompetisi lain (ACM, dll). Batas waktu berjalan mungkin bias terhadap bahasa yang ditafsirkan, meskipun ...
tzaman
11
Bahasa dinamis memiliki masalah kinerja yang sangat besar: lihat tolok ukur
NullUserException
Untuk Topcoder, itu murni karena mereka memiliki aturan yang melarang penggunaan apa pun kecuali pustaka standar Python, yang membuat apa pun selain tugas-tugas sepele menjadi tidak mungkin. Mencari asteroid di gambar luar angkasa? Sayang sekali, Anda bahkan tidak bisa menggunakan NumPy.
endolith

Jawaban:

68

Pertanyaan bagus! Sebagai seseorang yang telah mencoba-coba kontes pemrograman sendiri, saya mungkin ingin mengatakan sesuatu.

[Mari kita singkirkan penafian standar: pemrograman kontes hanya terkait secara longgar dengan "pemrograman di dunia nyata", dan sementara itu menguji keterampilan algoritmik dan pemecahan masalah serta kemampuan untuk menghasilkan kode kerja cepat bebas bug di bawah tekanan waktu, ini tidak selalu berkorelasi dengan kemampuan untuk membangun proyek perangkat lunak besar, menulis kode yang dapat dipelihara, dll (selain fakta bahwa program yang terstruktur dengan baik lebih mudah untuk di-debug).]

Sekarang untuk beberapa jawaban:

  • C ++ / Java juga lebih umum daripada bahasa lain di dunia nyata, jadi Anda akan melihat proporsi yang lebih tinggi di mana saja. (Tetapi bahkan lebih tinggi dalam populasi kontes.)

  • Banyak dari peserta ini adalah pelajar, atau mengikuti kontes sebagai pelajar, dan C ++ / Java adalah "bahasa pertama" yang lebih umum dipelajari siswa. (Siswa tingkat bawah akhir-akhir ini mungkin mulai dengan Skema, Haskell, Python, dll., Tetapi siswa sekolah menengah (seringkali otodidak) lebih jarang.) Faktanya, banyak peserta Eropa Timur masih menggunakan Pascal, dan lebih menakjubkan dengan itu daripada kita semua dengan bahasa apa pun.

  • Kontes tingkat sekolah dan perguruan tinggi biasanya menggunakan bahasa-bahasa ini. International Olympiad in Informatics (IOI) hanya mengizinkan C, C ++ dan Pascal (atau mungkin sekarang mengizinkan Java; saya belum mengikutinya), dan ACM Intercollegiate Programming Contest (ACM ICPC) hanya mengizinkan C, C ++ dan Java. TopCoder memungkinkan C ++, Java, C # dan VB (benar-benar: p); dan baru-baru ini, Python. Jadi bisa dibilang "ekosistem kontes" memiliki lebih banyak programmer C ++ / Java di dalamnya. Google Code Jam dan IPSC adalah di antara sedikit kontes yang mengizinkan kode dalam bahasa apa pun.

  • Sekarang pertanyaannya adalah, di GCJ dimana para kontestan bebas memilih bahasa, mengapa mereka tidak memilih Python atau Scheme? Faktor yang paling relevan adalah bahasa-bahasa ini lambat . Tentu, untuk sebagian besar pemrograman dunia nyata, mereka cukup cepat dengan mudah, tetapi untuk loop ketat yang sering terlibat dalam menjalankan program di bawah batas n-detik untuk semua kasus pengujian, bahasa ini tidak memotongnya untuk salah satu masalah algoritmik yang lebih terlibat. (Masalah yang dirancang untuk menerima solusi O (n log n) tetapi tidak Θ (n 2 ) solusi untuk C / C ++ sering mengesampingkan solusi O (n log n) yang optimal sekalipun dalam bahasa yang lebih lambat. Bahkan Java dulunya diberi cacat pada USACO; Saya tidak yakin ini masih terjadi.)

  • Faktor lainnya adalah pustaka: C ++ dan Java memiliki pustaka yang lebih baik untuk algoritme dan struktur data yang sering berguna (misalnya pohon merah-hitam, next_permutation C ++), sedangkan pustaka Python (cukup baik untuk dunia nyata) kurang berguna di sini, dan Prolog dan Skema ... Saya tidak tahu tentang perpustakaan mereka. Ini adalah faktor yang relatif kecil, karena programmer ini dapat menulis kode mereka sendiri bila diperlukan. :-)

  • Bahasa multi-paradigma tujuan umum lebih berguna untuk menyelesaikan sesuatu dalam batasan waktu kontes, daripada bahasa yang memaksakan filosofi atau cara melakukan sesuatu pada Anda. Inilah mengapa Prolog akan selalu tidak populer, misalnya. (Filosofi umum: beberapa bahasa "memungkinkan" bahasa yang memungkinkan Anda melakukan apa saja termasuk menembak diri sendiri, beberapa "mengarahkan" yang memaksa Anda untuk melakukan hal-hal dengan cara yang benar.) Ini juga mengapa C ++ tiga kali lebih populer daripada Java pada peserta kontes umum, dan jauh lebih populer di kalangan kontestan papan atas. Karena kode tidak harus dibaca oleh orang lain, tidak masalah dan bahkan berguna untuk memiliki makro perulangan sepertiFOR(i,n)(lebih sedikit kode untuk diketik, dan yang lebih penting lebih sedikit kemungkinan membuat bug saat terburu-buru). Tidak ada yang melawan Java, ada beberapa programmer top yang menggunakan Java juga. :-)

  • Akhirnya, meskipun banyak dari programmer top ini mungkin memiliki C ++ / Java / Pascal sebagai "bahasa pertama" mereka, mereka tidak bagus karena bahasanya, jadi Anda tidak perlu putus asa tentang itu. Banyak dari programmer yang sama ini telah memenangkan kontes seperti kontes ICFP bahkan dengan sengaja menggunakan bahasa gila seperti skrip shell, m4 (digunakan dalam autoconf), dan assembly (tim bernama "You Can't Spell Awesome Without ASM").

ShreevatsaR
sumber
2
Saya setuju; seperti yang saya katakan, keberadaan perpustakaan adalah masalah yang relatif sangat kecil. Saya dapat menghapusnya jika menurut Anda saya melebih-lebihkan.
ShreevatsaR
2
Sedikit tentang Java dalam poin-poin kedua hingga terakhir tidak sepenuhnya benar. Banyak kontestan top GCJ menggunakan Java.
NullUserException
1
[Peserta lain di final ("linguo") menggunakan Python, dan melalui kontes telah menggunakan bahasa termasuk LOLCODE, Piet, FALSE, Whitespace, dan FRACTRAN!]
ShreevatsaR
4
Saya hanya ingin menambahkan sedikit ke bagian tentang kecepatan. "Kecepatan" dalam kontes seperti GCJ adalah kompleksitas waktu proses dari kode (yaitu, big-O). Dalam GCJ biasanya algoritme yang benar diterima bahkan dalam bahasa yang lambat (karena itu ada banyak kiriman Python yang diterima) sementara algoritme yang lambat akan memakan waktu selamanya bahkan dalam asm. Ada pengecualian, tetapi umumnya jika Anda menggunakan algoritme / teknik yang benar, Anda aman bahkan dengan bahasa yang lebih lambat.
MAK
1
@EvgeniSergeev Apa yang Anda katakan benar untuk sebagian besar kontes pemrograman, seperti IOI / TopCoder, tetapi di GCJ secara khusus, batas waktu biasanya 8 menit untuk input yang besar, dan masalahnya biasanya dirancang sehingga solusi Python juga bisa lolos. Bahkan 10 tahun yang lalu aturan praktisnya adalah ~ 10 ^ 9 operasi "sederhana" per detik, jadi misalnya untuk membedakan O (n ^ 2) dari Ω (n ^ 3), kita hanya perlu n ^ 2 <10 ^ 9 * 60 * 8 <n ^ 3, atau kira-kira 8000 <n <692000. Anda dapat menggunakan n = 20000, dan n ^ 2 algo bahkan dalam bahasa yang 400x lebih lambat (10 ^ 9/400 per s) hanya akan memakan waktu 160 detik, bahkan fast n ^ 3 akan memakan waktu 8000 detik.
ShreevatsaR
14

Saya menyukai ide Jerry Coffin untuk merencanakan kontestan kontes Google AI, jadi saya mengambil semua hasil dan memplotnya (rata-rata dihitung, deviasi standar, dan kemudian membuat grafik kurva distribusi normal di Excel).

Dengan Lua dan JS, dapatkan ini:

Tanpa (hanya ada sedikit kontestan, jadi mungkin hasilnya miring):

Sepertinya peserta Java jauh lebih buruk daripada yang lain, sementara Go, Common Lisp, dan C berada di ujung yang lebih baik.

Tatiana Racheva
sumber
Namun, pertanyaan yang diajukan tentang Google Code Jam dan bukan kontes Google AI (jawaban Anda adalah yang pertama kali saya dengar), jadi mungkin lebih relevan untuk menggambar grafik ini untuk Google Code Jam. Sebenarnya pertanyaan itu sudah menyebutkan statistik seperti itu (2010) ; lihat juga 2011 , 2012 , 2013 dan 2014 (sedang dalam proses saat ini) .
ShreevatsaR
12

Mengapa kita semua berbicara bahasa Inggris dan bukan Esperanto ? Nah, itu terjadi begitu saja. Meskipun bahasa Inggris tidak konsisten dan membengkak dan Esperanto sengaja dirancang sebagai 'alat yang lebih baik'.

Jadi, salah satu alasannya adalah tradisi. Di sebagian besar sekolah, pemrograman masih diajarkan dalam C / C ++, Java, Pascal atau bahkan Basic. Dan berpartisipasi dalam kontes yang sebagian besar adalah siswa, yang memilih bahasa yang lebih mereka kuasai.
Juga, Anda dapat melihat bahwa kebanyakan buku algoritmik menampilkan psedudocode dengan gaya Pascal atau Ada, dan sangat sangat jarang - Lisp. Entah kenapa, mungkin juga tradisi. Atau mungkin itu tidak begitu bagus untuk algoritme.

Alasan lainnya adalah kecepatan. Meskipun ini bukan masalah untuk Google Code Jam, di hampir semua kontes, perbedaan kecepatan 2x adalah perbedaan antara keputusan 'Diterima' dan 'Batas Waktu'.
Dengan kata lain, jika algoritme optimal di C ++ berjalan 10 kali lebih cepat daripada di Ruby, itu berarti algoritme sub-optimal di C ++ masih akan lebih cepat daripada algoritme yang bagus di Ruby. Dan penulis kontes biasanya tidak ingin mengizinkan pengiriman O (n ^ 2), jika O (n * logn) dapat dicapai.

Nikita Rybak
sumber
7
Hanya komentar atas analogi Anda: Esperanto gagal total pada tujuannya. Bunyinya hampir sama dengan dialek Zamenhof dari bahasa Polandia, dan tata bahasanya tidak wajar dan rumit. Ini sama sekali bukan bahasa universal yang baik; Klingon, dalam banyak hal, melakukan pekerjaan yang lebih baik dengan terlihat seperti bahasa manusia yang alami. Orang bisa, saya kira, berpendapat bahwa ada kesamaan dalam hal ini dengan C ++ dan Java, tetapi itu tidak adil :) (Lihat juga xibalba.demon.co.uk/jbr/ranto .)
Antal Spector-Zabusky
1
@Antal Nah, analogi mungkin cacat, tetapi Anda mengerti maksud saya. Antara Anda dan saya, saya juga tidak bisa bahasa Esperanto :)
Nikita Rybak
Bahasa (alami) adalah lambang keanggotaan suku , dan bahasa pemrograman dipengaruhi oleh banyak tekanan yang sama
trapesium
12

Pertama, saya akan mempertanyakan premis Anda [edit: atau apa yang saya anggap sebagai premis - bahwa kontestan yang menggunakan C ++ dan Java memiliki tarif yang sama baiknya]. Sebagai contoh, inilah yang bahasa yang digunakan untuk entri yang datang dalam pertama 100 tempat dan terakhir 100 tempat di kontes AI Google baru-baru ini:

teks alt

Kontestan menggunakan C ++ dan Java tampaknya tidak berada di mana saja dekat untuk sama-sama sukses dalam kontes itu. Kontestan yang menggunakan Python tampaknya tidak berhasil dengan baik, meskipun jumlahnya jauh lebih sedikit, melemahkan kesimpulan apa pun dalam hal itu.

Kedua, tentu saja, banyak sekali penjelasan (seperti yang ditunjukkan orang lain) tidak diragukan lagi hanyalah jumlah orang yang akrab dengan setiap bahasa. Mungkin ada lebih banyak orang yang mengambil kursus di Java saat ini daripada jumlah orang yang pernah menulis Lisp, Skema atau Prolog.

Sunting: Saya pikir kemungkinan ketiga hanyalah keserbagunaan. Untuk mengambil contoh ekstrim, Prolog sangat baik cocok untuk beberapa masalah, tetapi sama-sama buruk cocok untuk banyak orang lain. Hanya sedikit orang yang dapat (atau setidaknya benar-benar) mempelajari lebih dari satu atau dua bahasa dengan cukup baik untuk menggunakannya dalam kontes, jadi kebanyakan orang yang tertarik pada hal-hal seperti itu cenderung memilih bahasa yang dapat bekerja dengan baik untuk hampir semua hal, daripada mencoba mempelajari bahasa khusus untuk setiap masalah yang mungkin dipilih.

Jerry Coffin
sumber
1
Nah, tampaknya sebagian besar peserta top menggunakan C ++ / C # dan lebih sedikit dari mereka yang menggunakan Python / Haskell / Lisp / Scheme / Ruby / Prolog, yang memperkuat premis pertanyaan, bukan? Pertanyaannya bukanlah untuk membandingkan C ++ dan Java di antara mereka sendiri (meskipun ini menarik, terima kasih), tetapi sesuatu seperti: ”Mengapa bahasa" bagus "kurang berhasil di atas? Mengapa kontestan yang baik (yang mungkin tahu banyak bahasa) tidak memilih salah satunya? ” Tetapi saya setuju bahwa keakraban adalah salah satu alasan utama.
ShreevatsaR
Kesan saya (mungkin salah) adalah bahwa pertanyaan tersebut mengasumsikan kontestan yang menggunakan C ++ dan Java hampir sama berhasilnya. Itu mungkin benar dalam beberapa kontes, tetapi tampaknya tidak demikian dalam kontes ini. Meskipun memang benar bahwa jumlahnya lebih sedikit, kontestan yang menggunakan Go, Haskell, Lua, dan CL tampaknya lebih berhasil daripada mereka yang menggunakan Java (meskipun, memang, dalam hal tingkat keberhasilan, C ++ tampaknya mendominasi, setidaknya dalam kasus khusus ini).
Jerry Coffin
5
Maafkan saya, tetapi ini harus benar-benar menjadi diagram batang daripada grafik garis ...
tzaman
Astaga. Saya telah berjuang untuk membuat grafik yang masuk akal selama satu jam, dan saya tidak membuat kemajuan. Excel & Google Spreadsheets membuat saya merasa bodoh.
Tatiana Racheva
Tidak bisakah Lisp secara teknis digunakan sebagai praprosesor makro C / C ++ ...? Anda bisa membuatnya tampak seperti Anda mengirimkan program C ++ tetapi sebenarnya Anda membuat kode di Lisp!
aoeu256
12

Di hampir semua putaran Google Code Jam, lebih banyak kode kontestan berperforma tinggi di C ++.

Di bawah ini adalah statistik bahasa dari Google Code Jam 2012 Putaran 1A, 1B, dan 1C (tercantum dari atas ke bawah). Jumlah kontestan di setiap babak masing-masing adalah 3.686, 3.281, dan 3.189.

Statistik Bahasa dari Google Code Jam 2012 Putaran 1A Statistik Bahasa dari Google Code Jam 2012 Putaran 1B Statistik Bahasa dari Google Code Jam 2012 Putaran 1C

Rose Perrone
sumber
8

pertanyaan yang menyenangkan, mungkin harus wiki komunitas.

Lihat jumlah finalis menurut negara: http://www.go-hero.net/jam/10/regions . perhatikan jumlah orang dari Eropa Timur dan Rusia. tempat-tempat itu memiliki komunitas C ++ yang sangat kuat, serta Jawa, karena sejumlah alasan.

lihat bahasa nomor di kualifikasi: http://www.go-hero.net/jam/10/languages/0 dan final: http://www.go-hero.net/jam/10/languages/6 . C ++ memulai kurang dari setengah dan memiliki 75 persen di final. baik programmer yang baik lebih suka C ++ atau C ++ membuat programmer. Mungkin pada saat Anda menguasai C ++, hal-hal lain menjadi sepele.

Anda bebas menarik kesimpulan sendiri.

Anycorn
sumber
5

Pertama-tama, seperti yang telah Anda tunjukkan C++dan Javamerupakan bahasa arus utama. Ini secara otomatis berarti bahwa orang yang mulai melakukan kompetisi pemrograman akan diperkenalkan kepada mereka terlebih dahulu - dengan cara yang belajar Lispsebagai bahasa pertama :) Saya juga berpartisipasi secara teratur dalam kompetisi semacam itu - saya biasa C++berkompetisi, meskipun bahasa favorit saya adalah Java. Saya hanya ingin berlatih bahasa lain selain Java- jugaC++sedikit kurang bertele-tele dan berjalan lebih cepat yang penting untuk kompetisi pemrograman. Sekarang ke poin saya - orang pertama menjadi ahli dalam bahasa arus utama. Untuk berpartisipasi dalam kompetisi pemrograman, Anda harus memiliki pemahaman yang baik tentang bahasa yang Anda gunakan. Anda tidak punya waktu untuk mencari di internet untuk hal-hal bodoh - seperti lupa membangun. Hanya saja kecepatan menjadi faktor penting di sana. MenggunakanLispdalam sebuah kompetisi, kamu pasti menyukainya. Saya tidak berpikir ada banyak orang di luar sana. Koreksi saya jika saya salah. Dan sejujurnya kelebihan yang telah Anda sebutkan seperti menyederhanakan kemunduran: Dalam bahasa apa pun mundur itu mudah - nyatakan sebuah metode dan panggil saja lagi untuk setiap kemungkinan hasil. Tidak bisa lebih sederhana. Saya belum merasa sampai sekarang bahwa bahasa yang saya gunakan mencoba meningkatkan kemampuan saya untuk kompetisi pemrograman.

Petar Minchev
sumber
Bentuk jamak dari anekdot mungkin bukan data, tapi saya belajar Skema sebagai bahasa pertama saya dan kursus intro CS saya di Haskell. Saya setuju bahwa ini tampaknya tidak biasa, meskipun: C / C ++ / Java / Python tampaknya yang paling populer.
Wang
Poin yang bagus; Saya pikir ini masuk ke inti masalah. Untuk programmer dengan latihan yang cukup dalam melakukan hal-hal yang sering muncul, tidak ada manfaat besar dalam bahasa lain. (Dan fitur seperti, katakanlah, kemampuan pemrosesan teks Perl jarang digunakan dalam kontes ini.)
ShreevatsaR
3

OMG ... Semua orang menelusuri Statistik dan Angka !!

Jangan lupa dasar-dasarnya .. Ini adalah dua bahasa (kebanyakan) yang diajarkan kepada orang-orang di perguruan tinggi / sekolah ...!

Itu mungkin menjawab deru berat!

Arpit
sumber
2

Perpustakaan besar adalah nilai jual untuk Java di ACM ICPC. Sangat berguna untuk dapat menyadari bahwa Anda menginginkan beberapa struktur data atau algoritme acak dan hanya menariknya dari pustaka standar.

Wang
sumber
2

Perlu diingat bahwa C ++ tidak hanya mayoritas di antara semua kontestan, tetapi seiring berjalannya putaran, persentasenya terus dan terus meningkat.

Menurut saya benar bahwa sebagian besar pesertanya adalah pelajar (Namun, karena ini adalah turnamen terbuka dengan peluang untuk wawancara kerja dengan google, maka Anda harus mempertimbangkan bahwa banyak yang berpartisipasi telah lulus). Tapi putaran terakhir hanya untuk orang dengan banyak pengalaman. Mereka bukan hanya siswa yang baru belajar membuat kode di C ++ / Java.

Tentu saja, argumen siswa juga berfungsi melawan bahasa seperti LISP dan OcaML atau ProLog. Itu adalah bahasa, yang banyak digunakan di area AI tetapi di dunia arus utama, siswa kemungkinan besar akan belajar dan menggunakannya.

Kontes besar selain Google mendukung beberapa bahasa, tapi itu masih tidak menjelaskan mengapa Pascal atau .net tidak mendekati level Java (Karena mereka cenderung sama-sama didukung dalam acara kontes besar).

Banyak pembuat kode terbaik dalam kontes ini tahu banyak bahasa. Tapi mereka masih lebih suka menggunakan C ++ selama ronde itu pasti karena alasan yang lebih besar daripada "belajar C ++" terlebih dahulu.

Saya akan membantah klaim bahwa bahasa selain C ++ atau Java adalah alat yang lebih baik untuk pekerjaan itu. Jika data langsung mengatakan bahwa finalis lebih cenderung menggunakan C ++ dan Java, itu merupakan kontradiksi langsung dengan klaim tersebut.

Data persaingan AI Google sebenarnya tidak bertentangan dengan premis apa pun tentang kemacetan kode. Ini benar-benar menunjukkan bahwa pembuat kode teratas dapat menggunakan bahasa seperti Common Lisp ketika itu benar-benar alat yang lebih baik untuk pekerjaan itu. Jika kita ingin menggunakan data ini untuk mengasumsikan bahwa CLISP adalah alat yang hebat untuk kompetisi AI, maka kita juga harus berasumsi bahwa C ++ adalah alat yang hebat untuk kompetisi algoritma seperti GCJ.

UltraAwesomeAnonymousSpy
sumber