การประมวลผลข้อความ # 1: การใส่ไฮเฟ็น


14

พื้นหลัง

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

อินพุต

โปรแกรมของคุณจะรับอินพุตสตริงสองเส้น: ข้อความและรายการรูปแบบยัติภังค์ อินพุตแรกเป็นสตริงที่ไม่ว่างเปล่าของอักขระ ASCII และช่องว่างที่พิมพ์ได้ ~ก็จะได้มีการแบ่งบรรทัดหรือเครื่องหมายตัวหนอน อินพุตที่สองคือรายการคำที่คั่นด้วยจุลภาคซึ่งประกอบด้วยพยางค์ที่คั่นด้วย tilde ของอักขระ ASCII ตัวพิมพ์เล็ก ex~cel~lent,pro~gram~ming,abil~i~tiesตัวอย่างคือ

เอาท์พุต

โปรแกรมของคุณจะแก้ไขอินพุตแรกด้วยวิธีต่อไปนี้ คำใด ๆ (สตริงย่อยสูงสุดของตัวอักษร ASCII ตามตัวอักษร) ที่พบตัวพิมพ์เล็กที่ใส่ยัติภังค์ในอินพุตที่สองจะถูกแทนที่ด้วยเวอร์ชันที่ใส่ยัติภังค์นั้น แต่จะต้องเก็บรักษาไว้ ด้วยรายการตัวอย่างข้างต้นหากข้อความมีคำว่าExcellentมันจะถูกแทนที่ด้วยEx~cel~lent; อย่างไรก็ตามExcellentlyจะไม่สามารถแก้ไขได้ ผลลัพธ์ของคุณจะต้องเป็นสตริงที่ดัดแปลงนี้

รายละเอียดกฎและเกณฑ์การให้คะแนน

คุณสามารถสมมติสิ่งต่อไปนี้เกี่ยวกับอินพุต:

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

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

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

กรณีทดสอบ

1st input [newline] 2nd input [newline] outputเหล่านี้จะปรากฏในรูปแบบ

Excellent programming abilities, you work excellently!
ex~cel~lent,pro~gram~ming,abil~i~ties
Ex~cel~lent pro~gram~ming abil~i~ties, you work excellently!

Superman (sometimes incorrectly spelled "Super-man") is super #&%@ing strong.
su~per,some~times,in~cor~rectly,spell~ing
Superman (some~times in~cor~rectly spelled "Su~per-man") is su~per #&%@ing strong.

IncONsISTent caPItalizATIon!
in~con~sis~tent,cap~i~tal~iza~tion
In~cON~sIS~Tent caP~I~tal~izA~TIon!

Such short words.
awk~ward
Such short words.

Digits123 are456cool789.
dig~its,dig~i~tal,are~cool
Dig~its123 are456cool789.

magic magic
ma~gic
ma~gic ma~gic

ข้อผิดพลาดใด ๆ ที่เป็นไปได้ของการใส่ยัติภังค์ในการท้าทายนี้เกิดจากเครื่องมือยัติภังค์นี้


ฉันคิดว่าอินพุตเป็น ASCII 7 บิตมาตรฐานและไม่ใช่เวอร์ชั่น 8 บิตเพิ่มเติมหรือไม่
orlp

