อัลกอริทึมสำคัญกว่าภาษาโปรแกรมหรือไม่


35

ในระหว่างการประกวดGoogle Code Jamปัจจุบัน (2013) มีปัญหาที่เกิดขึ้นกับคน C ++ และ Java มากกว่า 200 บรรทัดเมื่อเทียบกับคน Python ที่แก้ไขปัญหาเดียวกันโดยใช้รหัส 40 บรรทัดเท่านั้น

Python ไม่สามารถเทียบเคียงได้โดยตรงกับ C ++ และ Java แต่ความแตกต่างของคำฟุ่มเฟื่อยที่ฉันคิดว่าอาจมีอิทธิพลต่อประสิทธิภาพของอัลกอริทึม

การรู้อัลกอริทึมที่ถูกต้องสำคัญอย่างไรเมื่อเทียบกับการเลือกภาษา สามารถใช้โปรแกรม Python ที่ใช้งานได้ดีใน C ++ หรือ Java ในวิธีที่ดีกว่า (ใช้อัลกอริทึมเดียวกัน) และสิ่งนี้มีความสัมพันธ์กับการใช้คำฟุ่มเฟื่อยตามธรรมชาติของภาษาโปรแกรมบางภาษาหรือไม่?


16
มีการพูด (และฉันเชื่อว่า) ภาษาการเขียนโปรแกรมที่คุณทำงานมีอิทธิพลกับวิธีที่คุณคิดเกี่ยวกับปัญหา นี่แปลว่าภาษาการเขียนโปรแกรมที่แตกต่างกันมากอาจเหมาะกับปัญหาที่แตกต่างกัน
Joris Timmermans

1
สิ่งเหล่านี้มากมายขึ้นอยู่กับขนาดที่คุณกำลังทำอยู่นอกเหนือ LOC บางภาษาไม่รองรับความต้องการความเร็วหรือการทำงานพร้อมกัน อัลกอริทึมมีความสำคัญ แต่บางครั้งหากภาษา x ช้ากว่าภาษาซีคุณจะไม่สามารถใช้ x ได้โดยไม่คำนึงถึงความละเอียด
Rig

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

5
@Travis: "ข้อบกพร่องต่ออัตรา SLOC ยังคงไม่เปลี่ยนแปลงโดยไม่คำนึงถึงภาษา" แต่ก็ไม่เป็นความจริง ดูคำตอบของจอห์น
Ben Voigt

ตอนนี้คุณคิดว่าฉันจะเข้าร่วมการแข่งขันครั้งต่อไปโดยใช้ภาษา F #!
code4life

คำตอบ:


73

เห็นได้ชัดว่าถ้าคุณพิจารณาคำถามนี้ในบริบทของบางสิ่งบางอย่างเช่น Google Code Jam การคิดอัลกอริทึมนั้นมีความสำคัญมากกว่าเมื่อต้องแก้ปัญหาอัลกอริทึม

อย่างไรก็ตามในชีวิตประจำวันมีปัจจัยอื่นอีกกว่าล้านข้อที่ต้องนำมาพิจารณาเช่นกันซึ่งทำให้คำถามมีค่าน้อยกว่าสีดำกับสีขาว

เพียงแค่ตอบโต้ตัวอย่าง: หากคุณต้องการ Java มากกว่า 200 บรรทัด แต่ทุกคนใน บริษัท ของคุณรู้จัก Java นี่ไม่ใช่เรื่องใหญ่ หากคุณสามารถเขียนมันใน 5 บรรทัดของ Python หรือภาษาอื่น ๆ แต่คุณจะเป็นคนเดียวใน บริษัท ที่รู้ภาษานั้น - มันเป็นเรื่องใหญ่ จริง ๆ แล้วเป็นเรื่องใหญ่ที่คุณจะไม่ได้รับอนุญาตให้ทำเช่นนั้นและต้องเขียนใน Java แทน

