スペースを追加してテキストを正当化する


10

このテキストを考えると

Lorem ipsum dolor sit amet、consectetur adipisicing ellit、sed do eiusmod tempor incididunt ut Laber 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 voluppate velit esse cillum dolore eu fugiat nulla pariatur。Excepteur sint occaecat cupidatat non proident、sund in culpa qui officia deserunt mollit anim id est Laborum。

同じ文字を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で1行として提供されます(改行や改行はありません)

更新:

入力文字列は、次のような妥当な語長(つまり、20〜25文字以下)のテキストにすることができます。

ロレム・イプサム・ドーラーは座り心地がよく、僧侶は外交的エリートです。Sed non risus。Suspendisse lectus tortor、dignissim sit amet、adipiscing nec、ultricies sed、doror。Cras elementum ultrices diam。Maecenas ligula massa、varius a、semper congue、euismod non、mi。Proin porttitor、orci nec nonummy molestie、enim est eleifend mi、non fermentum diam nisl sit amet erat。デュイスセンパー。Duis arcuマッサ、sclerisque vitae、その結果、pretium a、enim。ペレンテスクは争う。risus volutpat libero pharetra temporのUT。Cras vestibulum bibendum augue。PedeのPraestent egestasレオ。Praesent blandit odio eu enim。ペレンテスクsed dui ut augue blandit sodales。faucibus orci luctus et ultrices posuere cubilia Curaeの前庭前縁部。Aliquam nibh。Mauris ac mauris sed pede pellentesque fermentum。Maecenas adipiscing ante non diam sodales hendrerit。Ut velit mauris、egestas sed、gravida nec、ornare ut、mi。Aenean ut orci vel massa suscipit pulvinar。Nulla sollicitudin。Fusce varius、ligula non tempus aliquam、nunc turpis ullamcorper nibh、tempus sapien eros vitae ligula。Pellentesque rhoncus nunc et augue。整数id felis。Curabiturアリケットpelentesque diam。Integer quis metus vitae elit lobortis egestas。Lorem ipsum dolorはamet、consectetuer adipiscingエリートに座ります。Morbi vel erat non mauris convallis vehicula。ヌラとサピエン。Integer tortor tellus、aliquam faucibus、convallis id、congue eu、quam。Mauris ullamcorper felis vitae erat。Proin feugiat、augue non elementum posuere、metus purus iaculis lectus、et tristique ligula justo vitae magna。Aliquam convallis sollicitudin purus。プレザント・アリクアム、エメン・オブ・ファーメンタム・モリス、リグラ・マッサ・アディピシング・ニスル、AC euismod nibh nisl eu lectus サピエンでFusce vulputate sem。ビバムスレオ。Aliquam euismod libero eu enim。Nulla nec felis sed leo placerat imperdiet。JustoのAenean suscipit nulla。Suspendisse cursus rut​​rum augue。Nulla tincidunt tincidunt mi。Curabitur iaculis、lorem vel rhoncus faucibus、felis magna fermentum augue、その他ultricies lacus lorem varius purus。Curabitur eu amet。


3
なぜ人々に彼らのプログラムの出力を提供するように頼むのですか?投稿する前に結果を確認できないことを心配していますか?
Peter Taylor

1
出力テキストで構成されるphpプログラムを提供したくなります。;-)しかし真剣に、出力テキストの2行目のスペースがランダムにスペースに追加されたようですか?私には見られないパターンがありますか?そうでない場合、与えられた入力に対してその出力を正確に生成することをどのように期待できますか?
Gareth

@Gareth:すみません、悪いです。私は間違えました、incididuntの後ではなく、コンマの後です。質問を編集しました。
Toto

@ピーター・テイラー:私がすべての言語をテストすることができないからといって。
Toto

1
@Ilmari Karonen:はい、入力文字列は何でもかまいません。
Toto

回答:


5

Perl、94文字

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

で実行しperl -nM5.01ます。(n文字数に含まれます。)

上記のコードは、私はそれを扱うことができる作ることが最短である任意の私はそれを投げcurveballsを(そのような正確80文字長い行の先頭に1つの文字の単語、入力線、等)を正確に仕様によれば:

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}

どちらのバージョンも、正しく正当化できない入力があった場合、永久にループします。(長いバージョンでは、に置き換えるuntiluntil$i>80||、7文字余分に消費されて修正されます。)


ああ、私はperlソリューションから始めるべきだったのですが;-)この言語はもちろんそのようなタスクに本当に適しています。
ハワード

Quantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.*?\.|.*?,|(.*? )??\S{ <-- HERE 32767}) \b/2番目のテキストを取得しました。
Toto

@ M42:これは、2番目の例のテキストをルールに従って正当化できないためです。$i>80チェックを追加すると、11行目pede  pellentesque  fermentum.  Maecenas  adipiscing  ante  non  diam  sodalesが78文字に拡張され、各単語(最後の単語を除く)の後に2つのスペースが続くため、あきらめます。
Ilmari Karonen、2011

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、2011

@Ilmari Karonenはい、提出後に見ました。上記の編集とコメントを参照してください。ゴルフコースに戻る...
ハワード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.