จัดรูปแบบรายการคำ


16

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

อินพุต

อินพุตจะเป็นรายการคำที่คั่นด้วยช่องว่างแล้วตามด้วยหมายเลขอย่างน้อย 4

เอาท์พุต

เอาต์พุตควรเป็นคำอินพุตที่จัดกลุ่มเป็นบรรทัดเพื่อให้ไม่มีบรรทัดใดที่มีอักขระมากกว่าจำนวนอินพุต คำควรจะถูกส่งออกในลำดับที่พวกเขากำลังป้อน คำควรคั่นด้วยเครื่องหมายจุลภาคแล้วเว้นวรรคยกเว้นท้ายบรรทัดแต่ละบรรทัดโดยไม่จำเป็นต้องเว้นวรรค หากคำยาวเกินกว่าที่จะพอดีกับบรรทัดคำนั้นควรถูกตัดออกให้น้อยที่สุดเท่าที่จะเป็นไปได้ในขณะที่ทำตามกฎอื่น ๆ และควรเพิ่ม "... " ในตอนท้าย

กรณีทดสอบ

Input:
foo bar baz qux 12

Output:
foo, bar,
baz, qux


Input:
foo bar baz qux 5

Output:
foo,
bar,
baz,
qux


Input:
strength dexterity constitution intelligence wisdom charisma 10

Output:
strength,
dexterity,
consti...,
intell...,
wisdom,
charisma


Input:
quas wex exort 4

Output:
...,
wex,
e...


คำตอบ:


10

อ่านไม่ได้ 2559 ไบต์

ความท้าทายนี้เหมาะอย่างยิ่งสำหรับ Unreadable

รุ่นแรกของรุ่นนี้คือ 3379 ไบต์เพียงเพื่อให้คุณทราบว่าฉันเล่นกอล์ฟนี้มากแค่ไหน

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