จากมุมมองของช่างฝีมือเราพยายามที่จะเข้าถึงเครื่องมือที่เหมาะสมสำหรับงานเสมอ แต่คำพูดที่ถูกต้องในนั้นช่างยากที่จะเข้าใจผิดได้ง่าย

ในทางตรงกันข้ามฉันพบว่าการคิดขั้นตอนวิธีใน บริษัท ต่างๆเกือบจะขาดหายไป มีคนที่เลือกไม่กี่คนที่ได้รับมันในขณะที่ joe เฉลี่ยมักมีปัญหาในการประมาณความซับซ้อนของ runtime ของลูปการค้นหาและอื่น ๆ

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

โอ้และสุดท้ายให้แน่ใจว่าคุณเข้าใจความแตกต่างที่สำคัญระหว่างรหัสการแข่งขันอัลกอริทึมและรหัสการผลิตของ บริษัท ฉันเห็นโค้ดอัลกอริทึมที่ยอดเยี่ยมซึ่งเขียนโค้ดที่น่ากลัวที่ฉันจะไม่ยอมรับในผลิตภัณฑ์


1
+ 1 สำหรับ "ปัจจัยอื่น ๆ ล้านได้รับการพิจารณา"
Ozz

1
ฉันจะเพิ่มไปนี้ถ้าหากมันเป็นปัญหาการทำงานที่คุณพยายามที่จะแก้ไขแล้วเพื่อประโยชน์สวรรค์โปรดใช้ภาษาฟังก์ชั่น! ดังนั้นฉันขอยืนยันว่าคุณควรติดหนึ่งภาษาต่อกระบวนทัศน์การเขียนโปรแกรมที่สำคัญ
Martijn Verburg

6
+1 สำหรับประโยคสุดท้าย
Shivan Dragon

4
+1 บรรทัดของโค้ดเป็นตัวชี้วัดที่แย่มาก เราจำเป็นต้องวัดการบำรุงรักษาไม่ใช่บรรทัดของรหัส รหัสประเภทที่ปลอดภัย 200 บรรทัดสามารถรักษาได้มากกว่า Python ถึง 50 บรรทัด
Phil

2
@Phil: และไพ ธ อน 200 บรรทัดสามารถดูแลรักษาได้ดีกว่าโค้ดที่พิมพ์ได้ถึง 50 บรรทัด ฉันไม่เคยเห็นข้อได้เปรียบที่ชัดเจนมากในภาษาที่ปลอดภัยสำหรับประเภทโดยสมมติว่าโค้ดที่เขียนดี
David Thornley

17

ฉันจะโต้แย้งว่าแม้ภายนอกการแข่งขันการคิดอัลกอริทึมสำคัญกว่าการรู้เคล็ดลับสำหรับภาษาเฉพาะ

แน่นอนว่าคุณต้องการที่จะรู้ว่าภาษาที่คุณทำงานด้วยเป็นไปได้ แต่ภาษามาและไปในขณะที่ความสามารถในการคิดอย่างเป็นนามธรรมในแง่ของอัลกอริทึมเป็นทักษะที่ถ่ายโอนได้สูง

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

ฉันยอมรับว่าตัวอย่างนั้นง่าย แต่ก็ช่วยให้นำประเด็นไปได้


14

เรื่องภาษา

DARPA และกองทัพเรือสหรัฐฯทำการทดลองยิงเกือบ 20 ปีที่แล้ว ผู้ชนะที่หลบหนีม้ามืดคือ Haskell ทั้ง Ada และ C ++ ถูกแสดง Java ไม่ได้

ในเวลาเดียวกันแพรตต์แอนด์วิตนีย์ได้ทำการศึกษาการขุดข้อมูลเกี่ยวกับโครงการควบคุมเครื่องยนต์เจ็ทโดยดูที่บัตรลงเวลาและข้อมูลตัวติดตามบั๊ก พวกเขาค้นพบว่า Ada ให้ผลผลิตโปรแกรมเมอร์เพิ่มขึ้นสองเท่าและ 1/4 ความหนาแน่นข้อบกพร่องของภาษาอื่น ๆ ที่ใช้อยู่

