เหตุใดผู้แข่งขันการเขียนโปรแกรมจึงใช้ C ++ และ Java [ปิด]


94

หลังจากแข่งขันและติดตามการแข่งขันGoogle Code Jamในปีนี้ ฉันอดไม่ได้ที่จะสังเกตเห็นจำนวนผู้เข้าแข่งขัน [ที่ประสบความสำเร็จ] ที่ใช้ C / C ++ และ Java อย่างไม่น่าเชื่อ การกระจายตัวของภาษาที่ใช้ตลอดการแข่งขันสามารถมองเห็นได้ที่นี่

หลังจากเขียนโปรแกรมใน C / C ++ มาหลายปีฉันเพิ่งตกหลุมรัก Python เนื่องจากลักษณะที่อ่านง่าย / ตรงไปตรงมา เมื่อเร็ว ๆ นี้ฉันได้เรียนรู้ภาษาที่ใช้งานได้เช่น OCaml, Scheme และแม้แต่ภาษาตรรกะเช่น Prolog ภาษาเหล่านี้มีข้อดีอย่างแน่นอนและในความคิดของฉันสามารถใช้งานได้ง่ายกว่า C ++ และ Java ในบางสถานการณ์ ตัวอย่างเช่นการใช้การโทร / cc ของ Scheme ช่วยลดความซับซ้อนในการย้อนรอย (เครื่องมือที่จำเป็นในการตอบปัญหาต่างๆ) และข้อกำหนดเชิงตรรกะของ Prolog แม้ว่าจะไม่มีประสิทธิภาพเนื่องจากลักษณะการบังคับแบบดุร้าย แต่ก็สามารถลดความซับซ้อนลงอย่างมาก (และแม้แต่แก้โดยอัตโนมัติ) ปัญหาบางอย่างที่ยากต่อการ ห่อสมองไว้รอบ ๆ

เป็นที่ชัดเจนว่าผู้เข้าแข่งขันควรใช้เครื่องมือที่เหมาะสมที่สุดสำหรับความท้าทาย แม้แต่การประกอบ x86 ก็ยังสมบูรณ์แบบทัวริง - นั่นไม่ได้เป็นเหตุผลในการแก้ปัญหา ในกรณีนี้ทำไมผู้เข้าแข่งขันที่ใช้ภาษาทั่วไปน้อยกว่าเช่น Scheme / Lisp, Prolog และแม้แต่ Python จึงประสบความสำเร็จน้อยกว่าผู้แข่งขันที่ใช้ C / C ++ และ Java คำพูดที่แตกต่างกันทำไมคุณไม่ประสบความสำเร็จในการแข่งขันใช้ภาษาที่แม้อาจจะเป็นกระแสหลักน้อยเป็นเครื่องมือที่มีเนื้อหาที่ดีกว่าสำหรับงานหรือไม่

มีแรงจูงใจหลายประการสำหรับคำถามของฉัน ที่สำคัญที่สุดคือฉันอยากเป็นโปรแกรมเมอร์ที่ดีขึ้นทั้งในด้านการปฏิบัติและด้านการแข่งขัน หลังจากได้รับการแนะนำให้รู้จักกับกระบวนทัศน์ที่สวยงามเช่นการเขียนโปรแกรมเชิงฟังก์ชันและลอจิกมันเป็นเรื่องน่าท้อใจที่เห็นคนจำนวนมากทิ้งพวกเขาเพื่อสนับสนุน C / C ++ และ Java มันทำให้ฉันตั้งคำถามถึงความชื่นชมในกระบวนทัศน์ดังกล่าวโดยกังวลว่าฉันจะไม่ประสบความสำเร็จในฐานะโปรแกรมเมอร์ Lisp / Scheme / Prolog ในการแข่งขันการเขียนโปรแกรม


11
ฉันเดาว่าความเร็วในการดำเนินการอาจเป็นปัจจัยหนึ่ง
Zaki

คำถามที่น่าสนใจ; เป็นเรื่องดีที่จะได้รับคำตอบจากผู้เข้าร่วมใน Code Jam หรือการแข่งขันอื่น ๆ (ACM ฯลฯ ) การ จำกัด เวลาทำงานอาจมีอคติกับภาษาที่ตีความได้แม้ว่า ...
tzaman

11
ภาษาไดนามิกมีปัญหาด้านประสิทธิภาพอย่างมากโปรดดูเกณฑ์มาตรฐาน
NullUserException

