공백을 추가하여 텍스트를 정렬


10

이 텍스트가 주어지면

Lorem ipsum dolor는 amet, condictetur adipisicing elit, sed do eiusmod tempor incididunt ut 노동 및 dolore magna aliqua에 앉습니다. 가장 좋은 veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Volistate velit esse cillum dolore eu fugiat nulla pariatur에서 reprehenderit에 Duis aute irure dolor가 있습니다. Excepteur sint occaecat cupidatat nonidentident, culpa qui officiser deserunt mollit animid est labourum에서 침몰.

동일한 문자를 80 자로 정당화하는 가장 짧은 프로그램을 작성하십시오. 위의 텍스트는 다음과 같아야합니다.

Lorem ipsum dolor sit amet,  consectetur adipisicing 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.

규칙 :

  • 단어는 잘리지 않아야합니다
  • 여분의 공백을 추가해야합니다
    • 점 뒤에.
    • 쉼표 뒤에
    • 가장 짧은 단어 뒤 (왼쪽에서 오른쪽으로)
    • 결과는 연속 된 공백이 2 개를 초과하지 않아야합니다.
  • 마지막 줄은 정당화되지 않습니다.
  • 줄은 쉼표 나 점으로 시작해서는 안됩니다.
  • 프로그램의 출력을 제공하십시오

승자 : 가장 짧은 프로그램.

참고 : 입력 문자열은 STDIN에서 한 줄로 제공됩니다 (줄 바꿈 또는 캐리지 리턴 없음)

최신 정보:

입력 문자열은 다음과 같이 단어 길이가 합리적 (예 : 20 ~ 25 자 이하) 인 텍스트 일 ​​수 있습니다.

Lorem ipsum의 dolor는 amet, conditetur adipiscing elit에 앉아 있습니다. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orcnec nonummy molestie, eneest eleifend mi, non fermentum diam nisl sit amet erat. 듀스 셈퍼. Duis arcu massa, scelerisque vitae, int pretium a, enim. Pellentesque 콩그레스. 우루과이의 volutpat libero pharetra tempor. cras vestibulum bibendum augue. Pedeent egestas leo in pede. 현재의 blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. 파우 시우스 오르시 luctus (Fucius orci luctus) 및 ultrices posuere cubilia Curae의 배추 및 전립선; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas는 다른 비 soams hendrerit를 지원합니다. Ut velit mauris, egestas sed, 그라 비다 nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunt turpis ullamcorper nibh, 템푸스 사피엔 에로스 이태리 신경절. Pellentesque rhoncus nunc et augue. 정수 ID felis. Curabitur aliquet pellentesque diam. 정수 quis metus vitae는 lobortis egestas를 제거합니다. Lorem ipsum의 dolor는 amet, consectetuer adipiscing elit에 앉습니다. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. 정수형 totortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. 푸 앵트 (Proin feugiat), 위의 비 원소 (non-elementum posuere), 메 투스 푸 루스 아이 칼리 우스 (Musus purus iaculis lectus) 등. Aliquam convallis sollicitudin purus. 현명한 알리 쿼움, fermentum mollis의 enim, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. 사피엔에서 까다로운 semputate sem. 비바 무스 레오. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Justo의 Aenean suscipit nulla. Suspendisse cursus rutrum augue. Nulla tincidunt 틴시 툰트 미. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue 등 ultricies lacus lorem varius purus. Curabitur eu amet.


3
사람들에게 프로그램의 결과물을 제공하도록 요청하는 이유는 무엇입니까? 사람들이 게시하기 전에 결과를 확인하지 못하는 것에 대해 걱정하고 있습니까?
피터 테일러

1
출력 텍스트로 구성된 PHP 프로그램을 제공하고 싶습니다. ;-) 그래도 출력 텍스트의 두 번째 줄에 공백이 무작위로 공백에 추가 된 것처럼 보입니까? 내가 보지 못하는 패턴이 있습니까? 그렇지 않은 경우 주어진 입력에 대해 정확히 해당 출력 을 생성 하려면 어떻게해야합니까?
Gareth