อาตาริเคยใช้ FORTH เพื่อพัฒนาวิดีโอเกมและความจริงที่ว่าพวกเขาใช้ FORTH นั้นถือว่าเป็นกรรมสิทธิ์อย่างยิ่ง

ความคิดเห็นของ Paul Graham เกี่ยวกับการใช้ LISP เป็นที่รู้จักกันดี ความคิดเห็นของ Erann Gat เกี่ยวกับ LISP ที่ JPL นั้นมีความสำคัญเท่า ๆ กัน แต่ก็ไม่เป็นที่รู้จัก

โบอิ้ง 777 บินซอฟแวร์สวยมาก Ada ทั้งหมด ประสบการณ์ของพวกเขาดีมากแม้ว่าผู้รับเหมาช่วงรายใหญ่คนหนึ่งต้องเริ่มต้นใหม่ในช่วงกลางกระแส

เรื่องภาษา


เห็นได้ชัดว่าจาวาเปิดตัวหลังจากการทดสอบที่คุณเชื่อมโยง
toasted_flakes

บทความได้รับการปล่อยตัวในปี 1994 รุ่นสาธารณะครั้งแรกของ Java คือ 1995
Alessandro Teruzzi

ประเด็นก็คือไม่ใช่ว่าภาษาโปรดของคุณนั้นเป็นหรือไม่ได้เป็นตัวแทนในการทดลองหนึ่ง ประเด็นก็คือเรื่องภาษา มีการศึกษาประวัติจำนวนมากซึ่งแสดงให้เห็นอย่างชัดเจน เป็นที่น่าสังเกตว่าถึงแม้จะถูกปฏิเสธโดยโปรแกรมเมอร์ชาวอเมริกันส่วนใหญ่แล้ว Ada ก็ยังคงใช้กันอย่างแพร่หลายในยุโรปโดยเฉพาะอย่างยิ่งสำหรับระบบที่มีความน่าเชื่อถือสูงและยังคงใช้ในบางระบบในสหรัฐอเมริกา
John R. Strohm

7

บางจุด:

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

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

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

  • จำนวนเส้นตรงไม่ใช่เรื่องใหญ่อะไร เมื่อคุณมีประสบการณ์การเขียนโปรแกรมมากพอคุณจะรู้ว่าคุณสามารถใช้เวลา 10 นาทีในการเขียนโปรแกรม 10 บรรทัดหรือ 200 บรรทัดทุกอย่างขึ้นอยู่กับความซับซ้อนของบรรทัด นอกจากนี้หากคุณเขียนโค้ดที่คล้ายกันหลายร้อยครั้งคุณจะสามารถทำได้อย่างรวดเร็ว ไม่พูดถึงมาโครทั้งหมดที่ตัวแปลงสัญญาณ C / C ++ ชั้นนำมักจะใช้เพื่อเพิ่มประสิทธิภาพเวลาการเข้ารหัส

  • Frank เป็นจุดที่ดี - (นอกการแข่งขันเขียนโปรแกรม) คุณไม่สามารถเขียนโปรแกรมใน Python สำหรับ บริษัท ของคุณได้หากรหัสฐานทั้งหมดของพวกเขาอยู่ใน C หรืออะไรก็ตามคุณต้องปฏิบัติตามภาษาของพวกเขา

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


การหลอกลวง: การดาวน์โหลดวิธีแก้ปัญหาต่าง ๆ จากเว็บไซต์ประกวดรหัสบางแห่งเป็นการศึกษาทางวิทยาศาสตร์ที่ชัดเจนเพียงพอที่จะสรุปได้ว่าคุณรู้จริง ๆ แล้วว่าตำแหน่งบนสุดเป็นอย่างไร
Lie Ryan