สำหรับ Topcoder นั้นเป็นเพราะพวกเขามีกฎห้ามใช้สิ่งใดก็ตามนอกจากไลบรารีมาตรฐาน Python ซึ่งทำให้สิ่งอื่นใดเป็นไปไม่ได้นอกจากงานเล็กน้อย กำลังค้นหาดาวเคราะห์น้อยในภาพอวกาศ? น่าเสียดายที่คุณไม่สามารถใช้ NumPy ได้
endolith

คำตอบ:


69

คำถามดีมาก! ในฐานะคนที่ขลุกอยู่กับการแข่งขันการเขียนโปรแกรมด้วยตัวเองฉันอาจมีอะไรจะพูด

[เรามาดูข้อจำกัดความรับผิดชอบมาตรฐานกันดีกว่า: การเขียนโปรแกรมการแข่งขันเกี่ยวข้องกับ "การเขียนโปรแกรมในโลกแห่งความจริง" อย่างหลวม ๆ เท่านั้นและในขณะที่ทดสอบทักษะอัลกอริทึมและการแก้ปัญหาและความสามารถในการสร้างโค้ดการทำงานที่รวดเร็วปราศจากข้อบกพร่องภายใต้ แรงกดดันด้านเวลาไม่จำเป็นต้องสัมพันธ์กับความสามารถในการสร้างโครงการซอฟต์แวร์ขนาดใหญ่เขียนโค้ดที่บำรุงรักษาได้ ฯลฯ (นอกเหนือจากข้อเท็จจริงที่ว่าโปรแกรมที่มีโครงสร้างดีนั้นง่ายต่อการดีบัก)]

