N-dimensional N ^ N array diisi dengan N


62

Dalam:  Memori yang cukup dan bilangan bulat positif N

Keluar:  N-dimensi N ^ N array diisi dengan N, di mana N ^ N berarti N istilah N-oleh-N-oleh-N-oleh ...

Contoh:

1: [1]yang merupakan array 1D (daftar) dengan panjang 1, berisi 1 tunggal

2: [[2,2],[2,2]]yang merupakan array 2D (tabel) dengan 2 baris dan 2 kolom, diisi dengan 2s

3: [[[3,3,3],[3,3,3],[3,3,3]],[[3,3,3],[3,3,3],[3,3,3]],[[3,3,3],[3,3,3],[3,3,3]]]yang merupakan array 3D (kubus) dengan 3 lapisan, 3 baris, dan 3 kolom, diisi dengan 3s

4: [[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]]]

5 dan 6: Silakan lihat salah satu jawabannya.


Jika bahasa kami tidak mendukung array, apa yang akan menjadi format output yang dapat diterima?
Okx

17
Karena "Cukup memori" adalah bagian dari input, saya ingin melihat jawaban yang mengontrol robot untuk benar-benar mengambil memori sebagai input dan tancapkan sebelum menggunakannya.
user2357112

1
Apakah semua array perlu objek yang berbeda?
Neil

1
@ user2357112 Saya pikir itu lebih merupakan masalah tipe prasyarat. Saya ragu op sebenarnya mengharapkan fungsi untuk menerima memori sebagai input.
The Great Duck

2
@TheGreatDuck Benar, tapi aku cukup yakin user2357112 bermaksud sebagai lelucon.
Adm

Jawaban:


50

Python , 32 byte

lambda n:eval('['*n+'n'+']*n'*n)

Cobalah online!

Membuat string seperti "[[[n]*n]*n]*n"dengan nperkalian, dan mengevaluasinya sebagai kode Python. Karena evaluasi terjadi dalam lingkup fungsi, nama variabel nmengevaluasi ke input fungsi.


3
trik cakupannya adalah jenius
Griffin

+1, trik eval itu benar-benar menurunkan banyak byte
MilkyWay90

31

J, 4 byte

$~#~

Cobalah online!

Penjelasan

$~#~  Input: integer n
  #~  Create n copies of n
$~    Shape n into an array with dimensions n copies of n

6
Ketika saya melihat judul tantangan, saya langsung memikirkan J. Cukup keren sehingga J bahkan mengalahkan Jelly (bahasa golf yang terinspirasi oleh J).
Dane

1
Ada juga $~$~yang setara sambil mengulangi sendiri
mil

2
$~$~diterjemahkan ke Bahasa Inggris ... MONEY, get more of, MONEY, get more of ...
Magic Octopus Urn


12

Mathematica, 22 20 byte

(t=Table)@@t[#,#+1]&

(* or *)

Table@@Table[#,#+1]&

9

R, 26

Ini jawaban yang jelas tapi mungkin ada yang lebih pintar?

n=scan();array(n,rep(n,n))

Apakah scan()perlu?
Adám

Melihat jawaban yang lain, sepertinya ia harus berfungsi atau menerima input?
Flounderer

1
Benar, saya tidak tahu R sama sekali. Saya hanya berpikir bahwa Anda dapat menentukan suatu fungsi entah bagaimana sebagai gantinya.
Adám

Ya, Anda bisa mengganti n=scan();dengan function(n)tetapi itu membuatnya lebih lama.
Flounderer

5
Anda dapat menyimpan satu byte dengan menempatkan ntugas dalam array: array(n<-scan(),rep(n,n)).
rturnbull

8

JavaScript (ES6),  44  40 byte

f=(n,k=i=n)=>i--?f(n,Array(n).fill(k)):k

Demo


8

Haskell , 52 byte

f n=iterate(filter(>'"').show.(<$[1..n]))(show n)!!n

Cobalah online!

Terinspirasi oleh jawaban @ nimi , tetapi menggunakan lebih banyak fungsi yang telah ditentukan sebelumnya.

  • Menggunakan iteratedan !!bukannya fungsi bantuan rekursif.
  • Alih-alih membangun pembatas daftar "dengan tangan", gunakan filter(>'"').showuntuk memformat daftar string, lalu menghilangkan "karakter tambahan .

8

05AB1E (legacy) , 6 5 byte

-1 terima kasih kepada Kevin Cruijssen

F¹.D)

Cobalah online!

F     # For 0 .. input
 ¹.D) # Push <input> copies of the result of the last step as an array

Pimpinan Ddapat dihapus karena input digunakan lagi secara tersirat (tidak yakin apakah ini adalah sesuatu ketika Anda memposting jawabannya, tetapi Anda tidak perlu eksplisit Dlagi sekarang).
Kevin Cruijssen