@LieRyan True แต่การมีส่วนร่วมในการแข่งขันการเขียนโปรแกรมโหลไม่กี่ (ตามที่ฉันมี) บน (arguably) เว็บไซต์ดังกล่าวที่นิยมมากที่สุด (TopCoder) และมักจะเห็นตำแหน่งสูงสุดส่วนใหญ่เป็น C / C ++ / Java ค่อนข้างสำคัญ นอกจากนี้ฉันกล่าวว่า "มักจะ" ไม่ "อยู่เสมอ"
Dukeling

ไม่เห็นด้วยว่า "จำนวนเส้นตรงไม่ใช่เรื่องใหญ่" รหัสคือศัตรู
jk

6
@jk ฉันควรจะเน้น "เช่น" หรือไม่? มันสำคัญ แต่ไม่ใช่อัลฟาและโอเมก้า คุณต้องการบรรทัดน้อยกว่าในการอ่าน? ฉันไม่แน่ใจ ฉันจะใช้คำสั่ง if ง่าย ๆ สองสามข้อในการสับสนอย่างมากไม่สามารถอ่านได้การเลื่อนบิตการคูณการหารการเพิ่มการลบการ XORing และ ANDing การแสดงออกแบบหลายเงื่อนไขได้ทุกวัน อาจไม่ใช่สิ่งที่คุณพูดถึง แต่นั่นคือสิ่งที่การลดจำนวนบรรทัดลงมาเป็นบางครั้ง และฉันกำลังพูดถึงการใช้บางสิ่งที่ซับซ้อนในไม่กี่บรรทัดหรือบางสิ่งที่เรียบง่ายในหลายบรรทัด หลังมักใช้เวลาน้อยลง
Dukeling

5

ตรรกะเดียวกันนี้สามารถใช้งานได้ดีขึ้นใน C ++ หรือไม่ แน่นอนว่าถ้าทำได้ดีกว่าคุณหมายถึงเร็วขึ้นและมีประสิทธิภาพของหน่วยความจำมากขึ้น ปัญหาคือจำนวนของความพยายามที่จำเป็นในการทำเช่นนั้นจะสูงขึ้นอย่างมีนัยสำคัญ ยิ่งไปกว่านั้นในทางทฤษฎีคุณยังคงสามารถลดระดับลงและนำไปใช้งานใน C บริสุทธิ์หรือแม้แต่ ASM ซึ่งจะใช้เวลานานกว่า แต่คุณอาจมีโค้ดที่ปรับให้เหมาะสมยิ่งขึ้น

แน่นอนในกรณีของการแข่งขันเช่น Code Jam หรือ TopCoder มันไม่ใช่เรื่องใหญ่เพราะมันมีแค่ 40 ไลน์เทียบกับ 200 ไลน์ ในอีกทางหนึ่งในการแข่งขันประเภทนี้สิ่งที่สำคัญที่สุดคือความซับซ้อนของเวลา / พื้นที่ของอัลกอริทึม ในขณะที่ใช้งานจริง YMMV ในการแข่งขันประเภทO (n)อัลกอริทึมที่เขียนด้วยภาษาที่ช้าที่สุดจะชนะO (n²) ที่เขียนด้วยภาษาที่เร็วที่สุดเสมอ โดยเฉพาะอย่างยิ่งว่าจะมีการทดสอบหลายครั้งซึ่งเป็นสถานการณ์กรณีที่เลวร้ายที่สุด

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

C ++ กับ Python?

ป้อนคำอธิบายรูปภาพที่นี่

