编号分级大纲


18

编写一个包含字符串的程序,其中每一行都由0缩进一定数量的空格的字符组成。顶行没有缩进,并且每隔一行缩进的空间最多比前一行缩进更多。

没有行将有尾随空格,但是您可以选择假设只有一条尾随换行符。

例如,输入可能看起来像这样:

0
 0
  0
  0
 0
0
 0
 0
 0
  0
0
 0
  0
  0

您的任务是像对其进行分级一样对它进行编号,使用递增的正整数作为行标题。这将是示例的输出:

1
 1
  1
  2
 2
2
 1
 2
 3
  1
3
 1
  1
  2

注意每个分层缩进级别如何都有自己的一组递增数字,即使它们仅递增到一个。

在输出中,不应有尾随空格,但是可以选择有一条尾随换行符。

编写一个通过stdin或命令行获取输入字符串的完整程序,或者编写一个将字符串作为参数的函数。打印结果或将其作为字符串返回。

以字节为单位的最短代码获胜。

例子

如果输入空字符串,则应输出空字符串。

下一个最简单的示例是输入

0

应该变成

1

大示例-输入:

0
 0
  0
 0
  0
 0
  0
  0
   0
   0
    0
     0
     0
     0
     0
    0
   0
    0
    0
  0
0
 0
  0
 0
  0
  0
  0
  0
  0
  0
  0
  0
  0
  0
  0
   0
    0
     0
  0
   0
0
0
0
 0
  0
   0
    0
     0
      0
      0
     0
    0
   0
  0
 0
  0
  0
   0
   0
0
0

输出:

1
 1
  1
 2
  1
 3
  1
  2
   1
   2
    1
     1
     2
     3
     4
    2
   3
    1
    2
  3
2
 1
  1
 2
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
   1
    1
     1
  12
   1
3
4
5
 1
  1
   1
    1
     1
      1
      2
     2
    2
   2
  2
 2
  1
  2
   1
   2
6
7

Answers:


2

Pyth,18个字节

V.z+PNhX0=Y>lN+0Y1

这是@ Sp3000的确切翻译的答案。我尝试了许多不同的方法和变体,但无法将其缩短,因此我要标记此CW。

示范。


8

Python 2,77

S={'0':0}
for w in input().split('\n'):S[w]+=1;S[' '+w]=0;print w[:-1]+`S[w]`

Sp3000的答案一样,但是有字典。dict S存储每个嵌套级别的当前数字'0', ' 0', ' 0',依此类推。对于输入中的每一行,增加相应的嵌套级别,然后将嵌套级别从1重置为0。


6

Python 2,86 85 81字节

S=[]
for r in input().split("\n"):S=([0]+S)[-len(r):];S[0]+=1;print r[:-1]+`S[0]`

(-5个字节,感谢@xnor)

通过STDIN将输入作为字符串输入,例如

'0\n 0\n  0\n  0\n 0\n0\n 0\n 0\n 0\n  0\n0\n 0\n  0\n  0'

另外,这是一个额外的5个字节的函数:

def f(I,S=[]):
 for r in I.split("\n"):S=([0]+S)[-len(r):];S[0]+=1;print r[:-1]+`S[0]`

我发现您可以通过将每行当作一串空格来保存一些字符,以便直接打印这些空格S=[]\nfor w in input()[:-1].split('0\n'):S=([0]+S)[~len(w):];S[0]+=1;print w+`S[0]`
xnor

实际上,直接加入该行要短一些:S=[]\nfor w in input().split('\n'):S=([0]+S)[-len(w):];S[0]+=1;print w[:-1]+`S[0]`
xnor

@xnor再次感谢-这要简单得多:)
Sp3000

4

CJam,25个字节

LqN/{0+I,<))_IW@toNo+}fI;

就像我的Python答案一样,它使用一个数组来存储每个缩进级别要达到的数字。但是,不同之处在于,它使用t(数组集)将每行的0替换为我们想要的数字。

在线尝试


3

的JavaScript ES6,83 81个字节

f=(z,a=[])=>z.replace(/ *0/g,e=>e.replace(0,a.fill(0,l=e.length)[--l]=a[l]+1||1))

这使用一个数组保存每个缩进级别的当前数字。超过该级别的所有内容都使用重置为0 fill()。编辑:感谢vihan1086的提示,节省了2个字节。

下面的堆栈摘录可用于测试,因为它略微有些松懈,并使用了更好支持的ES5语法。第二个功能是一个polyfill,fill()因为没有ES6的话没有很短的方法。

f=function(z){
  a=[]
  return z.replace(/ *0/g,function(e){
    return e.replace(0,a.fill(0,l=e.length)[--l]=a[l]+1||1)
  })
}

if(!Array.prototype.fill){
  Array.prototype.fill = function(val, start){
    var res = this;
    for(var i = start; i<this.length; i++){
      res[i] = val;
    }
    return res;
  };
}

run=function(){document.getElementById('output').innerText=f(document.getElementById('input').value)};document.getElementById('run').onclick=run;run()
<textarea id="input" rows="15" cols="10">
0
 0
  0
  0
 0
0
 0
 0
 0
  0
0
 0
  0
  0</textarea>
<pre id="output" style="display:inline-block; vertical-align:top; margin:0"></pre><br />
<button id="run">Run</button>


1

蟒蛇-191

def p(s,i,v,n=1):
    while i<len(s)and s[i]and'0'not in s[i][:v]:
        if s[i][v]=='0':s[i]=' '*v+str(n);n+=1;i+=1
        else:i=p(s,i,v+1)
    return(s,i)[v!=0]
z=lambda r:'\n'.join(p(r.split('\n'),0,0))

功能是z


0

-rn31 27字节

{Wl#<alPU0l@>:-#aaR0++@l}Mg

来自stdin的输入。在线尝试!

说明

                             g is list of lines of stdin (-r flag); l is []
                             Note that l is a global variable
{                       }Mg  Map this function to each a in g:
 Wl#<a                        While l is less in length than a:
      lPU0                     Push a 0 to (the front of) l
                              (This handles increasing the indent)
          l@>:                Slice and assign back to l...
              -#a              ... its last len(a) elements
                              (This handles decreasing the indent)
                 aR0          In a, replace 0 with
                      @l       the first element of l
                    ++         incremented in-place
                              The function returns the above expression
                             The resulting list from map is printed, newline-separated
                              (-n flag)
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.