ตอนนี้สำหรับคำตอบบางส่วน:

  • C ++ / Java เป็นภาษาทั่วไปมากกว่าภาษาอื่น ๆ ในโลกแห่งความเป็นจริงดังนั้นคุณจึงคาดหวังว่าจะได้เห็นสัดส่วนที่สูงขึ้นทุกที่ (แต่จำนวนประชากรการแข่งขันสูงกว่าด้วยซ้ำ)

  • ผู้เข้าร่วมเหล่านี้หลายคนเป็นนักเรียนหรือเข้าร่วมการแข่งขันในฐานะนักเรียนและ C ++ / Java เป็น "ภาษาแรก" ทั่วไปที่นักเรียนเรียนรู้ (นักเรียนระดับปริญญาตรีในปัจจุบันอาจเริ่มต้นด้วย Scheme, Haskell, Python และอื่น ๆ แต่นักเรียนมัธยมปลาย (มักจะเรียนรู้ด้วยตนเอง) น้อยกว่า) อันที่จริงผู้เข้าร่วมในยุโรปตะวันออกหลายคนยังคงใช้ภาษาปาสคาลและน่าทึ่งกว่าด้วย กว่าพวกเราที่เหลือจะใช้ภาษาใดก็ได้

  • การแข่งขันระดับโรงเรียนและระดับวิทยาลัยมักใช้ภาษาเหล่านี้ International Olympiad in Informatics (IOI) อนุญาตเฉพาะ C, C ++ และ Pascal (หรืออาจจะอนุญาต Java ตอนนี้ฉันยังไม่ได้ทำ) และ ACM Intercollegiate Programming Contest (ACM ICPC) อนุญาตเฉพาะ C, C ++ และ Java TopCoder อนุญาตให้ใช้ C ++, Java, C # และ VB (จริงๆ: p); และเมื่อเร็ว ๆ นี้ Python ดังนั้นคุณสามารถพูดได้ว่า "ระบบนิเวศการแข่งขัน" มีโปรแกรมเมอร์ C ++ / Java มากกว่าอยู่ในนั้น Google Code Jam และIPSCเป็นหนึ่งในการแข่งขันไม่กี่รายการที่อนุญาตให้ใช้รหัสในภาษาใดก็ได้

  • คำถามคือใน GCJ ที่ผู้เข้าแข่งขันมีอิสระในการเลือกภาษาทำไมพวกเขาถึงไม่เลือก Python หรือ Scheme? ปัจจัยที่เกี่ยวข้องมากที่สุดคือภาษาเหล่านี้จะช้า แน่นอนว่าสำหรับการเขียนโปรแกรมในโลกแห่งความเป็นจริงส่วนใหญ่พวกเขาทำได้อย่างรวดเร็วเพียงพอ แต่สำหรับลูปที่แน่นซึ่งมักเกี่ยวข้องกับการทำให้โปรแกรมทำงานภายใต้ขีด จำกัด n วินาทีสำหรับกรณีทดสอบทั้งหมดภาษาเหล่านี้จะไม่ถูกตัดออกสำหรับใด ๆ ปัญหาที่เกี่ยวข้องกับอัลกอริทึมมากขึ้น (ปัญหาที่ออกแบบมาเพื่อยอมรับโซลูชัน O (n log n) แต่ไม่ใช่Θ (n 2 ) โซลูชันสำหรับ C / C ++ มักจะออกกฎแม้กระทั่งโซลูชัน O (n log n) ที่เหมาะสมที่สุดในภาษาที่ช้าลงแม้แต่ Java ก็เคยได้รับแต้มต่อที่ USACO; ฉันไม่แน่ใจว่ายังคงเป็นเช่นนั้น)

  • อีกปัจจัยหนึ่งคือไลบรารี: C ++ และ Java มีไลบรารีที่ดีกว่าสำหรับอัลกอริทึมและโครงสร้างข้อมูลที่มีประโยชน์บ่อยๆ (เช่นต้นไม้สีแดง - ดำ, next_permutation ของ C ++) ในขณะที่ไลบรารีของ Python (ดีพอสำหรับโลกแห่งความเป็นจริง) มีประโยชน์น้อยกว่าที่นี่และ Prolog and Scheme ... ฉันไม่รู้เกี่ยวกับห้องสมุดของพวกเขา นี่เป็นปัจจัยที่ค่อนข้างน้อยเนื่องจากโปรแกรมเมอร์เหล่านี้สามารถเขียนโค้ดของตัวเองได้เมื่อจำเป็น :-)

  • ภาษาหลายกระบวนทัศน์เอนกประสงค์มีประโยชน์มากกว่าสำหรับการทำสิ่งต่างๆให้เสร็จภายในเวลาที่ จำกัด ของการแข่งขันมากกว่าภาษาที่บังคับปรัชญาหรือวิธีการทำสิ่งต่างๆกับคุณ นี่คือสาเหตุที่ Prolog ยังคงไม่เป็นที่นิยมเช่น (ปรัชญาทั่วไป: บางภาษา "เปิดใช้งาน" ภาษาที่ให้คุณทำอะไรก็ได้รวมถึงยิงตัวเองที่เท้าบางภาษา "สั่ง" ที่บังคับให้คุณทำสิ่งที่ถูกต้อง) นี่คือเหตุผลที่ C ++ ได้รับความนิยมมากกว่าสามเท่า Java ในผู้เข้าร่วมการแข่งขันทั่วไปและเป็นที่นิยมมากขึ้นในหมู่ผู้เข้าแข่งขันชั้นนำ เนื่องจากคนอื่นไม่จำเป็นต้องอ่านโค้ดมันก็โอเคและยังมีประโยชน์ที่จะมีมาโครแบบวนซ้ำเช่นFOR(i,n)(พิมพ์โค้ดน้อยลงและที่สำคัญโอกาสน้อยกว่าในการสร้างข้อผิดพลาดเมื่อรีบร้อน) ไม่มีอะไรเทียบกับ Java มีโปรแกรมเมอร์ชั้นนำสองสามคนที่ใช้ Java เช่นกัน :-)

  • ในที่สุดแม้ว่าโปรแกรมเมอร์ชั้นนำเหล่านี้หลายคนอาจมี C ++ / Java / Pascal เป็น "ภาษาแรก" แต่ก็ไม่ดีเนื่องจากภาษาของพวกเขาดังนั้นคุณไม่ต้องสิ้นหวังกับสิ่งนั้น โปรแกรมเมอร์คนเดียวกันนี้หลายคนชนะการแข่งขันเช่นการแข่งขันICFPแม้ว่าจะตั้งใจใช้ภาษาที่บ้าคลั่งเช่นเชลล์สคริปต์ m4 (ใช้ใน autoconf) และแอสเซมบลี (ทีมที่ชื่อ "You can't Spell Awesome Without ASM")


2
ฉันเห็นด้วย; อย่างที่บอกการมีอยู่ของห้องสมุดเป็นปัญหาที่ค่อนข้างน้อยมาก ฉันสามารถลบออกได้ถ้าคุณคิดว่าฉันคุยโว
ShreevatsaR

2
เล็กน้อยเกี่ยวกับ Java ในสัญลักษณ์แสดงหัวข้อย่อยที่สองถึงสุดท้ายไม่เป็นความจริง ผู้เข้าแข่งขันระดับสูงของ GCJ หลายคนใช้ Java
NullUserException

1
[ผู้เข้าร่วมคนอื่น ๆ ในรอบสุดท้าย ("linguo") ใช้ Python และในการแข่งขันได้ใช้ภาษาต่างๆเช่น LOLCODE, Piet, FALSE, Whitespace และ FRACTRAN!]
ShreevatsaR

