Hitung, Ganti, Ulangi!

18

Definisi

Tentukan susunan ke- n dari urutan CURR sebagai berikut.

  1. Mulailah dengan array singleton A = [n] .

  2. Untuk setiap bilangan bulat k di A , menggantikan masuk k dengan k bilangan, menghitung naik dari 1 ke k .

  3. Ulangi langkah sebelumnya n - 1 kali lagi.

Misalnya, jika n = 3 , kita mulai dengan array [3] .

Kami mengganti 3 dengan 1, 2, 3 , menghasilkan [1, 2, 3] .

Kami sekarang mengganti 1 , 2 , dan 3 dengan 1 ; 1, 2 dan 1, 2, 3 (resp.), Menghasilkan [1, 1, 2, 1, 2, 3] .

Akhirnya, kami melakukan penggantian yang sama seperti pada langkah sebelumnya untuk semua enam bilangan bulat dalam array, menghasilkan [1, 1, 1, 2, 1, 1, 2, 1, 2, 3] . Ini adalah array CURR ketiga.

Tugas

Tulis program fungsi yang, diberi bilangan bulat positif n sebagai input, menghitung array CURR ke- n .

Outputnya harus berupa daftar datar (dan array dikembalikan dari suatu fungsi, representasi string dari sintaks array bahasa Anda, dipisahkan dengan spasi putih, dll.).

Ini adalah . Semoga kode terpendek dalam byte menang!

Uji kasus

 1 -> [1]
 2 -> [1, 1, 2]
 3 -> [1, 1, 1, 2, 1, 1, 2, 1, 2, 3]
 4 -> [1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4]
 5 -> [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5]
 6 -> [1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6]
Dennis
sumber
3
Terkait: Hitung, Ganti, Tambah! ._.
Dennis
Bisakah kita mengambil input sebagai array tunggal (seperti [2]) daripada bilangan bulat?
Mego
@Mego Mari kita simpan di integer.
Dennis
Saya merasa harus ada urutan OEIS untuk ini.
DanTheMan
@DanTheMan Ini bukan urutan bilangan bulat dalam bentuk saat ini, tapi saya kira itu bisa diubah menjadi satu dengan menggabungkan hasil untuk semua bilangan bulat positif.
Dennis

Jawaban:

23

Jelly, 3 byte

R¡F

Cobalah online

Penjelasan

R¡F    Argument n

R      Yield range [1..n]
 ¡     Repeat n times
  F    Flatten the result
Essari
sumber
Itu ... hanya brilian ... dibandingkan dengan jawaban Jelly saya.
Leaky Nun
6
Pos pertama yang bagus!
Biru
16

Python, 50 byte

lambda i:eval("[i "+"for i in range(1,i+1)"*i+"]")

Penyalahgunaan ruang lingkup! Misalnya, untuk i=3, string yang akan dievaluasi meluas ke.

[i for i in range(1,i+1)for i in range(1,i+1)for i in range(1,i+1)]

Entah bagaimana, meskipun menggunakan variabel input fungsi iuntuk semuanya, Python membedakan setiap indeks iterasi sebagai milik lingkup yang terpisah seolah-olah ekspresi

[l for j in range(1,i+1)for k in range(1,j+1)for l in range(1,k+1)]

dengan iinput ke fungsi.

Tidak
sumber
Trik ini juga berfungsi di Firefox 30+ dan menyelamatkan saya 3 byte, terima kasih!
Neil
@DigitalTrauma Baik python dan JavaScript miliki eval, jelas kode itu sendiri perlu porting tapi saya pikir Anda bisa menganggap itu.
Neil
@Neil Oh, saya mengerti - Saya benar-benar salah paham :)
Digital Trauma
12

05AB1E, 6 3 byte

DFL

Dijelaskan

D     # duplicate input
 F    # input times do
  L   # range(1,N)

Cobalah online

Disimpan 3 byte berkat @Adnan

Emigna
sumber
DFLlebih pendek 3 byte :)
Adnan
1
@ Adnan: Tidak tahu L bekerja seperti itu di daftar. Agak mengejutkan bahwa itu meratakan secara otomatis.
Emigna
3
Sebenarnya ini adalah bug yang tidak pernah saya perbaiki: hlm.
Adnan
6

Retina , 33 byte

