문제

내가 일하는 회사에 대한 맞춤형 전자 메일 관리 응용 프로그램을 작성했다고 가정 해 봅시다. 회사의 지원 계정에서 이메일을 읽고 정리 된 정리, 데이터베이스에 일반 텍스트 버전을 저장하여 고객 계정 및 프로세스의 주문과 연관하는 것과 같은 다른 깔끔한 작업을 수행합니다. 직원이 메시지에 응답하면 내 프로그램은 포맷 된 버전의 토론 스레드로 고객에게 전자 메일을 생성합니다. 고객이 응답하면 앱은 제목 줄에서 고유 한 번호를 찾고 들어오는 메시지를 읽고 이전 토론을 제거하고 스레드에서 새 항목으로 추가하십시오. 예를 들어:

This is a message from Contoso customer service.

Recently, you requested customer support. Below is a summary of your 
request and our reply.

--------------------------------------------------------------------
Contoso (Fred) on Tuesday, December 30, 2008 at 9:04 a.m.
--------------------------------------------------------------------
John:

I've modified your address. You can confirm my work by logging into
"Your Account" on our Web site. Your order should ship out today.

Thanks for shopping at Contoso.

--------------------------------------------------------------------
You on Tuesday, December 30, 2008 at 8:03 a.m.
--------------------------------------------------------------------
Oops, I entered my address incorrectly. Can you change it to

Fred Smith
123 Main St
Anytown, VA 12345

Thanks!

--
Fred Smith
Contoso Product Lover

일반적으로 이것은 모두 훌륭하게 작동하지만 한동안 청소를 해제하는 영역이 하나이며 텍스트 포장을 다룹니다. 위와 같은 예쁜 전자 메일 형식을 생성하려면 고객이 원래 보낸 텍스트를 다시 작성해야합니다.

나는 이것을 수행하는 알고리즘을 작성했습니다 (코드를 살펴보면 더 이상 어떻게 작동하는지 확신 할 수는 없습니다. 일부 리팩토링을 사용할 수 있습니다). 그러나 그것은 하드 랩 랩 Newline, "단락 끝"Newline 및 "Semantic"Newline을 구별 할 수 없습니다. 예를 들어, Hard-Grap Newline은 전자 메일 클라이언트가 단락 내에 삽입하여 79 개의 열에서 긴 텍스트를 마무리하는 것입니다. 단락 Newline의 끝은 사용자가 단락에서 마지막 문장을 한 후 추가 한 것입니다. 그리고 시맨틱 뉴 라인은 br 프레드가 위에 입력 한 주소와 같은 태그.

내 알고리즘은 대신 두 개의 신약만이 새로운 단락을 나타내는 것으로 표시되므로 고객의 이메일을 다음과 같은 형식으로 만들 수 있습니다.

Oops, I entered my address incorrectly. Can you change it to

Fred Smith 123 Main St Anytown, VA 12345

Thanks!

-- Fred Smith Contoso Product Lover

의도 한대로이 텍스트를 다시 찍을 수있는 버전을 작성하려고 할 때마다 기본적으로 텍스트의 의미론, "하드 랩"Newline의 차이점과 "정말 의미가있는" 그것은 a br"고객의 주소와 같은 유형의 Newline.

누구나 의도 한대로 텍스트를 다시 찍을 수있는 알고리즘이 있습니까? 아니면 주어진 솔루션의 복잡성을 평가할 때이 구현이 "충분히 양호"입니까?

감사.

도움이 되었습니까?

해결책

라인 길이를 최대 (일명 하드 랩) 아래로 유지하기 위해 Newline이 삽입되었는지 확인할 수 있습니다. 텍스트에서 가장 긴 줄을 확인하십시오. 그런 다음 주어진 줄의 경우 다음 줄의 첫 번째 단어를 추가합니다. 결과 라인이 최대 길이를 초과하면 라인 브레이크는 아마도 하드 랩 일 것입니다.

더 간단하게 당신은 모든 휴식을 고려할 수도 있습니다 (maxlength - 15) <= length <= maxlength 어려움으로 (15 개 단지 교육받은 추측). 이것은 주소와 물건과 마찬가지로 의도적 인 휴식을 확실히 필터링 할 것이며,이 범위에서 누락 된 휴식은 결과에 너무 나쁘게 영향을 미치지 않을 것입니다.

다른 팁

다음과 같이 두 가지 제안이 있습니다.

  • 구두점에주의하십시오 : 이것은 "딱딱한 랩"Newline과 "단락의 끝"Newline을 구별하는 데 도움이됩니다 (줄이 완전히 정지되면 사용자가 의도했을 가능성이 높기 때문입니다. 자주 끝.

  • 선이 최대 선 길이보다 훨씬 짧은 지에주의하십시오. 위의 예에서는 79 자로 "딱딱한"텍스트가있을 수 있으며 길이가 30 자 단위의 주소 라인이있을 수 있습니다. 30은 79보다 훨씬 작기 때문에 사용자의 텍스트-랩 랩 알고리즘이 아니라 사용자가 주소 라인을 깨뜨렸다는 것을 알고 있습니다.

또한, 들여 쓰기에주의를 기울이십시오 : 왼쪽에서 공백으로 들여 쓰기 된 선은이 포럼에서와 같이 이전 줄에서 깨진 새로운 단락으로 여겨 질 수 있습니다.

위의 OLE의 조언에 따라 임계 값을보기 위해 구현을 다시 작업했습니다. 그것은 제가 제가 던지고 실제로 영어를 이해하는 코드를 작성하지 않고도 충분히 던지는 대부분의 시나리오를 처리하는 것 같습니다.

기본적으로 먼저 입력 문자열을 스캔하고 변수에서 가장 긴 줄 길이를 기록합니다. inputMaxLineLength. 그런 다음 다시 촬영하면 inputMaxLineLength 그리고 85% inputMaxLineLength, 그런 다음 나는 그 Newline을 공간으로 바꾸는 것이 어려운 Newline이라고 생각하기 때문에 다른 Newline이 뒤 따르는 경우에도 그 범위 내에서 발생하는 단단 단락이라고 가정하기 때문입니다. 예를 들어 누군가가 짧은 총알 목록을 입력하는 경우 발생할 수 있습니다.

확실히 완벽하지는 않지만 내 시나리오에 "충분히"텍스트가 일반적으로 이전 전자 메일 클라이언트에 의해 반 완화되어 있다는 점을 고려할 때 내 시나리오에 "충분하다".

다음은 몇 가지 코드, 아마도 몇 가지 에지 케이스 (C#사용)에서 여전히 밑줄을 밟는 A-Few-Hours Old 구현입니다. 이전 솔루션보다 훨씬 덜 복잡합니다.

소스 코드

다음은 해당 코드를 연습하는 단위 테스트 (MSTEST 사용)입니다.

테스트 코드

누군가가 더 나은 구현을 가지고 있다면 (의심 할 여지없이 더 나은 구현이 존재한다면) 당신의 생각을 읽게되어 기쁩니다! 감사.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top