天哪,它包含在标签中!


26

缩进用户,团结一致!我们必须与所有卑鄙的用户抗争!

您的任务(您应该选择接受)是编写一个带有两个参数的程序或函数:

  • 字符串:这是输入。
  • 正整数:每个选项卡的空格数。

您必须遍历字符串的每一行,并用给定的空格数替换每个用于缩进的制表符,并且将每个不用于缩进的制表符(例如,在一行的中间)替换为一个空格。

注意诸如这样的行\t \tabc是未定义的行为;它们是由邪恶的标签用户插入的,以使您的程序复杂化。

根据Tabs Must Die Society的说法,您的程序必须尽可能短,以免被恶意的Tab用户发现。

\t 用于在此处表示标签。

输入字符串:

a
\t\tb\tc
d

输入号码:

4

输出:

a
        b c
d

中间行缩进了8个空格,每个制表符缩进4个(因为给定的数字为4)。

输入字符串:

\ta\t\tb

输入号码:

4

输出:

    a  b

注意:不是选项卡扩展挑战的重复;它需要非常不同的输入格式和稍微不同的要求。


1
是的,只要问题没有明确要求十进制数字(不是)。
马丁·恩德


1
我们是否可以假定输入仅包含可打印的ASCII,制表符和换行符?
丹尼斯

2
拟议的测试案例:\ta\t\tb4(我的先前修订版本未能通过该案例)
丹尼斯

2
我们需要在空格中给出答案。
卡兹·沃尔夫

Answers:


7

CJam,30 24 23字节

q{_9=NA=Seasi*' ?@?:N}/

我通常拒绝在互联网上发布恶意代码……

这是一个完整的程序,可从STDIN中读取字符串和数字作为命令行参数。

CJam解释器中在线尝试。

怎么运行的

q                        Read all input from STDIN.
 {                   }/  For each character C in the input:
  _9=                      Push 1 if C is a tab and 0 otherwise.
     NA=                   See below.
        Seasi*             Push a string of W spaces, where W is the integer from
                           the command-line arguments.
              '            Push a spaces character.
                ?          Select the string if NA= pushed a truthy value, the
                           single space otherwise.
                 @         Rotate C on top of the stack.
                  ?        Select the string of spaces or the single space if _9=
                           pushed 1, the character C otherwise.
                   :N      Save the result in N.

是什么NA=呢:

  • 对于第一个字符,N将包含其默认值,即字符串"\n"

    对于所有后续字符,N将包含最后一次迭代的结果,即输入中的最后一个字符,空格字符或一个或多个空格的字符串。

  • 如果N为字符串,则NA=选择索引N为10的元素(环绕)。结果将是空格或换行符。两者都是真实的。

    如果N是字符,NA=则按1换行,否则按0。

  • 由于上述原因,NA=将为第一个字符,换行符之后的字符或一串空格之前的字符(缩进已替换)的第一个字符提供真实值。

    在其他情况下(包括已用空格代替制表符字符),NA=将推动一个falsy值。


6
通过删除恶意标签,使Internet服务成为一件好事。;)
Alex A.

19

K5,53个 45字节

