텍스트 처리 # 1 : 하이픈


14

배경

이것은 텍스트 처리에 관한 3 홀 골프 코스의 첫 번째 부분입니다. 가장 중요한 아이디어는 입력 텍스트를 가져 와서 솔루션을 통해 세 가지 도전 과제 (소량의 접착제 코드 사용)에 파이프하면 아름다운 형식의 단락을 내뱉 는다는 것입니다. 이 첫 번째 과제에서 주어진 하이픈 패턴을 사용하여 텍스트에 하이픈을 씁니다.

입력

프로그램은 두 개의 문자열 입력, 즉 텍스트와 하이픈 패턴 목록을 가져야합니다. 첫 번째 입력은 인쇄 가능한 ASCII 문자와 공백으로 구성된 비어 있지 않은 문자열입니다. 줄 바꿈이나 물결표가 포함되지 않습니다 ~. 두 번째 입력은 쉼표로 구분 된 단어 목록이며 소문자 ASCII 문자의 물결표로 구분 된 음절로 구성됩니다. 예는 ex~cel~lent,pro~gram~ming,abil~i~ties입니다.

산출

프로그램은 다음과 같은 방식으로 첫 번째 입력을 수정해야합니다. 하이픈 소문자 버전이 두 번째 입력에있는 단어 (알파벳 ASCII 문자의 최대 하위 문자열)는 하이픈 버전으로 대체되지만 대소 문자는 유지됩니다. 위의 예제 목록에서 텍스트에 단어가 포함되어 있으면 ; Excellent로 대체됩니다 Ex~cel~lent. 그러나, Excellently해야 하지 수정할 수. 출력은이 수정 된 문자열이어야합니다.

자세한 규칙 및 점수

입력에 대해 다음을 가정 할 수 있습니다.

  • 첫 번째 입력에는 물결표가없고 선행, 후행 또는 반복되는 공백이 없습니다. 비어 있지 않습니다.
  • 두 번째 입력은 적어도 하나의 단어를 포함하고, 각 단어는 적어도 두 음절을 포함합니다. 각 음절은 비어 있지 않습니다.
  • 두 번째 입력은 다른 단어에서 음절로 나오는 단어를 포함하지 않습니다.

원하는 경우 두 입력의 순서를 변경하고 선택적으로 하나의 후행 줄 바꿈을 출력에 추가 할 수 있습니다.

함수 또는 전체 프로그램을 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점은 허용되지 않습니다.

테스트 사례

이들은 형식으로 나열됩니다 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

이 문제에서 발생할 수있는 하이픈 오류는 이 하이픈 도구 로 인해 발생합니다 .


입력이 표준 7 비트 ASCII이고 일부 확장 8 비트 버전이 아니라고 가정합니까?
orlp

영숫자가 아닌 문자가 단어에 대한 변경으로 계산되지 않는다고 가정해도됩니다 (예 : 첫 번째 입력 #programming!은 여전히 ​​두 번째 입력의 영향을받습니다 pro~gram~ming). 숫자도 포함되지 않습니까 (예 : 알파벳 문자 만 허용됨)?
cole

@orlp 예, 입력은 여기에 나열된 표준 인쇄 가능 ASCII 문자로 구성됩니다 .
Zgarb

@Cole 알파벳이 아닌 문자는 단어의 일부가 아닙니다 (두 번째 테스트 사례 참조). 숫자는 알파벳이 아닌 것으로 간주되므로 이에 대한 테스트 사례를 추가하겠습니다.
Zgarb

한 단어로 최대 음절 수를 가정 할 수 있습니까?
Qwertiy

답변:


5

핍, 60 54 바이트

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

Pip 용 GitHub 리포지토리

입력을 명령 행 인수로 사용합니다 (공백이 포함되어 있다고 가정하면 입력 1 주위에 따옴표가 필요함). 후행 줄 바꿈이 인쇄되지 않습니다 ( 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

자바 스크립트 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 ]

RegExp 생성자 대신 eval을 사용할 수 있습니다. 문자열 템플릿도 몇 바이트를 절약 할 수 있습니다.
Downgoat

1

자바 스크립트 (ES6), 173 169

기본 정규식 검색 및 바꾸기

(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

펄, 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.