1
@KevinCruijssen Saya pikir ini adalah salah satu jawaban yang memberi kami ide untuk secara implisit memasukkan input berkali-kali :)
Riley

Ah baiklah. Saya memang mengharapkannya untuk tidak secara implisit pada saat posting, tetapi menyadari bahwa setelah memposting komentar saya (yang saya edit). ;) Terkadang lucu seberapa banyak hal eksplisit dilakukan oleh jawaban lama (biasanya sebelum 2017), dan seberapa pendek hal itu dapat dilakukan sekarang.
Kevin Cruijssen


7

Haskell, 62 byte

n#0=show n
n#l='[':tail((',':)=<<n#(l-1)<$[1..n])++"]"
f n=n#n

Contoh penggunaan: f 2-> "[[2,2],[2,2]]". Cobalah online! .

Sistem ketat Haskell mencegah fungsi yang mengembalikan daftar bersarang dari kedalaman yang berbeda, jadi saya membuat hasilnya sebagai string.

Bagaimana itu bekerja:

n#l=                         n with the current level l is
    '[':                     a literal [ followed by
           n#(l-1)<$[1..n]   n copies of   n # (l-1)
        (',':)=<<            each prepended by a , and flattened into a single list
      tail                   and the first , removed
                  ++"]"      followed by a literal ]

n#0=show n                   the base case is n as a string

f n=n#n                      main function, start with level n         

Kita bisa melakukan ide yang sama pendek dengan fungsi yang lebih builtin: f n=iterate(filter(>'#').show.(<$[1..n]))(show n)!!n.
Ørjan Johansen

@ ØrjanJohansen: itu ide bagus. Silakan posting sebagai jawaban terpisah.
nimi

