ทำให้คำอธิบายรหัสนี้สวยอีกครั้ง


17

บทนำ

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

อย่างไรก็ตามเมื่อคุณต้องการแก้ไขคำอธิบายนี้เนื่องจากคุณสร้างสนามกอล์ฟที่บ้าคลั่งคุณมักจะเสียเวลาในการทำให้คำอธิบายของคุณกลับมาสวยอีกครั้ง เนื่องจากนี่เป็นงานที่ต้องทำซ้ำคุณจึงต้องเขียนโปรแกรมสำหรับสิ่งนี้

ความท้าทาย

รับโค้ดหลายบรรทัดพร้อมคำอธิบายและตัวคั่นเอาท์พุทโค้ดที่จัดรูปแบบอย่างสวยงามพร้อมคำอธิบาย

ตัวอย่าง

อินพุต

shM-crz1dc4. "ANDBYOROF # z = อินพุต

     rz1 # แปลงอินพุตเป็นตัวพิมพ์ใหญ่
    cd # split อินพุตบนช่องว่าง
         c4. "ANDBYOROF # สร้างรายการคำจากสตริงที่บรรจุซึ่งจะถูกละเว้น
   - # กรองคำเหล่านั้นออก
 hM # ใช้ตัวอักษรตัวแรกของทุกคำเท่านั้น
s # เข้าร่วมพวกเขาเป็นหนึ่งสาย

เอาท์พุต

shM-crz1dc4. "ANDBYOROF # z = อินพุต

     rz1 # แปลงอินพุตเป็นตัวพิมพ์ใหญ่
    cd # split อินพุตบนช่องว่าง
         c4. "ANDBYOROF # สร้างรายการคำจากสตริงที่บรรจุซึ่งจะเป็น
                           # ละเว้น
   - # กรองคำเหล่านั้นออก
 hM # ใช้ตัวอักษรตัวแรกของทุกคำเท่านั้น
s # เข้าร่วมพวกเขาเป็นหนึ่งสาย

คุกกี้หนึ่งอันสำหรับคุกกี้แรกที่สามารถค้นหาว่ารหัสนี้ทำอะไร

อัลกอริทึมการจัดรูปแบบ

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

หมายเหตุ

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

กฎระเบียบ

  • อนุญาตให้ใช้ฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
  • กฎเริ่มต้นสำหรับอินพุต / เอาต์พุต
  • ช่องโหว่มาตรฐานใช้
  • นี่คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ Tiebreaker เป็นการส่งก่อนหน้า

กรณีทดสอบ

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

['shM-crz1dc4. "ANDBYOROF # z = อินพุต', '', 'rz1 # แปลงอินพุตเป็นตัวพิมพ์ใหญ่', 'cd # อินพุตแยกบนช่องว่าง', 'c4." ANDBYOROF # สร้างรายการของคำจากแพ็กเกจ สตริงซึ่งจะถูกละเว้น ',' - # กรองคำเหล่านั้นออก ',' hM # ใช้ตัวอักษรตัวแรกของคำทั้งหมด ',' s # รวมเข้าด้วยกันเป็นหนึ่งสตริง '], "#" -> [' shM-crz1dc4 . "ANDBYOROF # z = input ',' ',' rz1 # แปลงอินพุตเป็นตัวพิมพ์ใหญ่ ',' cd # อินพุตแบบแยกในช่องว่าง ',' c4." ANDBYOROF # สร้างรายการคำจากสตริงที่บรรจุซึ่งจะเป็น ' , '# ละเว้น', '- # กรองคำเหล่านั้นออก ',' hM # ใช้ตัวอักษรตัวแรกของคำทั้งหมด ',' s # รวมคำเหล่านั้นไว้ในสตริงเดียว ']
['codecodecode e # คำอธิบาย', 'sdf dsf sdf e # A มากมากมากมากยาวมากยาวมากยาวยาวยาวยาวยาวยาวยาวนานนานคำอธิบายยาวนานและมันก็จะยาวขึ้นเรื่อย ๆ ', '', 'บางคน codee # เพิ่มเติมและคำอธิบายเพิ่มเติม '],' e # "-> ['codecodecode e # คำอธิบาย', 'sdf dsf sdf e # A มากมากมากมากยาวมากยาวนาน', 'ยาว # คำอธิบายที่ยาวเป็นเวลานานและมันยาวขึ้นเรื่อย ๆ ',' e # และอีกต่อไป ',' ',' อีกรหัส e # และอีกคำอธิบายเพิ่มเติม ']

