จัดข้อความชิดขอบโดยเพิ่มช่องว่าง


10

รับข้อความนี้

Loren ipsum dolor amet amet, aditisur adipisicing elit, sed do eiusmod tempic incididunt ut labore et dolore magna aliqua. สำหรับสิ่งที่น้อยที่สุดคือการออกกำลังกายที่เต็มไปด้วยสิ่งต่าง ๆ เช่นสิ่งที่เกิดขึ้นกับสินค้าโภคภัณฑ์ ต้องมีสีที่บริสุทธิ์ใน reprehenderit ใน voluptate velit esse cillum dolore eu fugiat nulla pariatur ยกเว้นบางครั้งเกิดเหตุการณ์ที่ไม่เป็นไปได้, ในขณะที่ culpa ที่มีคุณภาพที่ดีที่สุดที่จะทำให้คุณเคลื่อนไหว

เขียนโปรแกรมที่สั้นที่สุดที่สร้างข้อความเดียวกันที่มีความยาว 80 ตัวอักษร ข้อความด้านบนจะต้องตรงกับ:

Lorem ipsum dolor sit amet,  consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut  labore et  dolore magna aliqua.  Ut  enim ad  minim veniam,  quis
nostrud exercitation ullamco laboris nisi ut  aliquip ex  ea  commodo consequat.
Duis aute irure dolor in  reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur.  Excepteur sint occaecat cupidatat non proident,  sunt in
culpa qui officia deserunt mollit anim id est laborum.

กฎ:

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

ผู้ชนะ:โปรแกรมที่สั้นที่สุด

หมายเหตุ:สตริงอินพุตมีอยู่ใน STDIN เป็นหนึ่งบรรทัด (ไม่มีการป้อนบรรทัดหรือการขึ้นบรรทัดใหม่)

อัปเดต:

สตริงอินพุตสามารถเป็นข้อความใด ๆ ที่มีความยาวของคำที่สมเหตุสมผล (เช่นไม่เกิน 20 ~ 25 อักขระ) เช่น:

Lorem ipsum dolor sit amet, consetetur adipiscing elit. เสดไม่ใช่ risus สิ่งที่ต้องทำคือความทรมาน, นั่งน้อยลง, adeciscing nec, ultricies sed, dolor. องค์ประกอบของอัลตร้าเมทริกซ์ Maecenas ligula massa, varius a, semg congue, euismod non, mi ผู้ช่วยผู้จัดการฝ่ายขาย, หรือไม่นอกจากนี้ยังมีผู้บุกรุก, สำหรับคนที่ไม่ใช่, คุณไม่สามารถนั่งลงที่นี่. ถึงครึ่งชั่วโมง Duis arcu massa, scelerisque vitae, ส่งผลให้, pretium a, enim Pellentesque congue ใช้ในการเพิ่มขึ้นของเวลาของคุณฟรี เพิ่มเพลงของคุณลงในรายการ Pragest egestas leo in pede แสดงความคิดเห็นของคุณ Pellentesque sed dui ut augue blandit sodales Vestibulum ante ipsum primis ใน faucibus orci luctus และ ultrices posuere cubilia Curae; Aliquam nibh Mauris ac mauris sed pede pellentesque fermentum. Maecenas ได้ทำการยกเลิก ante non diam sodales hendrerit สิ่งที่คุณควรทำ, ไม่ว่าจะเป็น, ไม่ทราบ, ไม่ทราบ, ไมล์. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin Fusce varius, ligula ไม่ใช่ tempus aliquam, nunc turpis ullamcorper nibh, ใน tempus sapien eros vitae ligula Pellentesque rhoncus nunc และ augue จำนวนเต็ม Curabitur liquet pellentesque diam จำนวนรวมของข้อมูลจะถูกตัดออกอย่างรวดเร็ว Lorem ipsum dolor amet amet, consectetuer adipiscing elit คลิกที่นี่เพื่อดูรายละเอียดเพิ่มเติม Nulla et sapien จำนวนผู้ทรุดโทรมทั้งหมด, ตัวบ่งชี้ที่ชัดเจน, รหัสการสนทนา, ปลอมแปลง eu, วิธีการ Mauris ullamcorper felis vitae erat. โปรโมชั่นของฉัน, ไม่รวมองค์ประกอบที่ดีที่สุด, ความบริสุทธิ์ที่ดีของการบรรยายและอื่น ๆ ที่น่าสนใจมากขึ้น Aliquam convallis sollicitudin purus แสดงให้เห็นถึงความจริงที่ fermentum mollis, ligula massa adipiscing nisl, euismod nibh nisl eu lectus Fusce vulputate sem ที่ sapien Vivamus leo คลิกที่นี่เพื่อดาวน์โหลดฟรี Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla ใน justo Suspendisse cursus rutrum augue Nulla tincidunt mi tincidunt mi. ไออาร์พีซีที่อยู่อาศัย, ดอกไม้หรือสัตว์เลื้อยคลาน, สัตว์ป่าใหญ่และอื่น ๆ อีกมากมาย Curabitur eu amet