4
ฉันอยากจะเพิ่มเล็กน้อยในส่วนเกี่ยวกับความเร็ว "ความเร็ว" ในการแข่งขันเช่น GCJ คือความซับซ้อนของรันไทม์ของโค้ด (เช่น big-O) ใน GCJ โดยปกติแล้วอัลกอริทึมที่ถูกต้องจะได้รับการยอมรับแม้ในภาษาที่ช้า (ดังนั้นจึงมีการส่ง Python จำนวนมากที่ยอมรับ) ในขณะที่อัลกอริทึมที่ช้าจะใช้เวลาตลอดไปแม้ใน asm มีข้อยกเว้น แต่โดยทั่วไปหากคุณใช้อัลกอริทึม / เทคนิคที่ถูกต้องคุณจะปลอดภัยแม้จะใช้ภาษาที่ช้ากว่าก็ตาม
MAK

1
@EvgeniSergeev สิ่งที่คุณพูดเป็นจริงสำหรับการแข่งขันการเขียนโปรแกรมส่วนใหญ่เช่น IOI / TopCoder แต่ใน GCJ โดยเฉพาะเวลา จำกัด มักจะอยู่ที่ 8 นาทีสำหรับอินพุตขนาดใหญ่และปัญหามักได้รับการออกแบบเพื่อให้โซลูชัน Python สามารถผ่านได้เช่นกัน แม้ 10 ปีที่แล้วกฎทั่วไปคือ ~ 10 ^ 9 การดำเนินการ "ง่าย" ต่อวินาทีดังนั้นเช่นการแยก O (n ^ 2) จากΩ (n ^ 3) เราก็ต้องการ n ^ 2 <10 ^ 9 * 60 * 8 <n ^ 3 หรือประมาณ 8000 <n <692000 คุณสามารถใช้ n = 20000 และ n ^ 2 ได้แม้ในภาษาที่ช้าลง 400x (10 ^ 9/400 ต่อวินาที) จะใช้เวลาเพียง 160 วินาทีในขณะที่แม้ เร็ว n ^ 3 จะใช้เวลา 8000 วินาที
ShreevatsaR

14

ฉันชอบแนวคิดของ Jerry Coffin ในการวางแผนผู้เข้าแข่งขันของ Google AI ดังนั้นฉันจึงนำผลลัพธ์ทั้งหมดมาลงจุด (ค่าเฉลี่ยที่คำนวณได้ค่าเบี่ยงเบนมาตรฐานแล้วสร้างกราฟเส้นโค้งการแจกแจงปกติใน Excel)

ด้วย Lua และ JS รับสิ่งนี้:

หากไม่มี (มีผู้เข้าแข่งขันไม่กี่คนดังนั้นผลลัพธ์อาจเบ้):

ดูเหมือนว่าผู้เข้าร่วม Java จะแย่กว่าคนอื่น ๆ อย่างเห็นได้ชัดในขณะที่ Go, Common Lisp และ C อยู่ในจุดที่ดีกว่า


อย่างไรก็ตามคำถามที่ถามเกี่ยวกับ Google Code Jam ไม่ใช่การแข่งขัน Google AI (คำตอบของคุณคือที่แรกที่ฉันได้ยิน) ดังนั้นการวาดกราฟเหล่านี้สำหรับ Google Code Jam อาจเกี่ยวข้องมากกว่า อันที่จริงคำถามกล่าวถึงสถิติดังกล่าวแล้ว(2010) ; ดูเพิ่มเติมที่2011 , 2012 , 2013และปี 2014 (ในความคืบหน้าในขณะนี้)
ShreevatsaR

12

ทำไมเราทุกคนพูดภาษาอังกฤษไม่ใช่ภาษาเอสเปรันโต ? มันเพิ่งเกิดขึ้น แม้ว่าภาษาอังกฤษจะไม่สอดคล้องกันและป่องและภาษาเอสเปรันโตได้รับการออกแบบโดยเจตนาให้เป็น 'เครื่องมือที่ดีกว่า'