Python บริสุทธิ์ช้า นั่นเป็นสาเหตุที่ล่าม Python มาตรฐาน (CPython) เขียนด้วยภาษาซีทั้งหมดมีฟังก์ชั่นในตัวซึ่งเขียนว่า C Optimizer ยังสามารถใช้งานร่วมกับไลบรารี C ได้อย่างง่ายดาย (ผ่านctypesหรือโมดูล cpython ดั้งเดิม ) และกับไลบรารี C ++ ผ่านBoost :: หลาม วิธีนี้คุณสามารถเขียนตรรกะระดับสูงของคุณใน Python ซึ่งเป็นภาษาที่มีความยืดหยุ่นช่วยให้สามารถสร้างต้นแบบและปรับตัวได้อย่างรวดเร็ว (หมายถึงคุณสามารถใช้เวลาปรับแต่งและปรับปรุงอัลกอริทึมของคุณได้มากขึ้น) OTOH คุณสามารถเขียนฟังก์ชันไลบรารีระดับล่างในโมดูล C หรือ C ++ ตัวอย่างที่ดีของวิธีการนี้คือ SciPy ซึ่งเป็น Python library แต่ภายใต้การใช้งานจะใช้ไลบรารี่ตัวเลขที่ปรับให้เหมาะสมเช่น ATLAS, LAPACK, Intels MKL หรือ ACML ของ AMD


สิ่งที่คุณเขียนจะทำให้เกิดรอยถลอกบนพื้นผิวเท่านั้น คุณกำลังคิดว่า 'ดีกว่า' ที่ไม่ใช่ทุกคนแชร์ คุณภาพเป็นเรื่องของความเหมาะสมกับเป้าหมาย การเขียนโปรแกรมใน C ++ นั้นไม่เหมาะกับทุกเป้าหมายเสมอไป
reinierpost

1
@reierierpost: นั่นเป็นเหตุผลที่ฉันเขียนถึงความพยายามที่สูงขึ้นอย่างมีนัยสำคัญ ในกรณีที่คุณพูดถึง C ++ นั้นไม่เหมาะ แต่ไม่ใช่เพราะมันไม่สามารถทำได้ มันไม่เหมาะสมเพราะจะใช้ทรัพยากรของนักพัฒนามากเกินไป
vartec

ยิ่งไปกว่านั้นมันไม่ได้ดีกว่าในกรณีนี้
reinierpost

2
และในความเป็นจริงนี่คือสิ่งที่เกิดขึ้นในหลายอุตสาหกรรมตัวอย่างเช่นเกมมีรหัส Lua จำนวนมากที่ติดรหัส C ++ ไว้ด้วยกันเพื่อประสิทธิภาพและความสามารถในการผลิต
gbjbaanb

4

ในความคิดของฉันสิ่งที่ผู้คนเรียกขานว่า "ภาษาโปรแกรม" นั้นเป็นสามสิ่งที่แยกกัน

  1. ประเภทภาษาและไวยากรณ์
  2. ภาษา IDE
  3. ไลบรารีที่ใช้ได้สำหรับภาษา

ตัวอย่างเช่นเมื่อมีคนนำเสนอ C # ในการสนทนาคุณอาจคิดว่าเขา / เธอกำลังพูดถึงไวยากรณ์ภาษา (1) แต่มีความมั่นใจ 95% ที่การสนทนาจะเกี่ยวข้องกับ. Net framework (3) หากคุณไม่ได้ออกแบบภาษาใหม่มันยากและมักไม่มีจุดหมายที่จะแยก (1) และไม่สนใจ (2) และ (3) นั่นเป็นเพราะ IDE และไลบรารีมาตรฐานเป็น "ปัจจัยด้านความสบาย" สิ่งที่ส่งผลโดยตรงต่อประสบการณ์การใช้เครื่องมือบางอย่าง

ไม่กี่ปีที่ผ่านมาฉันก็มีส่วนร่วมใน Google Code Jam ครั้งแรกที่ฉันเลือกใช้ C ++ เพราะมีการสนับสนุนที่ดีสำหรับการอ่านอินพุต ตัวอย่างเช่นการอ่านจำนวนเต็มสามจำนวนจากอินพุตมาตรฐานใน C ++ มีลักษณะดังนี้:

int n, h, w;
cin >> n >> h >> w;

ในขณะที่อยู่ใน C # จะมีลักษณะเช่นนี้:

int n, h, w;
string[] tokens = Console.ReadLine().Split(' ');
n = int.Parse(tokens[0]);
h = int.Parse(tokens[1]);
w = int.Parse(tokens[2]);

นั่นเป็นค่าใช้จ่ายทางจิตที่มากกว่าสำหรับการใช้งานที่เรียบง่าย สิ่งต่าง ๆ มีความซับซ้อนมากขึ้นใน C # ด้วยอินพุตแบบหลายบรรทัด บางทีฉันก็ไม่ได้คิดวิธีที่ดีกว่ากลับมาแล้ว อย่างไรก็ตามฉันไม่ผ่านรอบแรกเพราะฉันมีข้อผิดพลาดที่ฉันไม่สามารถแก้ไขได้ก่อนจบรอบ แดกดันวิธีการอ่านอินพุตทำให้งงบั๊ก ปัญหานั้นง่ายอินพุตมีตัวเลขที่ใหญ่เกินไปสำหรับจำนวนเต็ม 32 บิต ใน C # int.Parse(string)จะทำให้เกิดข้อยกเว้น แต่ใน C ++ สตรีมไฟล์อินพุตจะตั้งค่าสถานะข้อผิดพลาดบางอย่างและล้มเหลวอย่างเงียบ ๆ ทำให้ผู้พัฒนาที่ไม่สงสัยไม่ได้ตระหนักถึงปัญหา

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

ในการสรุปให้ดีขึ้นการรู้ว่าอัลกอริทึมที่ถูกต้องช่วยได้อย่างไร ในการเขียนโปรแกรมการแข่งขันเป็นสิ่งสำคัญโดยเฉพาะอย่างยิ่งเมื่อทรัพยากรเช่นเวลาดำเนินการและหน่วยความจำมี จำกัด ในการพัฒนาแอปพลิเคชันก็ยินดีต้อนรับ แต่โดยทั่วไปไม่สำคัญ การบำรุงรักษามีความสำคัญมากกว่า มันสามารถทำได้โดยการใช้รูปแบบการออกแบบที่ถูกต้องมีสถาปัตยกรรมที่ดีรหัสที่อ่านได้และเอกสารที่เกี่ยวข้องและวิธีการเหล่านั้นทั้งหมดขึ้นอยู่กับห้องสมุดของ บริษัท และบุคคลที่สาม ดังนั้นฉันพบว่ามันสำคัญกว่าที่จะรู้ว่าล้อชนิดใดที่ถูกประดิษฐ์ขึ้นแล้วและพวกเขาจะทำอย่างไรให้เหมาะกับตัวเอง


1
การเตรียมการเป็นสิ่งสำคัญเมื่อเป็นไปได้ ด้วย Google Code Jam ฉันมีห้องสมุดขนาดเล็กที่อ่านอินพุตและแสดงเอาต์พุตตามที่พวกเขาต้องการและฉันรวมรหัสนั้นไว้ในการส่งของฉัน
Mark Hurd

ครั้งที่สองฉันทำสิ่งที่คล้ายกัน แต่เป็นเทมเพลตโครงการ มันสร้างไฟล์ต้นฉบับที่มีคลาสอินพุตด้านล่างMainและบางสิ่งภายในMainเมธอด (ตัวอย่างของคลาสอินพุตของฉันและสตรีมเอาต์พุตและลูปเคส)
Emperor Orionii

ฉันจำไม่ได้ว่าครั้งสุดท้ายที่ฉันอ่านจาก stdin ให้ไฟล์ที่ฉันสามารถใช้ parser กับ JSON ได้
gnasher729

2

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

Integer prev = b.get(k)
if (prev == null) prev = 0
Integer v = a.get(k);
if (v == null) v = 0;
b.put(prev + v);

แทน

b[k] += a[k]

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

NB