Happy Coding!


1
@Matt ตัวคั่นทั้งหมดอยู่ที่คอลัมน์length of the longest code-line + 5เสมอ นอกจากนี้ยังนำไปใช้กับบรรทัดที่มีคำอธิบายเพียงอย่างเดียวเพราะมันถูกห่อหุ้ม
Denker

โอ้พระเจ้าฉันทำสิ่งนี้ผิดใน 3 ชั่วโมงที่ผ่านมา ฉันพยายามที่จะใส่โค้ดที่มีความยาวและทำให้คำอธิบายยาวขึ้น ..... เริ่มต้นใหม่ดีกว่า อย่างน้อยตอนนี้ก็ง่ายขึ้น ขอบคุณ คุณพูดได้ดี .... ฉันแค่โง่
Matt

รวมทุกบรรทัดที่มีความยาวมากกว่า 93 ตัวอักษรนั่นหมายความว่ารหัสรวมถึงช่องว่างนำหน้าจะไม่ยาวเกิน 87 อักขระ?
Matt

@Matt รหัสและตัวคั่นร่วมกันจะไม่ยาวเกิน 87 อักขระเนื่องจากเราต้องการช่องว่าง 5 ช่องระหว่างรหัสและตัวคั่นและตัวอักษรหนึ่งตัวสำหรับคำอธิบาย
Denker

1
รหัส Pyth ค้นหาตัวย่อของสตริงที่กำหนด ฉันจะรู้เพราะนั่นเป็นคำตอบสำหรับคำถามของฉัน
Aplet123

คำตอบ:


3

Ruby, 245 237 220 216 212 209 205 ไบต์

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

ฉันลบคำตอบก่อนหน้านี้ที่ไม่ตรงตามข้อกำหนดทั้งหมด ฉันไม่ต้องการที่จะมีรหัสตอบครึ่งตัวเป็นคำตอบ (มันเป็น downvotes สำหรับการที่ไม่สมบูรณ์ด้วย) แต่มันควรทำทุกอย่างที่คำถามถามตอนนี้