ดังนั้นเหตุผลหนึ่งคือประเพณี ในโรงเรียนส่วนใหญ่การเขียนโปรแกรมยังคงสอนเป็นภาษา C / C ++, Java, Pascal หรือแม้แต่ขั้นพื้นฐาน และเข้าร่วมการแข่งขันเหล่านั้นส่วนใหญ่เป็นนักเรียนซึ่งเลือกภาษาที่พวกเขารู้ดีกว่า
นอกจากนี้คุณสามารถสังเกตได้ว่าหนังสืออัลกอริทึมส่วนใหญ่มี psedudocode ในรูปแบบของ Pascal หรือ Ada และไม่ค่อยบ่อยนัก - Lisp ฉันไม่รู้ว่าทำไมบางทีอาจเป็นประเพณีด้วย หรือบางทีมันอาจจะไม่ดีสำหรับอัลกอริทึม

อีกเหตุผลหนึ่งก็คือความเร็ว แม้ว่า Google Code Jam จะไม่ใช่ปัญหา แต่ในการแข่งขันเกือบทั้งหมดช่องว่างความเร็ว 2x เป็นความแตกต่างระหว่างคำตัดสิน "ยอมรับ" และ "จำกัด เวลา"
กล่าวอีกนัยหนึ่งถ้าอัลกอริทึมที่ดีที่สุดใน C ++ ทำงานเร็วกว่าใน Ruby 10 เท่าอาจหมายความว่าอัลกอริทึมที่เหมาะสมย่อยใน C ++ จะยังเร็วกว่าอัลกอริทึมที่ดีใน Ruby และผู้เขียนการแข่งขันมักไม่ต้องการอนุญาตให้ส่ง O (n ^ 2) ถ้า O (n * logn) สามารถทำได้


7
เพียงแค่แสดงความคิดเห็นเกี่ยวกับการเปรียบเทียบของคุณ: ภาษาเอสเปรันโตล้มเหลวในเป้าหมายอย่างน่าสังเวช เสียงของมันค่อนข้างตรงกับภาษาโปแลนด์ของ Zamenhof และไวยากรณ์ของมันก็ไม่เป็นธรรมชาติและซับซ้อน มันไม่มีทางเป็นภาษาสากลที่ดีได้ ในหลาย ๆ คลิงออนทำงานได้ดีกว่าในการที่ดูเหมือนภาษามนุษย์ตามธรรมชาติ ฉันคิดว่าฉันสามารถโต้แย้งได้ว่ามีความคล้ายคลึงกันใน C ++ และ Java แต่นั่นจะไม่ยุติธรรม :) (ดูxibalba.demon.co.uk/jbr/rantoด้วย)
Antal Spector-Zabusky

1
@ Antal ดีการเปรียบเทียบอาจมีข้อบกพร่อง แต่คุณเข้าใจฉัน ระหว่างคุณกับฉันฉันก็ไม่พูดภาษาเอสเปรันโตเหมือนกัน :)
Nikita Rybak

ภาษา (เป็นธรรมชาติ) เป็นสัญลักษณ์ของการเป็นสมาชิกของชนเผ่าและภาษาโปรแกรมได้รับอิทธิพลจากแรงกดดันเดียวกันหลายประการ
สี่เหลี่ยมคางหมู

12

ก่อนอื่นฉันจะถามหลักฐานของคุณ [แก้ไข: หรือสิ่งที่ฉันใช้เป็นหลักฐาน - ผู้เข้าแข่งขันที่ใช้ค่าโดยสาร C ++ และ Java ก็พอ ๆ กัน] ตัวอย่างเช่นต่อไปนี้เป็นภาษาที่ใช้สำหรับรายการที่เข้ามาใน100 อันดับแรกและ100 อันดับสุดท้าย ในการประกวด AI ล่าสุดของ Google:

ข้อความแสดงแทน

ผู้เข้าแข่งขันที่ใช้ C ++ และ Java ดูเหมือนจะไม่ใกล้เคียงกับความสำเร็จเท่ากันในการแข่งขันครั้งนั้น ผู้เข้าแข่งขันที่ใช้ Python ดูเหมือนจะไม่ค่อยดีนักเช่นกันแม้ว่าจะมีจำนวนน้อยกว่ามาก แต่ก็ทำให้ข้อสรุปในเรื่องนั้นอ่อนแอลง

ประการที่สองคำอธิบายที่แย่มาก (ตามที่คนอื่น ๆ ชี้ให้เห็น) ไม่ต้องสงสัยเลยว่าเป็นเพียงจำนวนคนที่คุ้นเคยกับแต่ละภาษา ตอนนี้อาจมีคนเรียนภาษา Java มากกว่าจำนวนคนทั้งหมดที่เคยเขียน Lisp, Scheme หรือ Prolog

