Penomoran Garis Hirarkis


18

Tulis sebuah program yang mengambil string di mana setiap baris terdiri dari karakter yang ditandai 0oleh beberapa spasi. Baris teratas tidak diindentasi dan setiap baris lainnya akan diindentasi oleh paling banyak satu ruang lebih banyak daripada garis sebelumnya.

Tidak ada garis yang akan memiliki spasi tambahan, tetapi Anda dapat secara opsional berasumsi bahwa ada satu baris tambahan tambahan.

Misalnya, input mungkin terlihat seperti ini:

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

Tugas Anda adalah menghitungnya seperti garis besar hirarkis , menggunakan peningkatan bilangan bulat positif sebagai header baris. Ini akan menjadi output untuk contoh:

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

Perhatikan bagaimana setiap tingkat indentasi hierarkis memiliki set sendiri angka yang meningkat, bahkan jika itu hanya naik satu.

Dalam output, seharusnya tidak ada spasi tambahan, tetapi mungkin ada opsional baris tambahan.

Tulis program lengkap yang mengambil string input melalui stdin atau baris perintah, atau tulis fungsi yang menggunakan string sebagai argumen. Cetak hasilnya atau kembalikan sebagai string.

Kode terpendek dalam byte menang.

Contohnya

Jika string kosong adalah input, string kosong harus berupa output.

Contoh paling sepele berikutnya adalah input

0

yang seharusnya menjadi

1

Contoh besar - Input:

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

Keluaran:

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

Jawaban:


2

Pyth, 18 byte

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

Ini adalah terjemahan tepat dari jawaban @ Sp3000 . Saya mencoba berbagai pendekatan dan variasi, tetapi saya tidak dapat mempersingkatnya, jadi saya menandai CW ini.

Demonstrasi.


8

Python 2, 77

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

Seperti jawaban Sp3000 ini , tapi dengan kamus. Dikt Smenyimpan nomor saat ini untuk setiap tingkat bersarang '0', ' 0', ' 0'dan seterusnya. Untuk setiap baris dalam input, naikkan tingkat bersarang yang sesuai, dan setel ulang tingkat bersarang lebih tinggi ke 0.


6

Python 2, 86 85 81 byte

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

(-5 byte terima kasih kepada @xnor)

Mengambil input sebagai string melalui STDIN, mis

'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'

Atau, inilah fungsi untuk 5 byte tambahan:

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

Saya menemukan bahwa Anda dapat menyimpan beberapa karakter dengan mengambil setiap baris sebagai string spasi sehingga Anda dapat mencetak spasi tersebut secara langsungS=[]\nfor w in input()[:-1].split('0\n'):S=([0]+S)[~len(w):];S[0]+=1;print w+`S[0]`
xnor

Sebenarnya, itu sedikit lebih pendek untuk mengambil di garis langsung: S=[]\nfor w in input().split('\n'):S=([0]+S)[-len(w):];S[0]+=1;print w[:-1]+`S[0]` .
xnor

@ xnor Terima kasih lagi - itu jauh lebih mudah :)
Sp3000

4

CJam, 25 byte

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

Seperti jawaban Python saya , ini menggunakan larik untuk menyimpan yang nomor setiap tingkat indentasi hingga. Satu perbedaan, bagaimanapun, adalah ini menggunakan t(set array) untuk mengganti 0 pada setiap baris dengan angka yang kita inginkan.

Cobalah online .


3

JavaScript ES6, 83 81 byte

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

Ini menggunakan larik yang menampung angka saat ini untuk setiap level indentasi. Segala sesuatu yang melewati level tersebut diatur ulang ke 0 menggunakan fill(). EDIT: 2 byte disimpan berkat tip vihan1086.

Cuplikan Stack di bawah ini dapat digunakan untuk pengujian karena sedikit tidak diubah dan menggunakan sintaks ES5 yang didukung lebih baik. Fungsi kedua adalah polyfill karena fill()tidak ada cara pendek untuk melakukannya tanpa 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

Python - 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))

Fungsinya adalah z.


0

Pip -rn , 31 27 byte

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

Masukan dari stdin. Cobalah online!

Penjelasan

                             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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.