通过添加空格来对齐文本


10

鉴于此文字

Lorem ipsum dolor坐下,私立教育专家,seu do eiusmod tempor incididunt ut Labore et dolore magna aliqua。尽量不要抽烟,不要因抽烟而锻炼。Duis aute irure dolor in reprehenderit in voltate velit esse cillum dolore eu fugiat nulla pariatur。不擅长于圣人的情节,应在负责任的犯罪活动中动工。

编写最短的程序,以产生以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坐下来,一直保持着良好的状态。Sed无风险。Suspendisse lectus tortor,dignissim amet,adipiscing nec,sultriced,dolor。Cras elementum ultrices直径。Maecenas ligula massa,内翻,Semper congue,euismod non,mi。Proin porttitor,orci nec nonummy muttytie,enim est eleifend mi,non fermentum diam nisl atmet erat。Duis semper。Duis arcu massa,scelerisque vitae,结果,pretium a,enim。Pellentesque猜猜。Ut处于上升中的volutpat libero pharetra tempor中。Crasvestibulum bibendum augue。Praesent egestas leo在小便。普遍的做法。Pellentesque sed du ut augue blandit sodales。紫茎泽兰和乌贼菌中的初生的Vestibulum ante ipsum primis;Aliquam nibh。Mauris ac mauris sed pede pellentesque fermentum。梅塞纳斯(Maecenas)忠告安提非史密斯·昂代利特(diand sodales hendrerit)。Ut velit mauris,egestas sed,nev gravida,ornare ut,mi。Aenean ut orci vel massa suscipit pulvinar。Nulla sollicitudin。金合欢属,非颞叶回旋律阿里卡姆,天竺葵属盲肠回旋比目鱼。Pellentesque rhoncus nunc et augue。整数ID felis。Curabitur aliquet pellentesque直径。整数quiet mete vita elit lobortis egestas。Lorem ipsum dolor坐下来,管教着迷。Morbi vel erat non mauris convallis vehicula。Nulla et sapien。整数Tortor Tellus,aliquam faucibus,convallis id,congue eu,quam。毛里斯·乌拉姆卡珀(Mauris ullamcorper)演绎。Proin feugiat,非基本的augue,metus purus iaculis lectus以及Tristique ligula justo vitae magna。杜鹃花铃兰。Praesent aliquam,molmentum mollis的enim,ligula massa adipiscing nisl,ac euismod nibh nisl eu lectus。Fusce vulputate sem在sapien。Vivamus狮子座。Aliquam euismod libero eu enim。Nulla nec felis sed leo placerat imperdiet。Aenean在Justo中​​保留了nulla。Suspendisse cursus rut​​rum augue。Nulla Tincidunt Tincidunt mi。Curabitur iaculis,lorem vel rhoncus faucibus,felis magna fermentum augue以及其他种种的lacus lorem varius purus。Curabitur eu amet。


3
为什么要求人们提供其程序的输出?您是否担心别人在发布之前无法检查结果?
彼得·泰勒

1
我很想提供一个包含输出文本的php程序。;-)严重来说,输出文本第二行上的空格似乎是随机添加到这些空格中的?有没有我没有看到的模式,如果没有,我们应该如何期望为给定输入准确地产生该输出?
Gareth

@加雷斯:对不起,我不好。我犯了一个错误,是在逗号之后,而不是在残渣之后。问题已编辑。
Toto

@Peter Taylor:仅仅因为我不能测试所有语言。
Toto

1
@Ilmari Karonen:是的,输入字符串可以是任何东西。
Toto

Answers:


5

Perl,94个字符

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

用运行perl -nM5.01。(n字符计数中包含该字符。)

上面的代码是我能做的最短的代码,它可以完全按照规范处理我扔给它的任何曲线球(例如,在一行的开头是一个字母的单词,输入的行长为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}

如果两个版本遇到无法正确辩解的输入,它们将永远循环。(在较长的版本中,替换untiluntil$i>80||可以解决此问题,但需要额外增加七个字符。)


嗯,我应该从perl解决方案开始;-)这种语言对于这样的任务当然非常有用。
霍华德

我得到Quantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.*?\.|.*?,|(.*? )??\S{ <-- HERE 32767}) \b/第二个文本。
多托

@ M42:这是因为第二个示例文本无法根据规则进行辩护。如果我添加$i>80支票,它将第11行扩展为pede  pellentesque  fermentum.  Maecenas  adipiscing  ante  non  diam  sodales,长度仅为78个字符,然后由于每个单词(最后一个单词除外)后跟两个空格而放弃了。
Ilmari Karonen 2011年

2

Ruby,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是的,提交后我看到了。请参阅上方的我的编辑和评论。回到高尔夫球场上……
霍华德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.