การถือว่าสมมติว่าอักขระที่ไม่ใช่ตัวอักษรและตัวเลขใด ๆ จะไม่นับเป็นการเปลี่ยนแปลงคำ (เช่นอินพุตแรกเช่น#programming!จะยังคงได้รับผลกระทบจากอินพุตที่สองของpro~gram~ming) ตัวเลขยังไม่นับ (เช่นอนุญาตให้ใช้ตัวอักษรตามตัวอักษรเท่านั้น) หรือไม่
โคล

@orlp ใช่การป้อนข้อมูลประกอบด้วยมาตรฐานตัวอักขระ ASCII ที่ระบุไว้ที่นี่
Zgarb

@Cole อักขระที่ไม่ใช่ตัวอักษรไม่ใช่ส่วนของคำ (ดูกรณีทดสอบที่สอง) ตัวเลขนั้นไม่นับตามตัวอักษรฉันจะเพิ่มกรณีทดสอบเกี่ยวกับเรื่องนั้น
Zgarb

ฉันสามารถใช้พยางค์ได้สูงสุดคำเดียวหรือไม่
Qwertiy

คำตอบ:


5

Pip, 60 54 ไบต์

Fwa^`([A-Za-z]+)`O{aQ'~?'~w@++y}M(LCwQ_RM'~FIb^',Yv)|w

ที่เก็บ GitHub สำหรับ Pip

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง (ซึ่งจำเป็นต้องมีเครื่องหมายคำพูดรอบอินพุต 1 สมมติว่ามีช่องว่าง) ไม่มีการพิมพ์บรรทัดใหม่ตามท้าย (เพิ่ม an xต่อท้ายโปรแกรมเพื่อเพิ่มหนึ่งรายการ)

ค่อนข้างอวดดีด้วยความคิดเห็น:

 ; Split 1st input on runs of letters, including the separators in the results
a^:`([A-Za-z]+)`
 ; Split 2nd input on commas
b^:',
 ; Iterate over the words w in that list
Fwa {
  ; Filter b for entries that match the current word (lowercase, with tildes removed)
 m:(LCw EQ _RM'~)FIb
  ; We expect this to be a list of 0 or 1 elements
  ; If it has one, m gets that element (the hyphenation pattern); if it's empty, m gets nil
 i:-1
 m:m@i
  ; Map this function to each character of pattern m: if it's tilde, return tilde;
  ; otherwise, return corresponding character of w
 m:{aEQ'~ ? '~ w@++i}Mm
  ; Output the result, unless it was nil (falsey), in which case output the original word
 Om|w
}

วิ่งตัวอย่าง:

C:\Users\dlosc> pip.py hyphens.pip "IncONsISTent caPItalizATIon!" in~con~sis~tent,cap~i~tal~iza~tion
In~cON~sIS~Tent caP~I~tal~izA~TIon!

8

เรติน่า , 88 ไบต์

+is`(?<![a-z~])([a-z~]+)(?=([a-z]+)+[^a-z~].*(?<=[\n,]\1(?(2)!)(?<-2>~\2)+[\n,]))
$1~
\n.*
<empty>

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


2

Javascript ES6, 117 141 ตัวอักษร

f=(t,p)=>p.split`,`.map(p=>t=t.replace(RegExp("((?:^|[^a-z])"+p.replace(/~/g,")(")+")(?=$|[^a-z])","ig"),(...x)=>x.slice(1,-2).join("~")))&&t

ทดสอบ:

document.querySelector(".question pre").textContent.split("\n\n").map(t=>(t=t.split("\n"))&&f(t[0],t[1])==t[2])
// Array [ true, true, true, true, true ]

คุณสามารถใช้ eval แทนตัวสร้าง RegExp แม่แบบสตริงอาจบันทึกไม่กี่ไบต์ด้วย
Downgoat

1

Javascript (ES6), 173 169

การค้นหาและแทนที่ regex พื้นฐาน

(a,b)=>(b.split`,`.map(s=>a=a.replace(eval(`/(^|[^a-z])(${s.replace(/~/g,"")})(?=[^a-z]|$)/gi`),(_,n,o)=>(x=0,n+s.split``.map((q,i)=>(q=='~'&&++x?q:o[i-x])).join``))),a)

ซอ

แก้ไข:แก้ไขข้อผิดพลาดสำหรับกรณีทดสอบmagic magic,ma~gic


ผิด: f("magic magic", "ma~gic")ส่งคืน"ma~gic magic"
Qwertiy

@Qwertiy คงที่แล้ว ยังไงก็ซ่อมมันช่วยฉันด้วย 4 ไบต์!
DankMemes

0

Perl, 146

$a=<>;$d=$_=~s/~//rg,$a=~s/(?<!\pL)$d(?!\pL)/h($&,$_)/gie for(split/,|\n/,<>);
print$a;
sub h{($g,$h)=@_;while($h=~/~/g){substr($g,"@-",0)='~'}$g}

เพียงแค่ความพยายามครั้งแรกสิ่งต่าง ๆ สามารถสั้นลงได้ - จะดำเนินต่อไปในวันพรุ่งนี้!

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