Bisakah Anda mencukur byte dengan (#0)=show? Tidak terlalu akrab dengan Haskell
Cyoce

@Cyoce: Tidak, itu kesalahan sintaksis. Untuk sintaks yang benar saya bisa membalik argumen dan menggunakan (#)0=show, tetapi semua definisi fungsi harus memiliki jumlah argumen yang sama. Baris kedua ( n#l='['...) membutuhkan dua argumen, jadi baris pertama juga harus memiliki dua argumen.
nimi

6

MATL, 8 byte

ttY"l$l*

Cobalah di MATL Online (Saya telah menambahkan beberapa kode yang menunjukkan ukuran sebenarnya dari keluaran karena semua keluaran n-dimensi dalam MATL ditampilkan sebagai matriks 2D di mana semua dimensi> 2 diratakan ke dalam dimensi kedua).

Penjelasan

        % Implicitly grab the input (N)
tt      % Make two copies of N
Y"      % Perform run-length decoding to create N copies of N
l$1     % Create a matrix of ones that is this size  
*       % Multiply this matrix of ones by N
        % Implicitly display the result  

Saya tidak bisa mengatakan dari MATL Online apakah kiriman Anda melakukan hal yang benar. Sepertinya setiap jawaban adalah matriks lebar.
Adám

4
@ Adám Dimensi di luar yang kedua ditampilkan sebagai diciutkan ke dalam yang kedua. Jadi contoh menunjukkan array 3x9 bukan array 3x3x3 yang dihasilkan. Jika Anda menambahkan Zydi akhir kode itu memberitahu ukuran sebenarnya
Luis Mendo

6

Python 2 , 36 byte

-2 byte terima kasih kepada @CalculatorFeline

a=n=input()
exec"a=[a]*n;"*n
print a

Cobalah online!


~-n== (n-1).
CalculatorFeline

Apakah mungkin untuk menyertakan tautan TIO ?
Adám

1
Sebenarnya ini! (-8 byte karena algoritma yang dioptimalkan, +9 byte untuk menambah output)
CalculatorFeline

@ CalculatorFeline Anda dapat meletakkan segala sesuatu di Header dan Footer untuk menghindari penyertaan dalam jumlah byte.
Adám

1
Bukankah input dan output diperlukan dalam pengiriman program lengkap?
CalculatorFeline

5

CJam , 12 byte

ri:X{aX*}X*p

Cobalah online!

Penjelasan

ri:X          Read an integer from input, store it in X (leaves it on the stack)
    {   }X*   Execute this block X times:
     a          Wrap the top of stack in an array
      X*        Repeat the array X times
           p  Print nicely

5

Jelly , 5 byte

⁾Wẋẋv

Cobalah online!

Bagaimana?

⁾Wẋẋv - Main link: n                            e.g.       3
⁾Wẋ   - character pair literal ['W','ẋ']                  "Wẋ"
   ẋ  - repeat list n times                               "WẋWẋWẋ"
    v - evaluate as Jelly code with input n          eval("WẋWẋWẋ", 3)
      - ...
        WẋWẋ... - toEval: n                e.g. 3
        W        - wrap                        [3]
         ẋ       - repeat list n times         [3,3,3]
          Wẋ     - wrap and repeat            [[3,3,3],[3,3,3],[3,3,3]]
            ...  - n times total             [[[3,3,3],[3,3,3],[3,3,3]],[[3,3,3],[3,3,3],[3,3,3]],[[3,3,3],[3,3,3],[3,3,3]]]

Jawaban Jelly 5-byte kedua . Masih terlalu lama dibandingkan dengan J :-)
Adám

2
... dan bukan karena tidak mau mencoba: D
Jonathan Allan

5

Java 97 96 95 byte

Object c(int n,int i){Object[]a=new Object[n];for(int j=0;j<n;)a[j++]=i<2?n:c(n,i-1);return a;}

Tidak Disatukan:

public class N_Dim {

    public static Object create(int n) {
        return create(n, n);
    }

    public static Object create(int n, int i) {
        Object[] array = new Object[n];
        for(int j=0;j<n;j++) {
            array[j] = i<2?n:create(n, i - 1);
        }
        return array;
    }

    public static void main(String[] args) {
        System.out.println(Arrays.deepToString((Object[]) create(3)));
    }

}

1
Anda dapat mengganti i<=1dengan i<2?
cliffroot

Ya @cliffrott. Itu berhasil. Terima kasih!!
anacron

1
Anda dapat menyimpan beberapa byte dengan lambda:(n,i)->{...}

Java 8 lambdas ftw

1
Hmm, sepertinya ini butuh input ekstra. Anda harus membuat metode terpisah hanya dengan satu parameter agar ini valid.
Jakob

5

JavaScript (ES6), 38 byte

f=(n,m=n)=>m?Array(n).fill(f(n,m-1)):n

Versi haus memori ini adalah 45 byte:

f=(n,m=n)=>m?[...Array(n)].map(_=>f(n,m-1)):n

5

Utilitas Bash + GNU, 117 byte

n=$[$1**$1]
seq -f$1o%.fd$n+1-p $n|dc|rev|sed -r "s/(0+|$[$1-1]*).*$/\1/;s/^(0*)/\1$1/;s/^1/[1]/"|tr \\n0$[$1-1] \ []

Cobalah online!


Program ini pada dasarnya dihitung dari 0 hingga (n ^ n) -1 di basis n, di mana n adalah input. Untuk setiap basis-n angka k dalam hitungan, ia melakukan hal berikut:

  1. Jika k berakhir dengan setidaknya satu digit 0, cetak '[' untuk setiap digit 0 di akhir k.
  2. Cetak n.
  3. Jika k berakhir dengan setidaknya satu digit n-1, cetak a ']' untuk setiap digit n-1 di akhir k.

(Nilai n = 1 perlu ditambahkan tanda kurung sebagai kasus khusus. Nilai input ini juga menghasilkan beberapa output ke stderr, yang dapat diabaikan berdasarkan aturan PPCG standar.)

Mungkin ada cara yang lebih singkat untuk mengimplementasikan ide ini.


Contoh dijalankan:

./array 3
[[[3 3 3] [3 3 3] [3 3 3]] [[3 3 3] [3 3 3] [3 3 3]] [[3 3 3] [3 3 3] [3 3 3]]]

5

Jelly , 4 byte

R»µ¡

Cobalah online!

R»µ¡
R     Range. 2 -> [1, 2]
 »    Max between left arg and right arg. Vectorizes. -> [2, 2]
  µ   Separates into a new chain.
   ¡  Repeat 2 times. After another iteration this yields [[2, 2], [2, 2]].

Hal yang sama tetapi dengan monad tunggal dan tidak perlu pemisah rantai:

4 byte

»€`¡


4

Python 3 , 57 53 50 38 byte

f=lambda n,c=0:n-c and[f(n,c+1)*n]or 1

Cobalah online!


-4 byte terima kasih kepada @CalculatorFeline


34 byte:

f=lambda c,n:c and[f(c-1,n)*n]or 1

Perlu disebut sebagai f(4,4)


Mengapa garis kode Anda terbalik dibandingkan dengan tautan TIO Anda?
Adám

Anda dapat mengganti c>1dengan c untuk menghemat 1 byte. (Penurunan harga, hentikan ruang deduplikasi di seluruh `)
CalculatorFeline

@ CalculatorFeline Saya tidak berpikir dia bisa; itu akan c>0dalam kasus khusus ini.
Erik the Outgolfer

Kemudian ubah akhir menjadi <space>n. Masalah terpecahkan dan bonus – lebih banyak byte disimpan! : D (Jadi spasi di akhir kode sebaris mungkin, tetapi bukan permulaan? Itu aneh ...) TIO link
CalculatorFeline