' '' '' ''' "" "" "" "" " '' ' ' '''' ' ' '''' ' ' ''''" '' "" '' ''"" " " ' '' '' '''" " '' ' ' '' '' '' '' '''' '' '' ' ' '' '' '''' '' '' ''" " "" " ' '''" "" "" "" ' '' '' '' ''' "" " ' '' '' '' '''" "" "" "" """"" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" " ''""" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' '' ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ' '"'' ''' "" """ " ''"" "" " ' '' '' '''" "" "" "" " ' '' ' ' '' '' '' '''' '' '' '''" "" "" "" " ''" ' '' "' '' '' "" '' '' '' ' ' '' '' '''' '' '' ''" " '' ' '"'' '' "" "" ' '' '' '' ''' "" " ' '' '''" "" " ' '' '' '''" " ''" " '' ''""" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" "" '' '' '' "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' "' ''""" ' ''' "" "" "" ' ''' " ' '' ' ' '' '' '' '''' '' '' ''' "" '"' "" "' "" "" "" '"' "" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''"" " '' '' '' " '"'" "" ' '' '' ''' "" '"' "" " ' '' '' ' ' '' '' '''' '' '' '''"""" "" "" ' '' ' ' '' '' '' '''' '' '' ''' "" "" "" " ' '' '' '' '''" "" "" "" "" " '"'" "" ' ''' "" "" "" " '"'" "" " '' '' ' ' '' '' ''''" '' " ' '' '' '' ''' "" "" "" " '"'" "" ' '' '' ''' "" """ ' '' "' '' ''"" "" ' '' '' '' "' '' ' ' '' ' ' '' '' '''' ' ' '''' ' '"'' '''' " '"' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" "" "" ' ''' "" ' ''' "" "" " '' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' ''''" " ''' ''' "" ' ''' "" ' ''' "" ' ''' "" "" "" ' ''' "" '' ' ' '''' ' ' ''''" "" "" ' '' '' '' ''' "" " ' '''" " ' '''" " ' '''" " ' '' ''"'" """ ''" ' '' '' ' ' '' '' '' ' ' '''' '' '' '''' '' '' '' "' '' ' ' '' '''' ''" """ "" ' '' '' "' '' '' '' ' ' '' '' '''' '' '' ''" ' '' ' ' '''' '' '' ''' "" "" "" "" ' '' ' ' '' '' "'' ''' "" "" "" "" ' '' '' ''"' '' "" '' ''" "" "" ' '' '' ''' " ' '' ' ' '' '' '' ' ' '''' '' '' '''' '' '' ''"'"" " ' '' ''"'" "" ' '' '' '' ''' "" "" "" "" ''" ' '' "' '' ''" " '' '' "" " ' '' '' '''" "" "" "" " ' '' ' ' '' '' '' '''' '' '' '''" "" "" "" "' "" "" '' ' ' '' '' '''' ' ' '''' ' '' "' '' '' '' '' "" '' '' ''" """" "" "" "" ' '' '' '' ' ' '''' ' '"'' ''' "" """ " ''" ' '' '' '' ''' "" "" "" "" ''" ' '' '' ''"' '' ' ' '' '''' '' "" '' '' '' ''"" '' '' '' " ' '''" " '"'" "" ' ' ' '' '' '' ' ' '''' ' ' '''' ' '"'' '''' '''"" "" "" '' '' '' ' ' '' '' '''' '' '' '' ' ' '' ' ' '''' '' '' '''' '' '' "" "" ''"" ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''"'"" ' ''' "" "" "" " ' '' '' '' ' ' '' '' '' '''' '''" "" "" "" "" " '' ''" "" '"' "" """ " '' '' '' ' ' '''' ' ' ''''" '' "" '' ' ' '' '''' ''"" "" "" "" "" " ' '' '' '' ' ' '''' ' '"'' '''" "" ' '' ''' "" """ ''"" ' '' '''" "" "" ' '' '' '' ''' "" "" "" " ' '' ''"'" "" ' ''' "" "" "" " ''" ' '' "' '' '' '' '' ' ' '' '' '' ' '"'' '''' '' '' " '' ' ' '''' "" "" "" ' '' "' ''" " '' '' ' ' '''' '' '' ' '' ' ' '''' '' '' ''"'"" " ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' ''''" '"' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' '' '' '' ' ' '' '' '''' '' '' '' ' ' '' ' ' '''' '' '' '''' '' '' '' "'""" '"' """ ' '' '' "' '' '' '' ' ' '' '' '''' '' '' '' "" '' ' ' '''' ''" "" " ' '' '' '' '''" "" ' ''' "" " '' '' '' ' ' '''' ' ' ''''" '' "" ''" "" "" "" ' '' '' '' ' '"'' '''" " '' '' '' ' ' '''' ' ' '''' ' ''"'"" """" '' '' '' ' ' '''' " '' ' ' '' '' '' '''' '' ''" '' "" '' "

คำอธิบาย

thyme horseradish peppermint 10ฉันจะเดินคุณผ่านวิธีการที่โปรแกรมประมวลผลการป้อนข้อมูล thyme,\nhorser...,\npeppermintการส่งออกที่คาดไว้คือ

ก่อนอื่นเราเริ่มที่เซลล์ # 7 และอ่านอินพุตทั้งหมด แต่ลบ 32 จากตัวละครทุกตัวเพื่อให้ช่องว่างกลายเป็นศูนย์

ด้วยเหตุผลที่ชัดเจนสิ่งนี้จะทำให้ตัวชี้ที่กำลังทำงานอยู่ (ชื่อpที่นี่เก็บไว้ในเซลล์ # 0) ในตอนท้าย เราใช้หนึ่งในขณะที่วงเพื่อค้นหาช่องว่างสุดท้ายซึ่งเป็นจุดเริ่มต้นของจำนวนที่กำหนดความกว้างของการส่งออก (เซลล์ # 36 ในตัวอย่างนี้)

ตอนนี้เราต้องการถอดรหัสตัวเลข (เช่นแปลงจากทศนิยม) ผลสุดท้ายจะเป็นทั้งในเซลล์TและR เราพึ่งพาความจริงที่ว่าพวกเขาเริ่มต้นที่ศูนย์

สำหรับตัวเลขทุกหลักให้ทำดังต่อไปนี้:

  • ตั้งค่าtเป็น −15
  • ใน a while loop, decrement r (ซึ่งมีผลลัพธ์จนถึง) ถึง −1 (เพราะเราต้องการการวนซ้ำrแต่เนื่องจากการลดลงเกิดขึ้นก่อนที่มันจะถูกตรวจสอบว่าเป็นเงื่อนไขของ while loop การลดลงถึง 0 จะทำให้ซ้ำน้อยลงหนึ่งครั้ง) และแต่ละซ้ำเพิ่ม 10 ตัน ตอนนี้tมี 10 เท่าของผลลัพธ์ก่อนหน้าลบ 15
  • อีกครั้งในขณะที่ห่วงพร่องp * 0 และสำหรับแต่ละซ้ำเพิ่ม 1 ถึงที หลังจากtนี้มีผลลัพธ์ระดับกลางที่ถูกต้องจนถึง: อักขระ'0'ที่'9'มีรหัส ASCII 48–57 ดังนั้นหลังจากการลบ 32 ก่อนหน้านี้คือ 16–25 ดังนั้นเราจึงบวก 15–24 เป็นtซึ่งยกเลิกด้วย −15 เราตั้งค่าไว้ก่อนหน้า นอกจากนี้ยังเป็นสิ่งสำคัญที่ศูนย์นี้เซลล์ที่ใช้ในการประกอบด้วยอักขระหลักเพื่อให้รหัสที่ตามมาสามารถจดจำจุดสิ้นสุดของรายการของคำ
  • ชุดRเพื่อผลกลางใหม่เพื่อให้ซ้ำไปพบมันในR (โปรดทราบว่าเราไม่จำเป็นต้องอ่านจากtอีกครั้งเราสามารถใช้ค่าสุดท้ายจากก่อนหน้าขณะที่ลูปเพราะเรารู้ว่า* pไม่สามารถเป็นศูนย์ได้ดังนั้นจึงมีการเรียกใช้อย่างน้อยหนึ่งครั้ง)

ในที่สุดเราใช้อีกอย่างง่าย ๆ ในขณะที่วน (ลดค่าtเป็นตัวนับ) เพื่อแปลงจำนวนที่เราเพิ่งคำนวณเป็นเอกภาพ เราเก็บสตริงของ 1s ที่เหลือจากเซลล์ # 0 สิ่งนี้ขึ้นอยู่กับข้อเท็จจริงที่ว่าเซลล์ # 1 ซึ่งเป็นตัวชี้การทำงานของเราสำหรับสิ่งนี้ ( q ) เริ่มต้นที่ 0 เราได้รับ 1 วินาทีน้อยลงเพราะในขณะที่ลูปใน Unreadable นั้นเป็นเช่นนั้น:

หลังจากนี้เราไม่ต้องการค่าเป็นrดังนั้นเราจึงใช้เซลล์นั้นอีกครั้งเพื่ออย่างอื่น เรารีเซ็ตพอยน์เตอร์pและqและกำหนดค่าเริ่มต้นบางเซลล์ด้วยรหัสอักขระ ASCII ที่เราต้องการในภายหลัง ฉันได้ระบุcและsซึ่งเราจะใช้ในภายหลังและเราจะพึ่งพาความจริงที่ว่าsเริ่มต้นที่ศูนย์:

เดี๋ยวก่อนเดี๋ยวก่อน ทำไมเซลล์ # 0 ถึงมีสีแดง? ... ดีนี่คือการเน้นเคล็ดลับลับ ๆ ล่อ ๆ จำได้ไหมว่าเราให้ผลลัพธ์ 1 น้อยเกินไป เคล็ดลับคือเราใช้เซลล์ # 0 เป็น "ส่วนขยาย" เพื่อแก้ไขให้ถูกต้อง มันใช้งานได้เพราะเรารู้ว่าpจะไม่เป็น 0 ด้วยวิธีนี้บล็อกสีแดงตอนนี้กว้าง 10 เซลล์ตามจำนวนที่เราต้องการ นอกจากนี้ยังบันทึกอักขระ 9 ตัวเพื่อให้สามารถเริ่มต้นqเป็น 1 แทน 0

ตอนนี้เราเข้าสู่ห่วงขณะที่ผ่านคำและเอาท์พุทพวกเขาทั้งหมด

ขั้นตอนที่ 1: ค้นหาว่าคำถัดไปจะพอดีกับบรรทัดปัจจุบันหรือไม่ เราทำสิ่งนี้โดยเพียงแค่เลื่อนpไปทางขวาและqเหลือด้วย a วนรอบจนกว่าpจะไปถึงช่องว่างถัดไป:

ตอนนี้pอยู่ทางขวาของคำเราสามารถตรวจสอบว่านี่เป็นคำสุดท้ายในรายการโดยตรวจสอบว่า* (p + 1)เป็นศูนย์หรือไม่ เราเก็บค่านั้นไว้ด้วย (ซึ่งในตัวอย่างของเราคือ 72 เพราะมันคือ "h" จาก "พืชชนิดหนึ่ง" ลบ 32) ในcเพราะเราจะต้องการมันอีกครั้งในภายหลัง ในกรณีนี้มันไม่เป็นศูนย์ดังนั้นเราจะต้องส่งออกเครื่องหมายจุลภาคพร้อมกับคำดังนั้นคำจึงยาวหนึ่งตัวอักษร พิจารณาเรื่องนี้โดยการลดqอีกครั้ง ในที่สุดให้ใช้อีกอันหนึ่งขณะวนซ้ำเพื่อย้ายpกลับไปที่จุดเริ่มต้นของคำ

ตอนนี้เรารู้แล้วว่าคำจะพอดีกับบรรทัดปัจจุบันเนื่องจากqชี้ไปที่ค่าที่ไม่ใช่ศูนย์ดังนั้นสิ่งที่เราต้องทำคือ:

  • เลื่อนหน้าไปข้างหน้าผ่านคำอีกครั้งพิมพ์ตัวละครแต่ละตัว (บวก 32 เพราะทุกรหัส ASCII จะปิดโดย 32)
  • หากcไม่ใช่ศูนย์ให้พิมพ์เครื่องหมายจุลภาค (โดยใช้ค่าในเซลล์ # 5)
  • ตั้งค่าเป็นค่าที่ไม่ใช่ศูนย์เพื่อระบุการวนซ้ำครั้งถัดไปที่เราไม่ได้อยู่ที่จุดเริ่มต้นของบรรทัดอีกต่อไปดังนั้นจึงจำเป็นต้องแสดงอักขระเว้นวรรคก่อนคำถัดไป (เราใช้ค่าส่งคืนของคำสั่งพิมพ์ด้านบนสำหรับสิ่งนี้ซึ่งคือ 44 สำหรับเครื่องหมายจุลภาค)

จนถึงปัจจุบัน: thyme,

จากนั้นการวนซ้ำครั้งต่อไปของลูปใหญ่จะเริ่มขึ้น ก่อนหน้านี้เราตรวจสอบว่าคำถัดไปเหมาะกับส่วนที่เหลือของบรรทัดโดยการลดqเมื่อเราอ่านคำจากซ้ายไปขวาหรือไม่ โปรดทราบว่าqยังคง −5 จากการวนซ้ำก่อนหน้านี้ติดตามจำนวนอักขระที่เราได้พิมพ์ไปแล้วในบรรทัดปัจจุบัน หลังจากการนับตัวอักษรใน "พืชชนิดหนึ่ง", บวกหนึ่งสำหรับเครื่องหมายจุลภาค, บวกหนึ่งเพราะsไม่ใช่ศูนย์แสดงว่าเราจำเป็นต้องส่งออกพื้นที่เช่นกันqจะมี overshot จุดสิ้นสุดของบล็อก 1s:

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

  • พิมพ์ newline (ใช้เซลล์ # 3)
  • ตั้งค่าqกลับเป็น 1
  • ตั้งค่าเป็น 0

จนถึงปัจจุบัน: thyme,\n

สำหรับการทำซ้ำครั้งต่อไปpอยู่ในตำแหน่งเดิมเหมือนเดิมดังนั้นเราจะดูคำเดิมอีกครั้ง เมื่อก่อนเรานับตัวละครใน“มะรุม” ชุดCถึง 80 อีกครั้งเมื่อเราสังเกตเห็นมีคำอื่นหลังจากนี้พร่องQสำหรับจุลภาคและย้อนกลับหน้ากลับไปยังจุดเริ่มต้นของคำว่า:

เช่นเดียวกับในการทำซ้ำครั้งก่อนเราพบว่า "พืชชนิดหนึ่ง" ยังคงไม่เหมาะสมเพราะqสิ้นสุดลงในเซลล์ที่มีค่าเป็นศูนย์ แต่เวลานี้sเป็นศูนย์ซึ่งหมายความว่าเราทำสิ่งที่แตกต่างจากครั้งที่แล้ว เราจำเป็นต้องเอาท์พุทของคำบางจุดสามจุดและเครื่องหมายจุลภาค ความกว้างของเราคือ 10 ดังนั้นเราต้องเอาท์พุทตัวอักษร 6 ตัว เรามาดูกันว่าเราอยู่ที่ไหนถ้าเรา:

  • ค้นหาจุดเริ่มต้นของบล็อกสีแดง 1s เราทำได้โดยไปทางขวาเพราะเรารู้ว่าคิวต้องจากไป
  • เพิ่มqอีกครั้งถ้าเราจำเป็นต้องใช้คอมม่า ( c ≠ 0) ด้วย

ตอนนี้เทปดูเหมือนดังนี้:

ฉันทำเครื่องหมายเซลล์ 6 เซลล์ที่นี่ อย่างที่คุณเห็นเราต้องเอาท์พุทอักขระจนกระทั่งq = −1 นี่เป็นโค้ดที่มีประสิทธิภาพในการตรวจสอบ (โดยทั่วไปwhile ((++q)+1) { ... }) ดังนั้น:

  • พิมพ์ตัวอักษรเหล่านั้น (บวก 32 เพราะรหัส ASCII ทั้งหมดปิดด้วย 32) จนกระทั่งถึงคิว −1 pจะอยู่ที่เซลล์ 19 ตรงกลางของคำว่า "พืชชนิดหนึ่ง"
  • พิมพ์สามจุด เนื่องจากคำสั่ง print ส่งคืนอาร์กิวเมนต์ของตัวเองเราจึงสามารถเขียนโค้ดได้อย่างมีประสิทธิภาพ (โดยพื้นฐานprint(print(print('.')))) เราใช้ค่า ASCII จากเซลล์ # 5 และเพิ่ม 2 เข้าไปเพื่อรับรหัส ASCII ของจุด
  • ย้ายpไปยังจุดสิ้นสุดของคำ เนื่องจากเรารู้ว่าเราไม่สามารถไปถึงจุดสิ้นสุดของคำได้แล้ว (เพราะคำนั้นยาวเกินไปและเราต้องลบอย่างน้อย 3 ตัวอักษรออกจากมันเพื่อให้พอดีกับจุด) วงนี้มีการวนซ้ำอย่างน้อยหนึ่งครั้งดังนั้น มันสั้นกว่าในรหัสเพื่อให้เนื้อความของ while loop คำนวณค่า ASCII สำหรับจุดแล้วส่งค่าส่งคืนของ while loop ไปยังฟังก์ชันการพิมพ์
  • พิมพ์เครื่องหมายจุลภาคหากcไม่ใช่ศูนย์

หลังจากทั้งหมดนี้เรายังพิมพ์ newline (โดยใช้เซลล์ # 3) และตั้งค่าqกลับเป็น 1 เรายังสามารถตั้งค่าsเป็น 0 แม้ว่ามันจะเป็น 0 อยู่แล้วซึ่งทำให้สิ่งนี้เหมือนกับที่เราเคยทำเมื่อก่อน บรรทัดถัดไป (เมื่อsคือไม่ใช่ศูนย์) ดังนั้นเพื่อหลีกเลี่ยงการทำซ้ำรหัสที่เราทำมันหลังจากที่มีเงื่อนไขว่าการตรวจสอบของ

จนถึงปัจจุบัน: thyme,\nhorser...,\n

เหลืออีกหนึ่งรอบเท่านั้น เวลานี้หลังจากนับตัวอักษรของคำเราได้รับ:

เวลานี้มีอะไรหลังจากที่พีดังนั้นเราจึงตั้ง 0 เพื่อบ่งบอกถึง“ไม่มีเครื่องหมายจุลภาค” และตามที่เราทำไม่ได้ลดลงคิวเป็นเวลาต่อไป เนื่องจากqตอนนี้ชี้ไปที่เซลล์ที่ไม่เป็นศูนย์เรารู้ว่าคำจะพอดีดังนั้นรหัสเดียวกันจะถูกดำเนินการในการทำซ้ำครั้งแรกยกเว้นว่าเวลานี้cเป็นศูนย์ดังนั้นมันจะไม่พิมพ์เครื่องหมายจุลภาค

เอาท์พุท: thyme,\nhorser...,\npeppermint

ในคำแนะนำนี้ฉันไม่ได้รวมกรณีที่รหัสจะพิมพ์ช่องว่าง แต่ฉันคิดว่ามันควรจะชัดเจนในขณะนี้ หากรหัสพบว่าคำที่เหมาะกับ ( * q ≠ 0) และsไม่เป็นศูนย์มันจะส่งออกช่องว่างก่อนคำ


3

JavaScript (ES6), 171

เป็นฟังก์ชั่นที่ไม่ระบุชื่อส่งคืนเอาต์พุตเป็นอาร์เรย์

(โดยทั่วไปจะได้รับอนุญาตเว้นแต่จะห้ามอย่างชัดเจน: เม ตาเมตา )

s=>(s=s.split` `,n=s.pop()-1,t='',o=[],s.map((w,i)=>(w=w[n+=!s[i+1]]?w.slice(0,n-3)+'...':w,(t+w)[n-2]&&(t&&o.push(t.slice(1)),t=''),t+=` ${w},`)),o.push(t.slice(1,-1)),o)

f=s=>(s=s.split` `,n=s.pop()-1,t='',o=[],s.map((w,i)=>(w=w[n+=!s[i+1]]?w.slice(0,n-3)+'...':w,(t+w)[n-2]&&(t&&o.push(t.slice(1)),t=''),t+=` ${w},`)),o.push(t.slice(1,-1)),o)

// Less golfed
U=s=>(
  s=s.split` `,
  n=s.pop()-1,
  t='', // current line
  o=[], // output
  s.map( (w,i)=>(
    w=w[
      n+=!s[i+1] // space for 1 more char on the last line
    ]?w.slice(0,n-3)+'...':w, // change w if it is too long
    (t+w)[n-2]&& ( // if current line + w is too long, ouput t and reset current line
      t&&o.push(t.slice(1)),t=''
    ),
    t+=` ${w},`
  )),
  o.push(t.slice(1,-1)), // remove tailing comma on last line
  o
)

console.log=x=>O.textContent+=x+'\n\n';
  
console.log(f("foo bar baz qux 12").join`\n`)
console.log(f("foo bar baz qux 5").join`\n`)
console.log(f("strength dexterity constitution intelligence wisdom charisma 10").join`\n`)
console.log(f("quas wex exort 4").join`\n`)
<pre id=O></pre>


1

Python 2, 206 ไบต์

i=input().split()
l=int(i.pop())
i=[[w[:l-4]+'...',w][len(w)<l]+','for w in i][:-1]+[[w,w[:l-3]+'...'][len(w)>l]]
r=[i.pop(0)]
for w in i:
 if len(r[-1])+len(w)<l:r[-1]+=' '+w
 else:r+=[w]
print'\n'.join(r)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.