階層的なアウトラインの番号付け


18

すべての行0がいくつかのスペースでインデントされた文字で構成される文字列を取り込むプログラムを作成します。一番上の行はインデントされず、他のすべての行は、直前の行よりも多くても1スペースだけインデントされます。

行の末尾にスペースはありませんが、オプションで末尾に改行が1つあると想定することもできます。

たとえば、入力は次のようになります。

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

階層的なインデントレベルごとに、1つまでしか増えない場合でも、独自の増加する数字のセットがあることに注意してください。

出力では、末尾のスペースはありませんが、オプションで単一の末尾の改行がある場合があります。

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

回答:



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つ高いレベルにリセットします。


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]`

(@xnorのおかげで5バイト)

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


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バイト節約されました。

以下のStack Snippetは、わずかに変更されておらず、より適切にサポートされているES5構文を使用しているため、テストに使用できます。2つ目の機能はポリフィルです。ES6をfill()使用せずに簡単な方法はありません。

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.