แก้ไข: ฉันคิดว่าความเป็นไปได้ที่สามคือความเก่งกาจ ในการเลือกตัวอย่างที่รุนแรง Prolog เหมาะอย่างยิ่งกับปัญหาบางอย่าง แต่ก็ไม่เหมาะกับปัญหาอื่น ๆ อีกมากมาย มีเพียงไม่กี่คนที่สามารถ (หรืออย่างน้อยก็ทำได้) เรียนรู้มากกว่าหนึ่งหรือสองภาษาได้ดีพอที่จะใช้ในการแข่งขันดังนั้นคนส่วนใหญ่ที่มีความสนใจในเรื่องดังกล่าวมักจะเลือกภาษาที่สามารถทำงานได้ดีพอสมควรสำหรับเกือบทุกอย่างมากกว่า พยายามเรียนรู้ภาษาเฉพาะสำหรับทุกปัญหาที่อาจถูกเลือก


1
ดูเหมือนว่าผู้เข้าร่วมชั้นนำส่วนใหญ่ใช้ C ++ / C # และน้อยกว่านั้นใช้ Python / Haskell / Lisp / Scheme / Ruby / Prolog ซึ่งช่วยเพิ่มความแข็งแกร่งให้กับคำถามใช่หรือไม่? คำถามไม่ได้เป็นการเปรียบเทียบ C ++ และ Java กันเอง (แม้ว่าจะน่าสนใจ แต่ก็ขอบคุณ) แต่มีบางอย่างเช่น "ทำไมภาษา" ดี "จึงประสบความสำเร็จน้อยกว่าที่ด้านบน? ทำไมผู้เข้าแข่งขันที่เก่ง ๆ (ซึ่งน่าจะรู้หลายภาษา) ไม่เลือกหนึ่งในนี้” แต่ฉันยอมรับว่าความคุ้นเคยเป็นสาเหตุสำคัญประการหนึ่ง
ShreevatsaR

ความประทับใจของฉัน (อาจเข้าใจผิด) คือคำถามที่ถือว่าผู้เข้าแข่งขันที่ใช้ C ++ และ Java ประสบความสำเร็จไม่แพ้กัน นั่นอาจเป็นความจริงในการแข่งขันบางรายการ แต่ดูเหมือนจะไม่อยู่ในรายการนี้ แม้ว่าจะมีจำนวนน้อยกว่า แต่ผู้เข้าแข่งขันที่ใช้ Go, Haskell, Lua และ CL ดูเหมือนจะประสบความสำเร็จมากกว่าผู้ที่ใช้ Java (แม้ว่าจะเป็นที่ยอมรับในแง่ของอัตราความสำเร็จ C ++ ก็ดูเหมือนจะมีอิทธิพลอย่างแน่นอนอย่างน้อยก็ใน กรณีนี้โดยเฉพาะ)
Jerry Coffin

5
ขออภัยในความคิดของฉัน แต่นี่ควรเป็นกราฟแท่งมากกว่ากราฟเส้น ...
tzaman

พุทโธ่. ฉันพยายามสร้างแผนภูมิที่สมเหตุสมผลมาเป็นเวลาหนึ่งชั่วโมงแล้วและฉันก็ไม่ก้าวหน้า Excel และ Google Spreadsheets ทำให้ฉันรู้สึกโง่
Tatiana Racheva

ไม่สามารถใช้ Lisp เป็นตัวประมวลผลล่วงหน้าแมโคร C / C ++ ในทางเทคนิคได้ ... ? คุณสามารถทำให้ดูเหมือนว่าคุณส่งโปรแกรม C ++ แต่ในความเป็นจริงคุณเขียนเป็น Lisp!
aoeu256

12

ใน Google Code Jam เกือบทุกรอบโค้ดของผู้เข้าแข่งขันที่มีประสิทธิภาพสูงกว่าใน C ++

ด้านล่างนี้คือสถิติภาษาจาก Google Code Jam 2012 Round 1A, 1B และ 1C (แสดงจากบนลงล่าง) จำนวนผู้เข้าแข่งขันในแต่ละรอบคือ 3,686, 3,281 และ 3,189 ตามลำดับ

สถิติภาษาจาก Google Code Jam 2012 รอบ 1A สถิติภาษาจาก Google Code Jam 2012 รอบ 1B สถิติภาษาจาก Google Code Jam 2012 รอบ 1C


8

คำถามสนุก ๆ น่าจะเป็นวิกิชุมชน

ดูที่จำนวนของผู้ผ่านเข้ารอบสุดท้ายโดยประเทศ: http://www.go-hero.net/jam/10/regions สังเกตจำนวนผู้คนจากยุโรปตะวันออกและรัสเซีย สถานที่เหล่านั้นมีชุมชน C ++ ที่แข็งแกร่งมากเช่นเดียวกับ Java ด้วยเหตุผลหลายประการ