$
$.`$*0
+%(M!&`1.*(?=0)|^.+
O`.+

Input dan output di unary.

Cobalah online!

Meskipun saya tidak menggunakan formulir tertutup untuk tantangan terkait, mengadaptasi jawaban ini ternyata sangat sulit.

Martin Ender
sumber
+%(M!&adalah tag terpanjang yang pernah saya lihat.
Leaky Nun
6

Python 2, 82 byte

lambda n:[1+bin(i)[::-1].find('1')for i in range(1<<2*n-1)if bin(i).count('1')==n]

Ini bukan solusi terpendek, tetapi menggambarkan metode yang menarik:

  • Tuliskan dulu 2^(2*n-1) angka dalam biner
  • Simpan dengan tepat n yang
  • Untuk setiap angka, hitung jumlah nol yang tertinggal, dan tambahkan 1.
Tidak
sumber
4

Sebenarnya, 9 byte

;#@`♂RΣ`n

Cobalah online!

Penjelasan:

;#@`♂RΣ`n
;#@        dupe n, make a singleton list, swap with n
   `♂RΣ`n  call the following function n times:
    ♂R       range(1, k+1) for k in list
      Σ      concatenate the ranges

Terima kasih kepada Leaky Nun untuk satu byte, dan inspirasi untuk 2 byte lainnya.

Mego
sumber
;#@"♂R♂i"*ƒmenghemat satu byte
Leaky Nun
@ LeakyNun Tangkapan yang bagus - ;#@`♂R♂i`nsimpan yang lain!
Mego
Saya akan mencoba penjumlahan, lol.
Leaky Nun
Saya pikir 9 akan menjadi solusi optimal di sini
Mego
Tautan Anda masih ketinggalan zaman.
Leaky Nun
4

C #, 128 Bytes

List<int>j(int n){var l=new List<int>(){n};for(;n>0;n--)l=l.Select(p=>Enumerable.Range(1,p)).SelectMany(m=>m).ToList();return l;
ScifiDeath
sumber
Dengan using static System.Linq.Enumerable, Anda dapat melakukan ini:int[]J(int n){var l=new[]{n};while (n-- > 0){l = l.Select(p => Range(1, p)).SelectMany(m => m).ToArray();}return l;}
die maus
4

APL, 11 byte

{∊⍳¨∘∊⍣⍵+⍵}

Uji:

      {∊⍳¨∘∊⍣⍵+⍵} 3
1 1 1 2 1 1 2 1 2 3

Penjelasan:

  • +⍵: dimulai dengan ,
  • ⍣⍵: lakukan waktu berikut :
    • ⍳¨∘∊: ratakan input, dan kemudian buat daftar [1..N] untuk setiap N dalam input
  • : meratakan hasil itu
marinus
sumber
2
Simpler:{(∊⍳¨)⍣⍵⊢⍵}
Adám
@ Adám: Ah, ya, kereta bekerja berbeda dari J. Saya sudah mulai dengan {(∊∘(⍳¨))⍣⍵+⍵}dan kemudian berpikir, bagaimana saya bisa menyingkirkan kawat gigi itu?
marinus
2

CJam, 14 byte

{_a\{:,:~:)}*}

Uji di sini.

Penjelasan

_a   e# Duplicate N and wrap it in an array.
\    e# Swap with other copy of N.
{    e# Do this N times...
  :, e#   Turn each x into [0 1 ... x-1].
  :~ e#   Unwrap each of those arrays.
  :) e#   Increment each element.
}*
Martin Ender
sumber
2

Mathematica, 27 26 byte

1 byte disimpan dengan beberapa inspirasi dari jawaban Essari.

Flatten@Nest[Range,{#},#]&

Cukup mudah: untuk input xkita mulai dengan {x}dan kemudian menerapkan Rangeuntuk itu xkali ( Rangeadalah Listableyang berarti bahwa secara otomatis berlaku untuk bilangan bulat dalam daftar sewenang-wenang bersarang). Pada akhirnya Flattenhasilnya.

Martin Ender
sumber
2

Clojure, 59 byte

(fn[n](nth(iterate #(mapcat(fn[x](range 1(inc x)))%)[n])n))

Penjelasan:

Cara yang benar-benar lurus ke depan untuk menyelesaikan masalah. Bekerja dari dalam ke luar:

(1) (fn[x](range 1(inc x))) ;; return a list from 1 to x
(2) #(mapcat (1) %)         ;; map (1) over each item in list and flatten result
(3) (iterate (2) [n])       ;; call (2) repeatedly e.g. (f (f (f [n])))
(4) (nth (3) n))            ;; return the nth value of the iteration
menandai
sumber
2

Python 3, 75 74 byte

def f(k):N=[k];exec('A=N;N=[]\nfor i in A:N+=range(1,i+1)\n'*k+'print(N)')

Ini hanya terjemahan langsung dari deskripsi masalah ke kode.

Sunting: Disimpan satu byte berkat @Dennis.

Andrew Epstein
sumber
Anda printdapat pergi ke luar exec.
xnor
Ya, itulah yang saya miliki pada awalnya, tetapi hanya mencetak [k]untuk beberapa alasan. Saya menyerah mencoba mencari tahu apakah itu masalah ruang lingkup atau sesuatu yang lain.
Andrew Epstein
Ya, sepertinya masalah ruang lingkup . Ini berfungsi dengan baik di Python 2.
xnor
2

R, 60 49 byte

Cukup mudah digunakan unlistdan sapply.

y=x=scan();for(i in 1:x)y=unlist(sapply(y,seq));y

Terima kasih kepada @MickyT karena telah menghemat 11 byte

bouncyball
sumber
@MickyT thx untuk tipnya, saya bisa gunakan sequntuk menurunkan jumlah byte
bouncyball
Maaf saya salah membaca pertanyaan
MickyT
2

php 121

Tidak terlalu banyak trik di belakang yang satu ini. Meratakan sebuah array dalam php tidak pendek sehingga perlu untuk membuatnya datar di tempat pertama

<?php for($a=[$b=$argv[1]];$b--;)$a=array_reduce($a,function($r,$v){return array_merge($r,range(1,$v));},[]);print_r($a);
pengguna55641
sumber
Menjaga agar tetap datar adalah ide yang bagus. Tetapi fungsi callback juga tidak singkat. Kalahkan Anda dengan 15 byte. Anda dapat menyimpan 4 byte dengan tag pendek <?atau 6 byte dengan -rdan tanpa tag.
Titus
2

Haskell, 33 byte

f n=iterate(>>= \a->[1..a])[n]!!n

Terima kasih kepada nimi karena telah menghemat satu byte.

Versi pointfree lebih panjang (35 byte):

(!!)=<<iterate(>>= \a->[1..a]).pure
Tidak
sumber
iterate(>>= \a->[1..a])kurang satu byte.
nimi
2

JavaScript (Firefox 30-57), 63 60 byte

f=n=>eval(`[${`for(n of Array(n+1).keys())`.repeat(n--)}n+1]`)

Port of @xnor's Python answer.

Neil
sumber
I tried this with Firefox 42 (SyntaxError: missing : in conditional expression ) and Babel (Unexpected token (1:21)). What am I doing wrong?
Dennis
@Dennis Sorry, but I have no idea; I do in fact have Firefox 42 on one of my machines for some reason and I double-checked and it ran fine there. (I also checked Firefox 37 and 47 just to be sure.)
Neil
Huh, the page didn't refresh and I tested your old version. The new one works just fine.
Dennis
@Dennis Ah, it looks like a stray ) crept into that version somehow.
Neil
1

J, 18 bytes

([:;<@(1+i.)"0)^:]

Straight-forward approach based on the process described in the challenge.

Usage

   f =: ([:;<@(1+i.)"0)^:]
   f 1
1
   f 2
1 1 2
   f 3
1 1 1 2 1 1 2 1 2 3
   f 4
1 1 1 1 2 1 1 1 2 1 1 2 1 2 3 1 1 1 2 1 1 2 1 2 3 1 1 2 1 2 3 1 2 3 4

Explanation

([:;<@(1+i.)"0)^:]  Input: n
                 ]  Identity function, gets the value n
(     ...     )^:   Repeat the following n times with an initial value [n]
      (    )"0        Means rank 0, or to operate on each atom in the list
         i.           Create a range from 0 to that value, exclusive
       1+             Add 1 to each to make the range from 1 to that value
    <@                Box the value
 [:;                  Combine the boxes and unbox them to make a list and return
                    Return the final result after n iterations
miles
sumber
1

Pyth, 8 bytes

usSMGQ]Q

Try it online!

usSMGQ]Q   input as Q

u    Q     repeat for Q times,
      ]Q   starting as [Q]:

  SMG          convert each number in the array to its range
 s             flatten

           then implicitly prints the result.
Leaky Nun
sumber
1

Jelly, 7 bytes

Quick, before Dennis answers (jk)

WR€F$³¡

Try it online!

WR€F$³¡  Main monadic chain. Argument: z

W        Yield [z].
     ³¡  Repeat the following z times:
 R€          Convert each number in the array to the corresponding range.
   F         Flatten the array.
Leaky Nun
sumber
1

F# , 63 bytes

fun n->Seq.fold(fun A _->List.collect(fun k->[1..k])A)[n]{1..n}

Returns an anonymous function taking n as input.

Replaces every entry k in A with [1..k], repeats the process n times, starting with A = [n].

hlo
sumber
1

Swift 3, 58 Bytes

Meant to run directly in the a playground, with n set to the input:

var x=[n];for i in 0..<n{x=x.reduce([]){$0+[Int](1...$1)}}

Ungolfed, with most short hand notation reverted:

let n = 3 //input

var x: Array<Int> = [n]
for i in 0..<n {
    x = x.reduce(Array<Int>[], combine: { accumulator, element in
        accumulator + Array<Int>(1...element)
    })
}
Alexander - Reinstate Monica
sumber
1

Java, 159 Bytes

Procedure

int[] q(int y){int z[]=new int[]{y};for(int i=0;i<y;i++){int d=0,a=0;for(int c:z)d+=c;int[]r=new int[d];for(int c:z)for(int j=0;j<c;)r[a++]=++j;z=r;}return z;}

Usage

public static void main(String[] args){String out = "["; int [] b = q(6);for(int c:b)out+=c+", ";System.out.println(out+"]");}

public static int[] q(int y){int z[]=new int[]{y};for(int i=0;i<y;i++){int d=0,a=0;for(int c:z)d+=c;int[]r=new int[d];for(int c:z)for(int j=0;j<c;)r[a++]=++j;z=r;}return z;}

Sample output:

[1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, ]
Giacomo Garabello
sumber
1

Python 2, 69 68 66 bytes

def f(n):a=[n];exec'a=sum([range(1,i+1)for i in a],[]);'*n;print a

Edit: Saved 1 byte thanks to @xnor. Saved 2 bytes thanks to @Dennis♦.

Neil
sumber
You can remove the parens around exec. In Python 2, it's a keyword, not a function. I count 68 bytes btw.
Dennis
@Dennis Ah, that means I miscounted and it was originally 69 bytes...
Neil
1

Bash + GNU utilities, 49

  • 1 byte saved thanks to @Dennis.

Piped recursive functions FTW!

f()((($1))&&xargs -l seq|f $[$1-1]||dd)
f $1<<<$1

n is passed on the command-line. Output is newline-separated.

The use of dd causes statistics to be sent to STDERR. I think this is OK, but if not, dd can be replaced with cat at a cost of 1 extra byte.

Digital Trauma
sumber
1
Extraneous output to STDERR is allowed by default. You can replace {...;} with (...) to save a byte.
Dennis
@Dennis yes, of course! Apparently you got this tip from me :)
Digital Trauma
0

Perl 5, 53 bytes

A subroutine:

{($i)=@_;for(1..$i){my@c;push@c,1..$_ for@_;@_=@c}@_}

See it in action as

perl -e'print "$_ " for sub{($i)=@_;for(1..$i){my@c;push@c,1..$_ for@_;@_=@c}@_}->(3)'
msh210
sumber
0

Ruby, 61 bytes

def f(n);a=[n];n.times{a=a.map{|i|(1..i).to_a}.flatten};a;end
Andrew
sumber
Hi! Welcome to PPCG. A short explanation would be nice!
TheCoffeeCup
Welcome to PPCG! Unless the challenge overrules this all submissions need to be full programs or functions, not just snippets. (And in this case, the challenge actually confirms this requirement.)
Martin Ender
0

PHP, 100 98 bytes

Run with php -r '<code>' <n>.

for($a=[$n=$argv[1]];$n--;$a=$b)for($b=[],$k=0;$c=$a[$k++];)for($i=0;$i++<$c;)$b[]=$i;print_r($a);

In each iteration create a temporary copy looping from 1..(first value removed) until $a is empty.


These two are still and will probably remain at 100 bytes:

for($a=[$n=$argv[1]];$n--;)for($i=count($a);$i--;)array_splice($a,$i,1,range(1,$a[$i]));print_r($a);

In each iteration loop backwards through array replacing each number with a range.

for($a=[$n=$argv[1]];$n--;)for($i=$c=0;$c=$a[$i+=$c];)array_splice($a,$i,1,range(1,$c));print_r($a);

In each iteration loop through array increasing index by previous number and replacing each indexed element with a range

Titus
sumber