{{,/(b+a&~b:x*&\a:9=y){$[x;x#" ";y]}'y}[x]'y}

实际上:

  {{,/(b+a&~b:x*&\a:9=y){$[x;x#" ";y]}'y}[x]'y}[4;(,"a";"\t\tb\tc";,"d")]
(,"a"
 "        b c"
 ,"d")

我只希望记录显示该问题在道德上是应受谴责的。


11
-21346106841适用于... this question is morally reprehensible.
TheNumberOne 2015年

3
这需要最终获得最高投票的答案,只是为了使人们看到脚注。
Geobits 2015年

您可以返回结果,而不用打印3个字节。
kirbyfan64sos 2015年

1
@ kirbyfan64sos:我正在打印结果以避免加入这些行。如果我可以接受并以字符串列表的形式返回结果(每行一个),则可以保存`0:和“ \ n” \`。
JohnE 2015年

@JohnE我没有规定不能这么做,所以我猜你可以。:)
kirbyfan64sos 2015年

8

Perl,23个字节

22字节代码+ 1字节命令行

希望不要太厚脸皮,以为可以通过-i参数给出数字输入!确保将以下代码中的\ t替换为实际的制表符。

s/\G\t/$"x$^I/ge;y/\t/ /

用法示例:

printf "a\n\t\tb\tc\nd" | perl -p entry.pl -i4

或为方便起见:

printf "a\n\t\tb\tc\nd" | perl -pe 's/\G\t/$"x$^I/ge;y/\t/ /' -i4

说明:

使用该-p参数将对输入中的每一行执行该程序,然后在最后打印结果。

在上面的示例中,正则表达式替换\G\t" "x4(重复四次的空格)。\G是鲜为人知的regex构造,如果第一次迭代,则匹配第一次匹配的位置,如果不是第一次迭代,则匹配先前匹配的位置,这意味着它将仅替换字符串开头的所有制表符,并将一对一地做。在y/\t/ /简单的替换用空格所有其余的选项卡。


2

朱莉娅69 59字节

f(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")

取消高尔夫:

function f(s::String, n::Int)
    # Replace the leading indentation tabs
    r1 = replace(s, r"^\t*"m, i -> " "^endof(i)n)

    # Replace any remaining tabs between words
    r2 = replace(r1, r"\t", " ")

    # Return
    r2
end

节省了10个字节,并通过Glen O解决了一个问题!


单独替换前导的缩进标签是否有任何好处?在我看来,它应该直接由“其余标签”部分处理。另外,您的“替换文本之间的标签”部分将仅匹配单个标签,如果有的话该"hello\t\t1"怎么办?
Glen O

如果我们假设所有缩进都使用制表符完成(没有任何"\t \t"情况),则可以执行以下操作:f(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," "),它使用替换功能,一次点击即可捕获所有缩进制表符。
Glen O

@GlenO哇,那真是个天才。非常感谢!
Alex A.

我注意到我的答案被否决了。我做错了什么吗?我很乐意解决任何问题。
Alex A.

我没看到任何问题。也许只是因为他们不喜欢某种语言或类似的东西而屈服的那些报仇类型之一?我看不到任何缺陷。
Glen O


2

Mathematica,42 37字节

感谢@ LegionMammal978提供了多个节省代码的建议。第一个参数#用于输入文本,第二个参数#2用于每个标签的空格数。

StringReplace[#,"\t"->" "~Table~{#2}]&

此外,您还可以改变Table[" ",{#2}],以" "~Table~{#2}挽救一个字节。为什么要在其中StringJoin输入空字符串?
LegionMammal978


1

JavaScript(ES6),70

使用模板字符串,换行符很重要并且很重要

(s,n,r=n)=>[...s].map(c=>c<`
`?` `.repeat(r):(r=c<` `?n:1,c)).join``

在Firefox中测试运行以下代码段。

F=(s,n,r=n)=>[...s].map(c=>c<`
`?` `.repeat(r):(r=c<` `?n:1,c)).join``

// TEST
out=x=>O.innerHTML+=x+'\n\n'

out('Input: "A\\n\\t\\tB\\tC\\nD" 4\nOutput:\n'+F('A\n\t\tB\tC\nD',4))

out('Input: "\\tA\\t\\tB" 4\nOutput:\n'+F('\tA\t\tB', 4))
<pre id=O></pre>


1
哇!可能是无法阅读或理解“在Firefox中测试”的人吗?
edc65

我怀疑语言偏见。朱莉娅(Julia)和贾姆(CJam)也投票。
丹尼斯

1

CoffeeScript,72个字节

(s,n)->s.replace(/^\t+/mg,(m)->" ".repeat(m.length*n)).replace /\t/g," "

(尝试再打高尔夫球至少2次,这样它将击败ES6解决方案...感激不尽:D)

用法:

f=(s,n)->s.replace(/^\t+/mg,(m)->" ".repeat(m.length*n)).replace /\t/g," "
str="""
My nice\tString
\tIndent <--
\t\tDouble
""" #\t is recognized as tab by CS
alert(f(str,4))

1

视网膜,42字节

所有出现的.都是空格,\t都是文字制表符(1个字节),<empty>代表空白文件。这只是为了提高可读性。我也不完全确定自己是否正确执行了循环,但我认为是正确的。每行应放置在其自己的文件中。我为每个其他文件添加了1个字节。

假定输入在其末尾的单行中为Unary。

(1*)$
_$1
m+`(?<!^|\t)\t
.
(`1$
<empty>
)`\t
\t.
\t|_
<empty>

说明

_在Unary输入之前添加了一个以在替换过程中对其进行定界,以便不从输入字符串中删除任何结尾的输入。然后,我将不在行首的所有制表符替换为一个空格。然后,我循环执行,1在每个选项卡后删除一个并在其后添加一个空格,直到我用完输入。最后,我通过删除选项卡和下划线进行清理。





0

Haskell,75个字节

s#m|let('\t':r)#n=(' '<$[1..n])++r#n;(x:r)#n=x:r#(m^sum[1|x<' ']);e#_=e=s#m

在线尝试!假定输入仅包含可打印的字符以及制表符和换行符,这是OP在注释中允许的。

说明:

外部#函数采用字符串s和数字,m#使用相同的参数调用内部局部定义的函数。这样做是为了跟踪原始m值,因为内部#函数会更改数字:

  • ('\t':r)#n=(' '<$[1..n])++r#n如果遇到选项卡,请用n空格替换并n保持不变。
  • (x:r)#n=x:r#(m^sum[1|x<' '])如果x遇到一些不是制表符的内容,请将其保持原样,但如果是换行符,则设置n为原始数字,否则设置为原始数字。这是通过:被采取对电力的计算结果为,当比空间更小(即行),所以我们得到。否则,我们有。mx1m^sum[1|x<' ']msum[1|x<' ']1xm^1 = m0m^0 = 1

0

Java 11,134字节

n->s->{var r="";for(var p:s.split("\n")){for(;p.charAt(0)==9;p=p.substring(1))r+=" ".repeat(n);r+=p+"\n";}return r.replace('\t',' ');}

在线尝试。
注意:Java 11尚未在TIO上,因此" ".repeat(n)已被仿真为repeat(" ",n)(具有相同的字节数)。

说明:

n->s->{                 // Method with integer & String parameters and String return-type
  var r="";             //  Result-String, starting empty
  for(var p:s.split("\n")){
                        //  Loop over the rows (split by new-lines)
    for(;p.charAt(0)==9;//   Inner loop as long as the current row starts with a tab
       p=p.substring(1))//     After every iteration: remove the first character (tab)
      r+=" ".repeat(n); //    Append `n` amount of spaces to the result-String
    r+=p+"\n";}         //   Append the rest of the row with a newline to the result
  return r.replace('\t',' ');} 
                        //   Replace any remaining tabs with a space, and return the result
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.