3
เหตุใดจึงขอให้ผู้คนแสดงผลลัพธ์ของโปรแกรม คุณเป็นห่วงคนที่ไม่สามารถตรวจสอบผลลัพธ์ก่อนโพสต์หรือไม่
Peter Taylor

1
ฉันอยากจะให้โปรแกรม php ซึ่งประกอบด้วยข้อความที่ส่งออก ;-) อย่างจริงจังแม้ว่าช่องว่างในบรรทัดที่สองของข้อความที่ส่งออกดูเหมือนว่าจะถูกเพิ่มเข้าไปในช่องว่างโดยการสุ่ม? คือมีรูปแบบบางอย่างไปว่าฉันไม่เห็นและหากไม่สามารถวิธีการที่เราจะคาดว่าจะผลิตว่าผลลัพธ์ที่สำหรับการป้อนข้อมูลที่ได้รับ?
Gareth

@ กาเร็ ธ : ขอโทษฉันไม่ดี ฉันทำผิดพลาดเกิดขึ้นหลังจากเครื่องหมายจุลภาคไม่ใช่หลังจากเกิดอุบัติเหตุ แก้ไขคำถามแล้ว
โตโต้

@ Peter Taylor: เพียงเพราะฉันไม่สามารถทดสอบทุกภาษา
โตโต้

1
@Ilmari Karonen: ใช่สตริงการป้อนข้อมูลสามารถเป็นอะไรก็ได้
โตโต้

คำตอบ:


5

Perl, 94 ตัวอักษร

for(/(.{0,80}\s)/g){$i=1;$i+=!s/^(.*?\.|.*?,|(.*? )??\S{$i}) \b/$1  /until/
|.{81}/;chop;say}

perl -nM5.01ทำงานด้วย (ตัวnนี้รวมอยู่ในจำนวนตัวละคร)

รหัสข้างต้นเป็นรหัสที่สั้นที่สุดที่ฉันสามารถทำได้ซึ่งสามารถจัดการกับลูกศรโค้งใด ๆ ที่ฉันขว้างได้ (เช่นคำหนึ่งตัวอักษรที่จุดเริ่มต้นของบรรทัดบรรทัดอินพุตที่ยาว 80 ตัวอักษร ฯลฯ ) ตามข้อมูลจำเพาะ

Lorem ipsum dolor sit amet,  consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut  labore et  dolore magna aliqua.  Ut  enim ad  minim veniam,  quis
nostrud exercitation ullamco laboris nisi ut  aliquip ex  ea  commodo consequat.
Duis aute irure dolor in  reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur.  Excepteur sint occaecat cupidatat non proident,  sunt in
culpa qui officia deserunt mollit anim id est laborum.

I'm  tempted to  provide a  php  program which consists of  the output text. ;-)
Seriously though,  the spaces on the second line of the output text seem to have
been added to  the spaces at  random? Is  there some pattern to  it that I'm not
seeing,  and if  not,  how can we be expected to produce exactly that output for
the given input?