->x,d{l,S=0," "
s=->n{m,q=n.size,94-l-d.size
m>q ?(i=n.rindex(S,q)
n[0,i]+"
"+S*l+d+s[n[i+1,m]]):n}
x.map{|n|c,t=n.split d
c=(c||S).rstrip
l=[l,5+c.size].max
[c,t]}.map{|c,t|c+S*(l-c.size)+d+s[t]if t}*"
"}

การเปลี่ยนแปลง:

  • บันทึกไบต์จำนวนหนึ่งโดยใช้ประโยชน์จากสัญญาในอินพุตโดยเฉพาะอย่างยิ่งคำสัญญาที่ว่าบรรทัดที่ไม่ว่างทั้งหมดมีอักขระตัวคั่นและคำอธิบาย
  • จัดการเล่นกอล์ฟเพิ่มอีกนิดโดยบันทึกสายแยกจากสายแรกmapและทำstripหน้าที่ที่ไม่จำเป็นบางอย่างตามคำสัญญาที่ว่าคำในคำอธิบายจะมีช่องว่างหนึ่งช่องเสมอระหว่างพวกเขา นอกจากนี้ยัง" "ได้รับมอบหมายให้คงที่ตั้งแต่ฉันใช้มันมาก
  • ถูกล่ามโซ่ทั้งสองmapสายเข้าด้วยกันโดยใช้ประโยชน์จากพลังของฟังก์ชั่นขั้นสูงที่มีความหมายว่าโทรแผนที่แรกจะตั้งค่าตัวแปรความยาวได้อย่างถูกต้องถึงแม้ว่ามันจะเรียกว่าหลังจากการประกาศของฟังก์ชั่นผู้ช่วยที่l s-4 ไบต์
  • สตริงหลาย\nบรรทัดที่ถูกทารุณกรรมเพื่อแทนที่ด้วยบรรทัดใหม่ที่แท้จริงรวมถึงเคล็ดลับเล็กน้อยโดยใช้ifตัวดำเนินการแบบไตรภาค (เมื่อjoinถูกเรียกบนอาร์เรย์ที่มีnilค่าจะกลายเป็นสตริงว่าง)
  • .joinสามารถถูกแทนที่ด้วย a *.

ฉันคิดว่ามันควรได้รับการแก้ไขแล้วหรือยัง
มูลค่าหมึก

วิธีนี้ห่อที่ 94?
Ven

เอาล่ะตอนนี้ฉันมีเวลามากขึ้นที่จะทำงานกับโค้ดมันห่ออย่างถูกต้อง
มูลค่าหมึก

"ในขณะที่คำอธิบายสามารถมีความยาวไม่ จำกัด ตัวคั่นและรหัสสามารถมีความยาวสูงสุดรวมกันได้เท่านั้น93 - 5 = 87ตัวอักษร 5 ตัวคือช่องว่างระหว่างรหัสและตัวคั่นรหัสและตัวคั่นจะมีความยาวอย่างน้อยหนึ่งตัวอักษร" ส่วนรหัสของคุณเกินขีด จำกัด ด้วย 97 ตัวอักษรดังนั้นโปรแกรมจึงมีพฤติกรรมที่ไม่ได้กำหนด
มูลค่าหมึก

อาเห็นดีทำให้รู้สึก!
Ven

9

LiveScript, 243 236 233 228 219 225 ไบต์

f = (x,k,m+5)->l=(.length);x.=map(->it/"#k"=>..0-=/ +$/;m>?=5+l ..0);i=0;[..0&&..0+' '*(m- l ..0)+k+..1 for x]=>while i<(l ..),++i=>j=(s=..[i])lastIndexOf ' ' 93;(..splice i+1 0 ' '*m+k+s[j to]*'';s.=substr 0 j) if 94<l s;..[i]=s

มันทำงานอย่างไร: ส่วนใหญ่ชอบโค้ด Java เริ่มต้นด้วยระยะเวลาในนามแฝง (LiveScript อนุญาตให้สร้างฟังก์ชันจากตัวดำเนินการโดยใช้วงเล็บ) .=คือa = a.b- ซึ่งเราใช้ที่นี่เพื่อทำแผนที่

=> blabla ..เป็นน้ำตกขนาดเล็ก - ish สร้าง: ด้านซ้ายของ=>สามารถเข้าถึงได้..สำหรับส่วนที่เหลือของบล็อก; และจะถูกส่งกลับ นี่คือองค์ประกอบแยกเป็น k หมายเหตุ: ฉันใช้การแก้ไขสตริงเพราะ/หมายถึง "แยก" กับสตริงตัวอักษรเท่านั้น

LS ช่วยให้เราสามารถใช้a-=/regexp/แลมบ์ดานี้ได้เช่นกัน (ใช้ได้กับตัวอักษรสตริง): มันเป็นแค่น้ำตาลสำหรับการ.replaceโทร

ในที่สุดนั้น>?=คือตัวดำเนินการ combinatory >?-assin ซึ่งจะคืนค่าตัวถูกดำเนินการสองตัว

LS มี Python / Haskell-style เพื่อความเข้าใจโดยไม่มีอะไรน่าสนใจยกเว้น "string * times" เพื่อทำซ้ำพื้นที่ให้นานพอ

เพื่อความเข้าใจนี้ทำหน้าที่เป็นหัวข้อ (ดูบล็อกเกี่ยวกับการลดหลั่น anove)

จากนั้นเราวนเข้าไปในแต่ละองค์ประกอบของอาเรย์ (อันที่เราเพิ่งสร้างด้วยความเข้าใจ) และถ้าเส้นใดมีขนาดใหญ่กว่า 93chars เราจะพบดัชนีสุดท้ายของแยกและกดเส้นแยกหลังจากการทำซ้ำปัจจุบันนี้ ( ... ดังนั้นการทำซ้ำครั้งต่อไปจะแยกอีกครั้งหากบรรทัดใหญ่เกินไป)

เพียง แต่สิ่งสุดท้ายที่แฟนซีa[j to]เป็นช่วง (จาก J เพื่อสิ้นสุด) แต่เนื่องจากใช้วิธีการอาร์เรย์เราจะต้องเข้าร่วมมันกลับไปสตริงซึ่งเราไม่ใช้มากเกินไป:**''

ตัวอย่าง

s = """this is kod # Lorem ipsum dolor sit amet, consectetur adipiscing 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.
d # y

efgh # z"""

f = (x,k,m=5)->l=(.length);x.=map(->it/"#k"=>..0-=/ +$/;m>?=5+l ..0);i=0;[..0&&..0+' '*(m- l ..0)+k+..1 for x]=>while i<(l ..),++i=>j=(s=..[i])lastIndexOf ' ' 93;(..splice i+1 0 ' '*m+k+s[j to]*'';s.=substr 0 j) if 94<l s;..[i]=s

console.log (f s / '\n', '#') * \\n

เอาท์พุท:

this is kod     # Lorem ipsum dolor sit amet, consectetur adipiscing 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.
d               # y

efgh            # z

1
ถึงผู้ที่ downvoted: คำตอบได้รับการแก้ไข
Ven

2
เมื่อคำอธิบายโอเวอร์โฟลว์คุณต้องการบรรทัดใหม่เพื่อจัดตำแหน่งอักขระตัวคั่นกับ IIRC ที่เหลือ
หมึกมูลค่า

@ เควินเลาเห็นดีคงที่!
Ven

คุณสามารถปรับปรุงตัวอย่างผลลัพธ์ของคุณได้หรือไม่
หมึกมูลค่า

@KevinLau เสร็จแล้ว
Ven

6

Java, 347 + 19 = 366 ไบต์

ต้องใช้

import java.util.*;

ดังนั้น +19 ไบต์

(c,s)->{int p=0,i=0,t;String l;for(;i<c.size();i++){l=c.get(i);l=l.replaceAll(" *"+s,s);p=Math.max(l.indexOf(s),p);c.set(i,l);}p+=5;for(i=0;i<c.size();i++){l=c.get(i);t=l.indexOf(s);while(t>-1&t<p)l=l.substring(0,t)+" "+l.substring(t++);t=93;if(l.length()>t){while(l.charAt(t)!=' ')t--;c.add(i+1,s+l.substring(t));l=l.substring(0,t);}c.set(i,l);}}

ใช้ในรูปแบบ f.accept(List<String> code, String seperator)จะใช้เวลาในรูปแบบจัดรูปแบบในสถานที่ เวอร์ชันที่สร้างและส่งคืนใหม่List<String>จะมีความสำคัญต่อการนำไปใช้ แต่เสียค่าใช้จ่ายจำนวนหนึ่งไบต์

เยื้องการใช้งาน + ตัวอย่าง:

static BiConsumer<List<String>, String> prettify = (code, seperator) -> {
    int space = 0, i=0, t;
    String line;
    for (; i<code.size(); i++) { // for each line
        line = code.get(i); // get line
        line = line.replaceAll(" *" + seperator, seperator); // strip space before seperator
        space = Math.max(line.indexOf(seperator), space); // save biggest space until seperator
        code.set(i, line); // save line
    }
    space += 5;
    for (i=0; i<code.size(); i++) { // for each line
        line = code.get(i); // get line
        t = line.indexOf(seperator); // get index of seperator
        while (t>-1&t<space) // while the seperator exists and is further left than desired
            line = line.substring(0,t) + " " + line.substring(t++); // move it right by adding a space before it
        t = 93; // get desired line length
        if (line.length()>t) { // if the line is longer than that
            while (line.charAt(t)!=' ') t--; // scan backwards for a space
            code.add(i+1, seperator + line.substring(t)); // add a line after this one with seperator and the rest of the line
                                                          // the next pass will space it correctly
            line = line.substring(0,t); // cut off this line at that point
        }
        code.set(i, line); // save edited line back to List
    }
};

public static void main(String[] args) {
    List<String> code = new ArrayList<>();
    code.add("shM-crz1dc4.\"ANDBYOROF  # z = input");
    code.add("");
    code.add("     rz1      # convert input to uppercase");
    code.add("    c   d        # split input on spaces");
    code.add("         c4.\"ANDBYOROF        # create a list of the words from a packed string which shall be ignored");
    code.add("   -          # filter those words out");
    code.add(" hM                # only take the first letter of all words");
    code.add("s                   # join them into one string");
    prettify.accept(code, "#");
    code.stream().forEach(System.out::println);
}

... ฉันน่าจะใช้มันเอง


หากใครสามารถคิดออกว่าทำไมreplace(" *"+s)ไม่ทำงาน แต่replaceAll(" *"+s)ฉันชอบที่จะได้ยินมัน - ฉันไม่สามารถคิดออก
CAD97

<badguess> replaceใช้สตริง แต่replaceAllใช้ regexes </badguess>
เครื่องคิดเลข

@CatsAreFluffy ดีคุณถูกต้อง ! ไม่ทราบว่าฉันไม่รู้ตัวอย่างไร: P
CAD97

คุณไม่สามารถลบบรรทัดใหม่ได้หรือ
CalculatorFeline

การขึ้นบรรทัดใหม่สามารถลบออกได้เนื่องจาก semi-s ที่ต้องการ (ซึ่งควรเป็น. s แต่ไม่ว่าอะไรก็ตาม)
CalculatorFeline

2

PowerShell, 224 217 235 ไบต์

param($d,$s)$d=$d-split"`r`n";$p="\s+\$([char[]]$s-join"\")\s";$m=($d|%{($_-split$p)[0].Length}|sort)[-1];$d|%{$l,$c=$_-split$p;$c=if($c){"$s "+(("$c "-split"(.{1,$(87-$m)})\s"|?{$_})-join"`n$(" "*($m+5))$s ")}$l.PadRight($m+5," ")+$c}

อัปเดตตรรกะเพื่อกำหนดความยาวสตริงรหัสสูงสุด อัปเดตเพื่ออนุญาตตัวคั่นหลายตัวที่มีอักขระเมตาของ regex


คำอธิบายเล็กน้อย

สิ่งนี้ใช้เวลาในสตริงตัวคั่นบรรทัดใหม่ทั้งหมดสำหรับอินพุต

param($d,$s)
# $d is a newline delimited string. $s is the separator.
# Take the string and turn it into a string array. Stored as $d
$d=$d-split"`r`n"
# Save a regex pattern as it is used more than once
$p="\s+\$([char[]]$s-join"\")\s"
# Get the longest string of code's length
$m=($d|%{($_-split$p)[0].Length}|sort)[-1]
# Split each line again into code and comment. Write out each line with formatted explanations based on separator column position $m
$d|%{
# Split the line
$l,$c=$_-split$p
# Build the comment string assuming there is one.
$c=if($c){"$s "+(("$c "-split"(.{1,$(87-$m)})\s"|?{$_})-join"`n$(" "*($m+5))$s ")}
# Pad the right amount of space on the code and add the comment string.
$l.PadRight($m+5," ")+$c
}

เอาต์พุตตัวอย่างพร้อม Lorem Ipsum บางส่วน

shM-crz1dc4."ANDBYOROF     # z = input

     rz1                   # convert input to uppercase
    c   d                  # split input on spaces
         c4."ANDBYOROF     # But I must explain to you how all this mistaken idea of
                           # denouncing pleasure and praising pain was born and I will give
                           # you a complete account of the system, and expound the actual
                           # teachings of the great explorer
   -                       # filter those words out
 hM                        # only take the first letter of all words
s                          # join them into one string

@nimi หวังว่าการอัปเดตจะช่วยแก้ปัญหาได้ดีขึ้น
Matt

@nimi มีอะไรอีกที่คุณสังเกตเห็นผิด? เห็นได้ชัดว่าฉันมีปัญหาในการอ่านสองสามวันที่ผ่านมา
Matt

ไม่ได้ตอนนี้มี +1
nimi

1

MATLAB, 270 265 262 ไบต์

function d=f(I,s);S=@sprintf;R=@regexprep;m=regexp(I,['\s*\',s]);L=max([m{:}])+4;a=@(x)S('%-*s%s',L,x,s);b=@(x)R(R(x,S('(.{1,%d}(\\s+|$))',93-L),S('$1\n%*s ',L+1,s)),['\n\s*\',s,' $'],'');c=R(I,['(.*?)\s*\',s,'\s*(.*$)'],'${a($1)} ${b($2)}');d=S('%s\n',c{:});end

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

คำอธิบายสั้น ๆ

function d = f(I,s)
    %// Setup some shortcuts for commonly-used functions
    S = @sprintf;
    R = @regexprep;

    %// Find the location of the space AFTER each code block but before a comment
    m = regexp(I, ['\s*\',s]);

    %// Compute the maximum column location of the code and add 4 (5 - 1)
    L = max([m{:}]) + 4;

    %// This is a callback for when we detect code
    %// It left justifies and pads the string to L width
    a = @(x)S('%-*s%s', L, x, s);

    %// This is a callback for when we detect a comment.
    b = @(x)R(...
            R(x, ...
                S('(.{1,%d}(\\s|$))', 93 - L), ... Regex for wrapping text to desired width
                S('$1\n%*s ', L+1, s)), ... Append a newline and padding for next line 
            ['\n\s*\',s,' $'], ''); ... Remove the trailing newline (to be improved)

    %// Perform replacement of everything.
    c = R(I, ...
            ['(.*?)\s*\',s,'\s*(.*$)'], ... Match "code comment_char comment"
            '${a($1)} ${b($2)}');   ... Replace using the output of the callbacks

    %// Concatenate all of the strings together with a newline in between
    d=S('%s\n',c{:});
end

ตัวอย่างการป้อนข้อมูล

I = {
    'shM-crz1dc4."ANDBYOROF  # z = input'
    ''
    '     rz1      # convert input to uppercase'
    '    c   d        # split input on spaces'
    '         c4."ANDBYOROF        # create a list of the words from a packed string which shall be ignored'
    '   -          # filter those words out'
    ' hM                # only take the first letter of all words'
    's                   # join them into one string'
};

disp(f(I,'#'));

ตัวอย่างผลลัพธ์

shM-crz1dc4."ANDBYOROF     # z = input

     rz1                   # convert input to uppercase
    c   d                  # split input on spaces
         c4."ANDBYOROF     # create a list of the words from a packed string which shall be
                           # ignored
   -                       # filter those words out
 hM                        # only take the first letter of all words
s                          # join them into one string
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.