ดูที่ภาษาจำนวนในรอบคัดเลือก: http://www.go-hero.net/jam/10/languages/0และรอบชิงชนะเลิศ: http://www.go-hero.net/jam/10/languages/6 C ++ เริ่มต้นน้อยกว่าครึ่งหนึ่งและมี 75 เปอร์เซ็นต์ในรอบชิงชนะเลิศ โปรแกรมเมอร์ที่ดีชอบ C ++ หรือ C ++ ทำให้โปรแกรมเมอร์ อาจถึงเวลาที่คุณเชี่ยวชาญ C ++ สิ่งอื่น ๆ ก็กลายเป็นเรื่องเล็กน้อย

คุณมีอิสระที่จะสรุปข้อสรุปของคุณเอง


5

ก่อนอื่นตามที่คุณได้ชี้ไว้C++และJavaเป็นภาษาหลัก เหล่านี้โดยอัตโนมัติหมายความว่าคนที่เริ่มทำการแข่งขันการเขียนโปรแกรมจะได้รับการแนะนำให้รู้จักกับพวกเขาครั้งแรก - โดยวิธีการที่เรียนรู้Lispภาษาเป็นครั้งแรก :) ฉันยังมีส่วนร่วมอย่างสม่ำเสมอในการแข่งขันดังกล่าว - ฉันจะใช้ในการแข่งขันแม้ว่าภาษาที่ชื่นชอบคือC++ Javaเป็นเพียงแค่ฉันต้องการฝึกภาษาอื่นนอกเหนือจากJava- ด้วยC++น้อยลงเล็กน้อยและทำงานได้เร็วขึ้นซึ่งเป็นสิ่งสำคัญสำหรับการแข่งขันการเขียนโปรแกรม ในตอนนี้ผู้คนกลายเป็นผู้เชี่ยวชาญในภาษาหลักเป็นอันดับแรก ในการเข้าร่วมการแข่งขันการเขียนโปรแกรมคุณต้องมีความเข้าใจภาษาที่คุณใช้เป็นอย่างดี คุณไม่มีเวลาค้นหาสิ่งโง่ ๆ บนอินเทอร์เน็ตเช่นลืมโครงสร้าง ความเร็วเป็นปัจจัยสำคัญที่นั่น ใช้Lispในการแข่งขันคุณต้องชื่นชอบ ฉันไม่คิดว่าจะมีคนมากมายขนาดนี้ แก้ไขฉันถ้าฉันผิด และข้อดีที่คุณได้กล่าวถึงอย่างตรงไปตรงมาเช่นช่วยลดความยุ่งยากในการย้อนรอย: ในภาษาใดก็ตามที่การติดตามย้อนกลับเป็นเรื่องง่าย - ประกาศวิธีการและเรียกอีกครั้งสำหรับทุกผลลัพธ์ที่เป็นไปได้ มันไม่ง่ายไปกว่านี้แล้ว จนถึงตอนนี้ฉันยังไม่รู้สึกว่าภาษาที่ฉันใช้กำลังพยายามก้าวไปสู่การแข่งขันเขียนโปรแกรม


พหูพจน์ของเกร็ดเล็กเกร็ดน้อยอาจไม่ใช่ข้อมูล แต่ฉันเรียนรู้ Scheme เป็นภาษาแรกและหลักสูตร Intro CS ของฉันอยู่ที่ Haskell ฉันยอมรับว่าสิ่งนี้ดูเหมือนจะผิดปกติแม้ว่า C / C ++ / Java / Python ดูเหมือนจะเป็นที่นิยม
วัง

จุดดี; ฉันคิดว่านี่เป็นหัวใจสำคัญของเรื่องนี้ สำหรับโปรแกรมเมอร์ที่มีการฝึกฝนอย่างเพียงพอในการทำสิ่งต่างๆที่เกิดขึ้นบ่อยๆภาษาอื่น ๆ ก็ไม่มีประโยชน์อะไรมาก (และคุณสมบัติเช่นพูดว่าความสามารถในการประมวลผลข้อความของ Perl แทบจะไม่มีประโยชน์ในการแข่งขันเหล่านี้)
ShreevatsaR

3

OMG ... ผู้คนล้วนผ่านสถิติและตัวเลข !!

อย่าลืมพื้นฐาน .. ภาษาเหล่านี้เป็นเพียงสองภาษา (ส่วนใหญ่) ที่สอนให้กับคนในวิทยาลัย / โรงเรียน ... !

