有些人坚持使用空格进行制表和缩进。
对于列表,这无疑是错误的。根据定义,制表符必须用于制表。
即使是缩进,制表符在客观上也很出色:
在Stack Exchange社区中有明确的共识。
使用单个空格进行缩进在视觉上是不愉快的;多使用一个是浪费的。
正如所有编码
高尔夫球手都知道的那样,程序应尽可能短。如果需要处理的字节数更少,那么它不仅可以节省硬盘空间,还可以减少编译时间。通过调整制表符宽度1,同一文件在每台计算机上看起来都不同,因此每个人都可以使用自己喜欢的缩进宽度,而无需修改实际文件。
默认情况下,所有好的文本编辑器都使用制表符(和定义)。
我这么说,我永远是对的!
可悲的是,并非每个人都在听理性。有人给您发送了一个文件,该文件做错了TM,您必须对其进行修复。您可以手动进行操作,但是还会有其他操作。
间隔器浪费您的宝贵时间已经很糟糕了,因此您决定编写最短的程序来解决该问题。
任务
编写执行以下操作的程序或函数:
从STDIN或作为命令行或函数参数读取单个字符串。
标识所有用于制表或缩进的空格。
如果在行的开头出现空格,则表示缩进。
如果不是缩进,则两个或多个空格的行程为制表。
甲单一可以或可以不被使用,是不是缩进空间制表。不出所料,当您将同一字符用于不同目的时,没有简单的方法可以分辨。因此,我们将说该空间已被用于混淆。
确定可能的最长制表符宽度1,用于制表符或缩进的所有空格都可以用制表符替换,而无需更改文件的外观。
如果输入既不包含制表也不包含缩进,则无法确定制表符宽度。在这种情况下,请跳过下一步。
使用先前确定的制表符宽度,用制表符替换用于制表或缩进的所有空格。
另外,只要有可能,而不会改变文件的外观,请使用制表符替换所有用于混淆的空格。(如有疑问,请排除空格。)
从函数中返回修改后的字符串或将其打印到STDOUT。
例子
的所有空格
a bc def ghij
制表。
每次运行空格都会将前面的非空格字符字符串填充为5的宽度,因此正确的制表符宽度为5,正确的输出2为
a--->bc-->def->ghij
的前两个空格
ab cde f ghi jk lm
都是制表的,其他的很混乱。
正确的制表符宽度为4,因此正确的输出2为
ab->cde>f ghi>jk lm
最后一个空格保持不变,因为如果由制表符代替,它将被呈现为两个空格:
ab->cde>f ghi>jk->lm
除一个空格外的所有空格
int main( ) { puts("TABS!"); }
是缩进,另一个是混乱。
缩进级别为0、4和8个空格,因此正确的制表符宽度为4,正确的输出2为
int --->main( ) --->{ --->--->puts("TABS!"); --->}
( )
如果用制表符代替,则其中的空间将被渲染为三个空间,因此保持不变。的前两个空格
x yz w
是缩进,其他是混乱。
正确的制表符宽度为2,正确的输出2为
->x>yz w
如果用制表符代替,则最后一个空格将被渲染为两个空格,因此它保持不变。
的前两个空格
xy zw
是缩进,其他三个是列表。
只有制表符宽度为1才能消除所有空格,因此正确的输出2为
>>xy>>>zw
的所有空格
a b c d
混乱。
没有最长的制表符宽度,因此正确的输出2为
a b c d
附加规则
输入将完全由可打印的ASCII字符和换行符组成。
您可以假定最多有100行文本,每行最多100个字符。
如果选择STDOUT作为输出,则可以打印单个尾随换行符。
适用标准代码高尔夫球规则。
1 制表符宽度定义为使用等距字体的两个连续的制表位之间的字符距离。
2 ASCII艺术箭头表示制表符Stack Exchange拒绝正确呈现,我为此提交了一个错误报告。实际输出必须包含实际的制表符。
programs should be as short as possible
我相信我已经找到了亚瑟·惠特尼(Arthur Whitney)失散多年的兄弟!