Xử lý văn bản # 1: Dấu gạch nối


14

Lý lịch

Đây là phần đầu tiên của một sân golf 3 lỗ về xử lý văn bản. Ý tưởng vượt trội là nếu bạn lấy một văn bản đầu vào và đưa nó qua các giải pháp cho cả ba thử thách (với một lượng nhỏ mã keo), nó sẽ tạo ra một đoạn được định dạng đẹp mắt. Trong thử thách đầu tiên này, nhiệm vụ của bạn là gạch nối một đoạn văn bản bằng cách sử dụng các mẫu gạch nối đã cho.

Đầu vào

Chương trình của bạn sẽ có hai đầu vào chuỗi: một đoạn văn bản và một danh sách các mẫu gạch nối. Đầu vào đầu tiên chỉ đơn giản là một chuỗi các khoảng trống và ký tự ASCII có thể in được; nó sẽ không chứa ngắt dòng hoặc dấu ngã ~. Đầu vào thứ hai là một danh sách các từ được phân cách bằng dấu phẩy, bao gồm các âm tiết được phân tách bằng dấu ngã của các ký tự ASCII viết thường. Một ví dụ là ex~cel~lent,pro~gram~ming,abil~i~ties.

Đầu ra

Chương trình của bạn sẽ sửa đổi đầu vào đầu tiên theo cách sau. Bất kỳ từ nào (chuỗi con tối đa của các ký tự ASCII theo thứ tự chữ cái) có phiên bản chữ thường được gạch nối được tìm thấy trong đầu vào thứ hai sẽ được thay thế bằng phiên bản có gạch nối đó, nhưng trường hợp của nó sẽ được giữ nguyên. Với danh sách ví dụ trên, nếu văn bản chứa từ đó Excellent, nó sẽ được thay thế bằng Ex~cel~lent; tuy nhiên, Excellentlysẽ không được sửa đổi. Đầu ra của bạn sẽ là chuỗi sửa đổi này.

Quy tắc chi tiết và chấm điểm

Bạn có thể giả sử như sau về các đầu vào:

  • Đầu vào đầu tiên không chứa dấu ngã và không có khoảng trắng ở đầu, cuối hoặc lặp lại. Nó không trống rỗng.
  • Đầu vào thứ hai chứa ít nhất một từ và mỗi từ trong đó chứa ít nhất hai âm tiết. Mỗi âm tiết là không trống.
  • Đầu vào thứ hai không chứa một từ xuất hiện dưới dạng một âm tiết trong một từ khác.

Bạn có thể thay đổi thứ tự của hai đầu vào, nếu muốn và tùy ý thêm một dòng mới vào đầu ra.

Bạn có thể viết một chức năng hoặc một chương trình đầy đủ. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.

Các trường hợp thử nghiệm

Chúng được liệt kê trong định dạng 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

Bất kỳ lỗi gạch nối có thể có trong thử thách này là do công cụ gạch nối này .


Tôi giả sử đầu vào là ASCII 7 bit tiêu chuẩn, và không phải là một số phiên bản 8 bit mở rộng?
orlp

Có thể giả sử rằng bất kỳ ký tự không chữ và số nào sẽ không được tính là một thay đổi cho một từ (ví dụ: đầu vào đầu tiên như thế #programming!vẫn sẽ bị ảnh hưởng bởi đầu vào thứ hai của pro~gram~ming)? Các số cũng không được tính (tức là chỉ cho phép các ký tự chữ cái)?
cole

@orlp Có, đầu vào bao gồm các ký tự ASCII có thể in tiêu chuẩn như được liệt kê ở đây .
Zgarb

@Cole Các ký tự không theo thứ tự chữ cái không phải là một phần của từ (xem trường hợp thử nghiệm thứ hai). Các chữ số được tính là không theo thứ tự chữ cái, tôi sẽ thêm một trường hợp thử nghiệm về điều đó.
Zgarb

Tôi có thể giả sử một số âm tiết tối đa trong một từ không?
Qwertiy

Câu trả lời:


5

Pip, 60 54 byte

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

Kho GitHub cho Pip

Lấy đầu vào làm đối số dòng lệnh (yêu cầu trích dẫn xung quanh đầu vào 1, giả sử nó chứa khoảng trắng). Không có dòng mới nào được in (thêm một xphần cuối của chương trình để thêm một).

Hơi vô dụng, với ý kiến:

 ; 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
}

Chạy mẫu:

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

Võng mạc , 88 byte

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

Đối với mục đích đếm, mỗi dòng đi vào một tệp riêng biệt, \nđược thay thế bằng các ký tự dòng mới thực tế và <empty>là một tệp trống. Để thuận tiện, bạn có thể chạy mã trên từ một tệp duy nhất (nơi <empty>là một dòng trống) nếu bạn sử dụng -scờ thông dịch viên.


2

Javascript ES6, 117 141 ký tự

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

Kiểm tra:

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 ]

Bạn có thể sử dụng eval thay cho hàm tạo RegExp. Các mẫu chuỗi cũng có thể lưu một vài byte
Downgoat

1

Javascript (ES6), 173 169

Tìm kiếm regex cơ bản và thay thế

(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)

Vĩ cầm

Chỉnh sửa: Đã sửa lỗi cho trường hợp thử nghiệm magic magic,ma~gic


Sai: f("magic magic", "ma~gic")trả về"ma~gic magic"
Qwertiy

@Qwertiy đã sửa. Bằng cách nào đó sửa nó cũng tiết kiệm cho tôi 4 byte!
DankMeme

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}

Chỉ cần một nỗ lực đầu tiên, rất nhiều thứ có thể được rút ngắn - sẽ tiếp tục vào ngày mai!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.