@ Adám: Pada TIO untuk memungkinkan fungsi utama ditugaskan di header dan di sini untuk menjaga fungsi utama di baris terakhir.
CalculatorFeline


4

Ruby, 27 byte

->a{(z=a).times{z=[z]*a};z}

Hanya 1 byte lebih banyak tetapi menggunakan pendekatan yang berbeda dan bukan trik 'eval' dari jawaban Python xnor yang luar biasa.


3

Perl 6 , 25 byte

{($^n,{$_ xx$n}...*)[$n]}

Dimulai dengan n, dan secara iteratif menerapkan waktu transformasi "repeat n times" n, setiap kali menciptakan level tambahan dari Listnesting.

Cobalah online!


Gunakan $_sebagai gantinya untuk menyimpan byte
Jo King

@ JoKing: Saya sudah menggunakan $_parameter blok dalam, jadi saya tidak bisa menggunakannya sebagai parameter blok luar juga.
smls

Ya, tetapi $ndan $_selalu memiliki nilai yang sama. Cobalah online!
Jo King

3

PHP, 70 62 byte

Ini adalah yang paling sederhana yang bisa saya lakukan.

for(;$i++<$n=$argv[1];)$F=array_fill(0,$n,$F?:$n);print_r($F);

Mengambil input sebagai argumen pertama dan mencetak array yang dihasilkan di layar.


Terima kasih kepada @ user59178 karena telah menyelamatkan saya 8 byte !


Variabel pra-penetapan seperti itu tidak perlu, sebagaimana adanya $l. Menjatuhkan $i=0,& mengganti $ldengan $n menghemat 7 byte. Byte tambahan dapat disimpan dengan tidak menetapkan $F, menetapkan $ndalam kondisi dan menggunakan ternary $F?:$ndiarray_fill()
user59178

@ user59178 Saya tidak tahu apakah ini yang ada dalam pikiran Anda atau tidak, tapi, terima kasih atas tipsnya. Anda telah menyelamatkan saya 8 byte!
Ismael Miguel

3

Clojure, 36 byte

#(nth(iterate(fn[a](repeat % a))%)%)

Iterasikan fungsi yang mengulangi argumennya nkali, menghasilkan urutan elemen yang tak terbatas dan kemudian mengambil nelemennya.

Lihat online


3

Rebol, 45 byte

func[n][array/initial append/dup copy[]n n n]

3

Batch, 141 byte

@set t=.
@for /l %%i in (2,1,%1)do @call set t=%%t%%,.
@set s=%1
@for /l %%i in (1,1,%1)do @call call set s=[%%%%t:.=%%s%%%%%%]
@echo %s%

Batch sebenarnya tidak memiliki array, jadi ini hanya mencetak representasi string dari array. Penjelasan: Dua baris pertama membangun pola berulang N .s dipisahkan oleh N-1 ,s dalam variabel t. Baris keempat kemudian menggunakan ini sebagai waktu pola substitusi Nuntuk membuat Narray -dimensi. Dobel calldiperlukan karena cara kerja fordan setpernyataan. Pertama, forperintah tersebut menggantikan variabel. Seperti yang terjadi, semua saya %tanda-tanda dua kali lipat, jadi ini tidak apa-apa kecuali tanda kutip mereka semua, sehingga call call set s=[%%t:.=%s%%%]. Itu kemudian mengulangi waktu pernyataan yang dihasilkan N. Setiap kali, callperintah itu menggantikan variabel. Pada titik ini, svariabel hanya memiliki satu set%s, jadi itu diganti, menghasilkan (misalnya) call set s=[%t:.=[2,2]%]. Panggilan batin kemudian menggantikan tvariabel, menghasilkan (misalnya) set s=[[2,2],[2,2]], melakukan tugas yang diinginkan. Nilai akhir dari skemudian dicetak.


+1 Wow, saya tidak akan mengharapkan itu. Semua memuji file .bat yang rendah hati!
Adam

3

Clojure, 49 byte

(defmacro r[n]`(->> ~n ~@(repeat n`(repeat ~n))))

Bukan contoh Clojure terpendek, tetapi saya menghibur diri dengan mengutip dan tidak mengutip.


3

I , 7 byte

Saya mendapat ini dari rekan saya, pencipta saya.

#Bbhph~

#Bb    #fungsi  salin B ound ke b inding
   hp  h ook argumen ke (kanan) fungsi p ower (repeat)
     h~h ook argumen ke kiri ~(dari seluruh fungsi yang dihasilkan)

Cobalah online!


3

Common Lisp, 128 102 95 79 byte

(defun f(x &optional y)(if(if y(< y 2))x(fill(make-list x)(f x(if y(1- y)x)))))

Cobalah online!

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.