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]


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

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.


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


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.


+%(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.

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.


;#@"♂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;

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

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.
}*

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.


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

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.


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


@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);

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

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.


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

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.

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.

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


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

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

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♦.


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.


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


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

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.