ที่อาจตอบโจทย์การวิ่งอย่างหนัก!


3

สาเหตุสำคัญอาจเป็นเพราะการแข่งขันทุกรายการไม่รองรับภาษาเช่น python หรือ prolog พิเศษACM ICPC โลกรอบชิงชนะเลิศสนับสนุน C / C ++ และ Java และแข่งขันชิงยังรองรับเฉพาะภาษา C ++, Java, C #, VB และตอนนี้งูหลาม เป็นเรื่องธรรมดาสำหรับผู้เข้าแข่งขันที่พวกเขาจะเลือกหนึ่งภาษาที่มีอยู่ในทุกการแข่งขัน อีกสาเหตุหนึ่งอาจเป็นความเร็วในการดำเนินการ และใช่อีกเหตุผลหนึ่งก็คือภาษาเหล่านี้เป็นภาษาที่คนส่วนใหญ่เรียนรู้ก่อน


2

ไลบรารีขนาดใหญ่เป็นจุดขายสำหรับ Java ใน ACM ICPC เป็นเรื่องสะดวกที่จะรู้ว่าคุณต้องการโครงสร้างข้อมูลแบบสุ่มหรืออัลกอริทึมและเพียงแค่ดึงออกจากไลบรารีมาตรฐาน


2

โปรดทราบว่า C ++ ไม่เพียง แต่เป็นส่วนใหญ่ในบรรดาผู้เข้าแข่งขันทั้งหมด แต่เมื่อรอบดำเนินไปเปอร์เซ็นต์ของมันก็จะคงอยู่และปรับปรุงไป

ฉันจะบอกว่ามันเป็นความจริงที่ผู้เข้าร่วมส่วนใหญ่เป็นนักเรียน (อย่างไรก็ตามเนื่องจากเป็นการแข่งขันแบบเปิดที่มีโอกาสสัมภาษณ์งานกับ Google คุณจึงต้องพิจารณาว่าหลายคนที่เข้าร่วมนั้นสำเร็จการศึกษาแล้ว) แต่รอบล่าสุดสำหรับผู้ที่มีประสบการณ์มากมายเท่านั้น พวกเขาไม่ใช่แค่นักเรียนที่เพิ่งเรียนรู้การเขียนโค้ดใน C ++ / Java

แน่นอนว่าอาร์กิวเมนต์ของนักเรียนยังใช้ได้กับภาษาเช่น LISP และ OcaML หรือ ProLog นั่นคือภาษาที่ใช้กันมากในด้าน AI แต่ในโลกกระแสหลักนักเรียนมีแนวโน้มที่จะเรียนรู้และใช้งานมากที่สุด

การแข่งขันที่ยิ่งใหญ่นอกเหนือจากการสนับสนุนของ Google ไม่กี่ภาษา แต่ก็ยังไม่สามารถอธิบายได้ว่าเหตุใด Pascal หรือ. net จึงไม่อยู่ใกล้ระดับ Java (เนื่องจากมักจะได้รับการสนับสนุนอย่างเท่าเทียมกันในกิจกรรมการแข่งขันที่สำคัญ)

นักเขียนโค้ดที่ดีที่สุดจำนวนมากในการแข่งขันเหล่านี้รู้ภาษามากมาย แต่พวกเขายังคงชอบที่จะใช้ C ++ ในระหว่างรอบมันต้องมีเหตุผลที่ใหญ่กว่า "เรียนรู้ C ++" ก่อน

ฉันจะโต้แย้งกับการอ้างว่าภาษาอื่นที่ไม่ใช่ C ++ หรือ Java เป็นเครื่องมือที่ดีกว่าสำหรับงานนี้ หากข้อมูลโดยตรงระบุว่าผู้เข้ารอบสุดท้ายมีแนวโน้มที่จะใช้ C ++ และ Java มันเป็นความขัดแย้งโดยตรงกับการอ้างสิทธิ์นั้น

ข้อมูลการแข่งขัน Google AI ไม่ได้ขัดแย้งกับหลักฐานใด ๆ เกี่ยวกับการติดขัดของโค้ด มันแสดงให้เห็นว่านักเขียนโค้ดชั้นนำสามารถใช้ภาษาเช่น Common Lisp ได้เมื่อเป็นเครื่องมือที่ดีกว่าสำหรับงานนี้อย่างแท้จริง หากเราต้องการใช้ข้อมูลนี้เพื่อสมมติว่า CLISP เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการแข่งขัน AI เราควรสมมติว่า C ++ เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการแข่งขันอัลกอริทึมเช่น GCJ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.