ความแตกต่างระหว่างรหัส 200 บรรทัดและรหัส 40 บรรทัดนั้นใหญ่มากและยิ่งใหญ่กว่าเดิมเมื่อความแตกต่างระหว่าง 200,000 รายการโปรแกรมและ 40,000 รายการโปรแกรม ถ้าเช่นนั้นความแตกต่างระหว่างทีมห้าคนบวกผู้จัดการและทีมหนึ่งหรือสองคน


3
(a) ฉันรู้ว่า C / C ++ / Java มีแนวโน้มที่จะเป็นตำแหน่งสูงสุดในการแข่งขันการเขียนโปรแกรม (b) C / C ++ ถือเป็น "ภาษาที่ทรงพลังที่สุด" โดยหลายคน (เหนือแน่นอน Perl / Ruby / Python) (c) เนื่องจากตัวดำเนินการโอเวอร์โหลดรหัส C ++ สามารถดูเกือบเหมือนตัวอย่างที่สองของคุณ (d) การตรวจสอบอย่างละเอียด (ใน Java ใช่ไหม?) จำเป็นเฉพาะเมื่อ: (1) คุณไม่รู้ว่าคุณกำลังทำอะไรอยู่ (2) ลักษณะของข้อมูลเป็นสิ่งที่จำเป็น (ไม่เกิดขึ้นในการแข่งขันการเข้ารหัส) (3) คุณกำลังเขียนรหัสที่บุคคลอื่นจะใช้ (ไม่เกี่ยวข้อง)
Dukeling

1
@Dukeling: จากการศึกษาครั้งนี้ ( page.mi.fu-berlin.de/prechelt/Biblio/jccpprtTR.pdf ) ภาษาสคริปต์ทำให้การพัฒนาเร็วขึ้นและมีซอร์สโค้ดเล็กลง จากการศึกษาอีกครั้งหนึ่ง ( flownet.com/gat/papers/lisp-java.pdf ) Lisp นำเสนอประสิทธิภาพการทำงานมากกว่าภาษาสคริปต์ จากการศึกษาครั้งที่สองที่อ้างถึงข้างต้นรหัส Lisp กลายเป็นเกือบเร็วเท่ากับรหัส C ++ ในขณะที่ใช้เวลาเขียนน้อยลง
Giorgio

"ระหว่าง 200,000 รายการโปรแกรมและ 40,000 รายการโปรแกรม": ฉันคิดว่าคุณต้องแยกแยะ ความแตกต่างอันเนื่องมาจากการเขียนโปรแกรมภาษา verbosity (ไวยากรณ์) ไม่ได้เพิ่มความซับซ้อนให้กับรหัสและดังนั้นอาจมีผลกระทบเล็กน้อยต่อความพยายามในการบำรุงรักษาที่จำเป็น ในอีกทางหนึ่งคุณสามารถมีจำนวนบรรทัดที่แตกต่างกันเนื่องจากคุณสมบัติภาษาที่แตกต่างกัน เช่นใน Python คุณไม่จำเป็นต้องจัดการหน่วยความจำในขณะที่อยู่ใน C คุณต้องใช้การจัดการหน่วยความจำทั้งหมดด้วยตัวเอง จากนั้นฉันเห็นด้วยกับคุณว่าในรหัส C คุณมีฟังก์ชั่นการใช้งานมากขึ้นและคุณต้องใช้เวลาบำรุงรักษาเป็นพิเศษ
Giorgio

@Giorgio ฉันไม่ได้โต้แย้งเกี่ยวกับเวลาในการพัฒนาหรือขนาดของซอร์สโค้ดสิ่งที่เกิดขึ้นจริงในการแข่งขันการเขียนโปรแกรมตามประสบการณ์ที่สำคัญ
Dukeling

1
ฉันอ้างถึงเอกสารทางวิทยาศาสตร์สองฉบับ (ซึ่ง IMO น่าดูอยู่) ฉันไม่ได้พูดเกี่ยวกับสิ่งที่ผู้คนในหน้าเว็บคิด ความจริงที่ว่าความคิดเห็นเป็นที่แพร่หลายไม่ได้หมายความว่ามันถูกต้องโดยอัตโนมัติ :-) อย่างน้อยต้องมีการยืนยันอย่างเข้มงวด
Giorgio