(ด้วยการขอโทษ Gareth ที่ใช้ความคิดเห็นของเขาเป็นอินพุตทดสอบเพิ่มเติม)

เวอร์ชัน 75-char ต่อไปนี้ทำงานได้ดีพอที่จะสร้างเอาต์พุตตัวอย่างจากอินพุตตัวอย่าง แต่สามารถล้มเหลวสำหรับอินพุตอื่น นอกจากนี้ยังทำให้อักขระช่องว่างเพิ่มเติมในตอนท้ายของแต่ละบรรทัดเอาท์พุท

for(/(.{0,80}\s)/g){s/(.*?\.|.*?,|.*? ..) \b/$1  /until/.{81}/||s/
//;say}

ทั้งสองเวอร์ชันจะวนซ้ำตลอดไปหากพบว่ามีการป้อนข้อมูลที่ไม่ถูกต้อง (ในเวอร์ชั่นที่ยาวกว่าการแทนที่untilด้วยuntil$i>80||จะแก้ไขด้วยค่าใช้จ่ายเพิ่มเติมเจ็ดตัวอักษร)


อาฉันควรเริ่มต้นด้วยการแก้ปัญหา perl ;-) ภาษานี้แน่นอนดีมากสำหรับงานดังกล่าว
โฮเวิร์ด

ฉันได้รับQuantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.*?\.|.*?,|(.*? )??\S{ <-- HERE 32767}) \b/ข้อความที่สอง
โตโต้

@ M42: นั่นเป็นเพราะข้อความตัวอย่างที่สองไม่สามารถพิสูจน์ได้ตามกฎ หากฉันเพิ่มในการ$i>80ตรวจสอบก็จะขยายบรรทัดที่ 11 ไปpede  pellentesque  fermentum.  Maecenas  adipiscing  ante  non  diam  sodalesซึ่งมีความยาวเพียง 78 ตัวอักษรและจากนั้นให้ขึ้นเนื่องจากแต่ละคำ (ยกเว้นที่ผ่านมา) ตามด้วยช่องว่างสอง
Ilmari Karonen

2

Ruby, 146 ตัวอักษร

$><<gets.gsub(/(.{,80})( |$)/){$2>""?(s=$1+$/;(['\.',?,]+(1..80).map{|l|"\\b\\w{#{l}}"}).any?{|x|s.sub! /#{x} (?=\w)/,'\& '}while s.size<81;s):$1}

มันพิมพ์ผลลัพธ์ที่ต้องการ (ดูด้านล่าง) หากข้อความที่ป้อนเข้าสู่ STDIN

Lorem ipsum dolor sit amet,  consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut  labore et  dolore magna aliqua.  Ut  enim ad  minim veniam,  quis
nostrud exercitation ullamco laboris nisi ut  aliquip ex  ea  commodo consequat.
Duis aute irure dolor in  reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur.  Excepteur sint occaecat cupidatat non proident,  sunt in
culpa qui officia deserunt mollit anim id est laborum.

แก้ไข:หลังจากส่งโซลูชันแรกของฉันฉันเห็นในข้อคิดเห็นว่าจำเป็นต้องใส่สายอักขระใด ๆ สามารถประมวลผล คำตอบก่อนหน้ามีเพียง 95 ตัวอักษร แต่ไม่ตอบสนองความต้องการนี้:

r=gets.split;l=0;'49231227217b6'.chars{|s|r[l+=s.hex]+=' '};(r*' ').gsub(/(.{,80}) ?/){puts $1}

หากฉันไม่เข้าใจผิดคุณกำลังใช้สูตรโกงแบบเดียวกับที่ฉันคิด (เข้ารหัสตำแหน่งของคำที่เว้นวรรคสองครั้งในผลลัพธ์ตัวอย่าง) โปรดทราบว่า M42 ได้ชี้แจงว่าโปรแกรมควรจัดการกับอินพุตอื่นด้วย
Ilmari Karonen

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