@Gareth : 죄송합니다. 나는 실수를 저지른 후가 아니라 쉼표 뒤에 있습니다. 질문이 수정되었습니다.
Toto

@ 피터 테일러 : 모든 언어를 테스트 할 수 없기 때문에.
Toto

1
@Ilmari Karonen : 예, 입력 문자열은 무엇이든 가능합니다.
Toto

답변:


5

펄, 94 자

for(/(.{0,80}\s)/g){$i=1;$i+=!s/^(.*?\.|.*?,|(.*? )??\S{$i}) \b/$1  /until/
|.{81}/;chop;say}

로 실행하십시오 perl -nM5.01. ( n문자 수에 포함되어 있습니다.)

위의 코드는 I가 처리 할 수 있도록 할 수있는 최단 모든 I가 던져 커브 볼 (예 정확히 80 개 문자 길이의 라인의 시작에서 한 글자 단어 입력 라인 등)을 정확하게 사양에있어서

Lorem ipsum dolor sit amet,  consectetur adipisicing 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.

I'm  tempted to  provide a  php  program which consists of  the output text. ;-)
Seriously though,  the spaces on the second line of the output text seem to have
been added to  the spaces at  random? Is  there some pattern to  it that I'm not
seeing,  and if  not,  how can we be expected to produce exactly that output for
the given input?

(의견을 추가 테스트 입력으로 사용하여 Gareth에게 사과드립니다.)

다음 75 문자 버전은 샘플 입력에서 샘플 출력을 생성하기에 충분하지만 다른 입력에서는 실패 할 수 있습니다. 또한 각 출력 줄 끝에 여분의 공백 문자가 남습니다.

for(/(.{0,80}\s)/g){s/(.*?\.|.*?,|.*? ..) \b/$1  /until/.{81}/||s/
//;say}

두 가지 버전 모두 올바르게 정렬 할 수없는 입력을 받으면 영원히 반복됩니다. (긴 버전의 교체 until와 함께하는 until$i>80||일곱 추가 문자의 비용으로 그것을 해결하는 것입니다.)


아, 나는 펄 솔루션으로 시작해야했다 ;-)이 언어는 물론 그런 작업에 정말 좋습니다.
Howard

나는 Quantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.*?\.|.*?,|(.*? )??\S{ <-- HERE 32767}) \b/두 번째 텍스트를 얻었다 .
Toto

@ M42 : 두 번째 예제 텍스트를 규칙에 따라 정당화 할 수 없기 때문입니다. $i>80검사에 추가 하면 11 번째 줄 pede  pellentesque  fermentum.  Maecenas  adipiscing  ante  non  diam  sodales이 78 자로 확장 되고 각 단어 (마지막 제외) 뒤에 두 공백이 있기 때문에 포기합니다.
Ilmari Karonen

2

루비, 146 자

$><<gets.gsub(/(.{,80})( |$)/){$2>""?(s=$1+$/;(['\.',?,]+(1..80).map{|l|"\\b\\w{#{l}}"}).any?{|x|s.sub! /#{x} (?=\w)/,'\& '}while s.size<81;s):$1}

주어진 텍스트가 STDIN에 공급되면 원하는 출력을 정확하게 인쇄합니다 (아래 참조).

Lorem ipsum dolor sit amet,  consectetur adipisicing 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.

편집 : 첫 번째 솔루션을 제출 한 직후에 입력 문자열을 처리 할 수 ​​있어야한다는 의견을 보았습니다. 이전 답변은 95 자 였지만이 요구 사항을 충족하지 못했습니다.

r=gets.split;l=0;'49231227217b6'.chars{|s|r[l+=s.hex]+=' '};(r*' ').gsub(/(.{,80}) ?/){puts $1}

내가 실수하지 않으면, 당신은 내가 생각했던 것과 같은 치트를 사용하고 있습니다 (예제 출력에서 ​​이중 공백 단어의 위치를 ​​인코딩 함). M42는 프로그램이 다른 입력에도 대응해야 함을 분명히했습니다.
Ilmari Karonen

@Ilmari Karonen 네, 제출 한 후에 봤습니다. 위의 편집 및 의견을 참조하십시오. 골프 코스로 돌아가는 ...
Howard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.