2

อัลกอริทึมใด ๆ ที่สามารถนำมาใช้ในภาษาการเขียนโปรแกรมใด ๆ ท้ายที่สุดมันไม่ใช่ไวยากรณ์ที่สำคัญ แต่การใช้ภาษาระดับสูงเช่น Python มีข้อดีของตัวเอง ทำงานน้อยลงและมีการเข้ารหัสน้อยลง ดังนั้นในการใช้อัลกอริทึมใน Python คุณจะต้องมีบรรทัดน้อยกว่าที่ต้องการในภาษาระดับต่ำเช่น C

Python มีโครงสร้างข้อมูลส่วนใหญ่อยู่ในไลบรารี แต่ใน C เราต้องเริ่มจากศูนย์และใช้โครงสร้างเพื่อสร้างมันขึ้นมาทั้งหมด แน่นอนว่ามีความแตกต่างระหว่างภาษาระดับสูงและระดับต่ำ แต่ภาษาไม่ควรหยุดคุณจากการใช้อัลกอริทึมใด ๆ


2

ในขณะที่อนุมานตัวอย่าง "40 LoC กับ 200 LoC" โดยกล่าวว่า "เพียงหนึ่งในห้าของ LoC ทั้งหมดนั้นเร็วกว่าที่จะเขียนดังนั้นจึงต้องดีกว่า" อาจดูเหมือนน่าดึงดูดฉันคิดว่ามีความจริงเล็กน้อยที่จะพบที่นั่น

การปรับให้เหมาะสมสำหรับ LoC ที่น้อยที่สุดนั้นแทบไม่เคยเป็นความคิดที่ดีเลยในความคิดของฉัน ใช่ LoC ที่เขียนทุกอันมีศักยภาพสำหรับข้อบกพร่องและคุณไม่จำเป็นต้องแก้ไขข้อบกพร่องในสิ่งที่คุณไม่เคยเขียน etcetc ประเด็นคือเพิ่มประสิทธิภาพสำหรับการอ่านและ decoupledness ไม่สำคัญว่าคุณจะแก้ปัญหาโดยใช้ regex ขนาดใหญ่ 20 บรรทัดซึ่งตรงข้ามกับการเขียนโมดูล 1k LoC Regex นั้นจะเป็นกำแพงทึบ, มีแนวโน้มที่จะเป็นโรคจิต, ยากที่จะเข้าใจ, ฝันร้ายที่จะเปลี่ยนแปลงโดยไม่เปลี่ยนพฤติกรรมของมันในรูปแบบที่ไม่น่าสนใจ ฯลฯ

การกำจัด boilerplate และความฟุ่มเฟื่อยที่ไม่เพิ่มคุณค่าใด ๆ เป็นสิ่งที่ดีและดี แต่ในทางกลับกันการใช้บางอย่างเช่น Java หรือ C # มีความรู้เกี่ยวกับรูปแบบการออกแบบและเครื่องมือเช่น resharper ช่วยให้คุณยืดหยุ่นมากในการปรับรหัส ทำความสะอาดเมื่อเวลาผ่านไปทำลายสิ่งต่าง ๆ และอื่น ๆ ที่อาจจะยากกว่านี้ถ้าคุณเขียนมันเป็นสคริปต์หลามขนาดเล็กหรือแอปทับทิม

การเปรียบเทียบที่บอกได้ดี: ฉันอยากจะมีรหัส C # ที่ครอบคลุมการทดสอบ decoupled C # 100k เต็มไปด้วยสิ่งที่ "overkill" เช่นรูปแบบกลยุทธ์โรงงาน ฯลฯ มากกว่าแอพหลาม 20k ที่เพิ่ง "ทำสิ่งต่างๆ" รหัสมากกว่า 5 เท่าหรือไม่สถาปัตยกรรมชนะทุกวัน

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

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