Mảng N ^ N chứa đầy N


62

Trong:  Đủ bộ nhớ và số nguyên dương N

Out:  Mảng N ^ N chứa đầy N, trong đó N ^ N có nghĩa là N thuật ngữ N-by-N-by-N-by ...

Ví dụ:

1: [1]là mảng 1D (danh sách) có độ dài 1, chứa 1

2: [[2,2],[2,2]]là mảng 2D (bảng) có 2 hàng và 2 cột, chứa đầy 2 giây

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]]]là mảng 3D (khối lập phương) có 3 lớp, 3 hàng và 3 cột, chứa đầy 3 giây

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 và 6: Vui lòng xem một trong những câu trả lời.


Nếu ngôn ngữ của chúng tôi không hỗ trợ mảng, định dạng đầu ra có thể chấp nhận là gì?
Okx

17
Vì "Đủ bộ nhớ" là một phần của đầu vào, tôi muốn xem câu trả lời điều khiển robot thực sự lấy bộ nhớ làm đầu vào và cắm nó vào trước khi sử dụng.
user2357112

1
Có phải tất cả các mảng cần phải là đối tượng riêng biệt?
Neil

1
@ user2357112 Tôi nghĩ đó là vấn đề của điều kiện tiên quyết. Tôi nghi ngờ op thực sự mong đợi chức năng chấp nhận bộ nhớ làm đầu vào.
Vịt lớn

2
@TheGreatDuck Đúng, nhưng tôi khá chắc chắn user2357112 có nghĩa là nó như một trò đùa.
Adám

Câu trả lời:


50

Python , 32 byte

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

Hãy thử trực tuyến!

Tạo một chuỗi như "[[[n]*n]*n]*n"với nphép nhân và đánh giá nó dưới dạng mã Python. Vì việc đánh giá xảy ra trong phạm vi hàm, tên biến sẽ nđánh giá đầu vào hàm.


3
lừa phạm vi là thiên tài
Griffin

+1, trò lừa bịp đó thực sự đánh bại rất nhiều byte
MilkyWay90

31

J, 4 byte

$~#~

Hãy thử trực tuyến!

Giải trình

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

6
Khi tôi thấy tiêu đề thách thức, tôi nghĩ ngay đến J. Khá tuyệt vời khi J thậm chí còn đánh bại Jelly (ngôn ngữ chơi golf lấy cảm hứng từ J).
Dane

1
Ngoài ra còn có $~$~tương đương trong khi cũng lặp đi lặp lại bản thân
dặm

2
$~$~được dịch sang tiếng Anh ... TIỀN, nhận thêm, KIẾM, nhận thêm ...
Bạch tuộc ma thuật Urn



9

R, 26

Đây là câu trả lời rõ ràng nhưng có lẽ có gì thông minh hơn?

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

scan()cần thiết không
Adám

Nhìn vào các câu trả lời khác, có vẻ như nó phải là một chức năng hoặc chấp nhận đầu vào bằng cách nào đó?
Flounderer

1
Phải, tôi không biết R chút nào. Tôi chỉ nghĩ rằng bạn có thể chỉ định một chức năng nào đó thay vào đó.
Adám

Vâng, bạn có thể thay thế n=scan();bằng function(n)nhưng nó làm cho nó dài hơn.
Flounderer

5
Bạn có thể lưu một byte bằng cách đặt nphép gán bên trong 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

Bản giới thiệu


8

Haskell , 52 byte

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

Hãy thử trực tuyến!

Lấy cảm hứng từ câu trả lời của @ nimi , nhưng sử dụng các chức năng được xác định trước nhiều hơn.

  • Sử dụng iterate!!thay vì một chức năng trợ giúp đệ quy.
  • Thay vì xây dựng các dấu phân cách danh sách "bằng tay", sử dụng filter(>'"').showđể định dạng danh sách các chuỗi, sau đó tước bỏ các "ký tự phụ .

8

05AB1E (di sản) , 6 5 byte

-1 cảm ơn Kevin Cruijssen

F¹.D)

Hãy thử trực tuyến!

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

Dthể xóa phần đầu bởi vì đầu vào được sử dụng lại một lần nữa (không chắc đây có phải là điều khi bạn đăng câu trả lời không, nhưng Dbây giờ bạn không cần phải nói rõ ràng nữa).
Kevin Cruijssen

1
@KevinCruijssen Tôi nghĩ rằng đây là một trong những câu trả lời cho chúng tôi ý tưởng để nhập liệu nhiều lần :)
Riley

À được rồi Tôi đã thực sự mong đợi nó sẽ không được ngầm định tại thời điểm đăng, nhưng nhận ra rằng sau khi đăng bình luận của tôi (mà tôi đã chỉnh sửa). ;) Đôi khi thật buồn cười khi có bao nhiêu điều rõ ràng đang được thực hiện bởi câu trả lời cũ (thường là trước năm 2017) và bây giờ nó có thể được thực hiện ngắn hơn bao nhiêu.
Kevin Cruijssen


7

Haskell, 62 byte

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

Ví dụ sử dụng: f 2-> "[[2,2],[2,2]]". Hãy thử trực tuyến! .

Hệ thống loại nghiêm ngặt của Haskell ngăn chặn một hàm trả về các danh sách lồng nhau có độ sâu khác nhau, vì vậy tôi xây dựng kết quả dưới dạng chuỗi.

Làm thế nào nó hoạt động:

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         

Chúng ta có thể thực hiện cùng một ý tưởng ngắn hơn với các hàm dựng sẵn hơn : f n=iterate(filter(>'#').show.(<$[1..n]))(show n)!!n.
Ørjan Johansen

@ RjanJohansen: đó là một ý tưởng tuyệt vời. Xin vui lòng gửi nó như là một câu trả lời riêng biệt.
nimi

Bạn có thể cạo một byte với (#0)=show? Không quá quen thuộc với Haskell
Cyoce

@Cyoce: Không, đó là lỗi cú pháp. Để có một cú pháp đúng, tôi có thể lật các đối số và sử dụng (#)0=show, nhưng tất cả các định nghĩa của hàm phải có cùng số lượng đối số. Dòng thứ hai ( n#l='['...) cần hai đối số, vì vậy dòng đầu tiên cũng phải có hai đối số.
nimi

6

MATL, 8 byte

ttY"l$l*

Hãy thử tại MATL Online (Tôi đã thêm một số mã hiển thị kích thước thực của đầu ra vì tất cả các đầu ra n chiều trong MATL được hiển thị dưới dạng ma trận 2D trong đó tất cả các kích thước> 2 được làm phẳng thành chiều thứ hai).

Giải trình

        % 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  

Tôi thực sự không thể nói với MATL Online xem bài nộp của bạn có đúng hay không. Có vẻ như mọi câu trả lời là một ma trận rộng.
Adám

4
@ Adám Kích thước vượt quá thứ hai được hiển thị như được thu gọn thành thứ hai. Vì vậy, ví dụ cho thấy một mảng 3x9 thay vì mảng 3x3x3 được sản xuất. Nếu bạn thêm Zyvào cuối mã, nó sẽ cho biết kích thước thực tế
Luis Mendo

6

Python 2 , 36 byte

-2 byte nhờ @CalculatorFeline

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

Hãy thử trực tuyến!


~-n== (n-1).
Máy

Có thể bao gồm một liên kết TIO ?
Adám

1
Trong thực tế, điều này! (-8 byte do thuật toán được tối ưu hóa, +9 byte để thêm đầu ra)
CalculatorFeline

@CalculatorFeline Bạn có thể đặt mọi thứ vào Header và Footer để tránh đưa vào số byte.
Adám

1
Không yêu cầu đầu vào và đầu ra trong đệ trình chương trình đầy đủ?
Máy

5

CJam , 12 byte

ri:X{aX*}X*p

Hãy thử trực tuyến!

Giải trình

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

Thạch , 5 byte

⁾Wẋẋv

Hãy thử trực tuyến!

Làm sao?

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

Câu trả lời Jelly 5 byte thứ hai . Vẫn còn dài không thể chấp nhận được so với J :-)
Adám

2
... và không phải vì muốn thử: 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;}

Ung dung:

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
bạn có thể thay thế i<=1bằng i<2?
vách đá

Có @cliffrott. Điều đó đã làm việc. cảm ơn!!
anacron

1
Bạn có thể lưu một vài byte bằng lambda:(n,i)->{...}

Java 8 lambdas ftw

1
Hmm, có vẻ như điều này cần thêm đầu vào. Bạn sẽ cần tạo một phương thức riêng biệt chỉ một tham số để điều này có hiệu lực.
Jakob

5

JavaScript (ES6), 38 byte

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

Phiên bản ngốn bộ nhớ này là 45 byte:

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

5

Tiện ích 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] \ []

Hãy thử trực tuyến!


Chương trình về cơ bản được tính từ 0 đến (n ​​^ n) -1 trong cơ sở n, trong đó n là đầu vào. Với mỗi số cơ sở n trong số đếm, nó thực hiện như sau:

  1. Nếu k kết thúc với ít nhất một chữ số 0, hãy in '[' cho mỗi chữ số 0 ở cuối k.
  2. In n.
  3. Nếu k kết thúc với ít nhất một chữ số n-1, hãy in ']' cho mỗi chữ số n-1 ở cuối k.

(Giá trị n = 1 cần phải có dấu ngoặc được thêm vào như một trường hợp đặc biệt. Giá trị đầu vào này cũng tạo ra một số đầu ra cho thiết bị lỗi chuẩn, có thể bỏ qua theo quy tắc PPCG tiêu chuẩn.)

Có lẽ có một cách ngắn hơn để thực hiện ý tưởng này.


Chạy mẫu:

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

Thạch , 4 byte

R»µ¡

Hãy thử trực tuyến!

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

Điều tương tự nhưng với một đơn nguyên và không cần phân tách chuỗi:

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

Hãy thử trực tuyến!


-4 byte nhờ @CalculatorFeline


34 byte:

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

Cần phải được gọi là f(4,4)


Tại sao các dòng mã của bạn bị đảo ngược so với liên kết TIO của bạn?
Adám

Bạn có thể thay thế c>1bằng c để tiết kiệm 1 byte. (Đánh dấu xuống, dừng lặp lại các khoảng trắng trên `s)
CalculatorFeline

@CalculatorFeline Tôi không nghĩ anh ấy có thể; mà có thể c>0trong trường hợp đặc biệt này.
Erik the Outgolfer

Sau đó thay đổi kết thúc thành <space>n. Vấn đề được giải quyết và phần thưởng nhiều byte được lưu! : D (Vì vậy, khoảng trắng ở cuối mã nội tuyến là có thể, nhưng không phải là bắt đầu? Thật lạ ...) Liên kết TIO
CalculatorFeline

@ Adám: Trên TIO để cho phép chức năng chính được gán trong tiêu đề và ở đây để giữ chức năng chính trên dòng cuối cùng.
Máy


4

Ruby, 27 byte

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

Chỉ thêm 1 byte nhưng sử dụng một cách tiếp cận khác thay vì mẹo 'eval' từ câu trả lời Python tuyệt vời của xnor.


3

Perl 6 , 25 byte

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

Bắt đầu với nvà lặp lại áp dụng lần chuyển đổi "lặp lại n lần" n, mỗi lần tạo thêm một mức Listlồng nhau.

Hãy thử trực tuyến!


$_Thay vào đó, hãy sử dụng để lưu một byte
Jo King

@JoKing: Tôi đã sử dụng $_làm tham số của khối bên trong, vì vậy tôi cũng không thể sử dụng nó làm tham số của khối bên ngoài.
smls

Có, nhưng $n$_luôn có cùng giá trị. Hãy thử trực tuyến!
Jo King

3

PHP, 70 62 byte

Đây là cách đơn giản nhất tôi có thể nghĩ ra.

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

Lấy đầu vào làm đối số đầu tiên và in mảng kết quả trên màn hình.


Cảm ơn @ user59178 vì đã tiết kiệm cho tôi 8 byte !


Việc gán trước các biến như thế là không cần thiết $l. Bỏ $i=0,và thay thế $lbằng $n tiết kiệm 7 byte. Một byte bổ sung có thể được lưu bằng cách không gán $F, gán $ntrong điều kiện và sử dụng một ternary $F?:$ntrongarray_fill()
user59178

@ user59178 Tôi không biết đây có phải là điều bạn nghĩ hay không, nhưng, cảm ơn bạn vì những lời khuyên. Bạn đã tiết kiệm cho tôi 8 byte!
Ismael Miguel

3

Clojure, 36 byte

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

Lặp lại hàm lặp lại nthời gian đối số của nó , nó tạo ra chuỗi vô hạn của các phần tử như vậy và sau đó lấy nphần tử thứ của nó .

Xem nó trực tuyến



3

Mẻ, 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 không thực sự có mảng nên điều này chỉ in biểu diễn chuỗi của một mảng. Giải thích: Hai dòng đầu tiên xây dựng một mẫu lặp lại của N .s cách nhau bởi N-1 ,s trong biến t. Dòng thứ tư sau đó sử dụng dòng này như một mẫu thay thế Nlần để tạo Nmảng -dimensional. Nhân đôi calllà cần thiết vì cách thức forvà các setbáo cáo hoạt động. Đầu tiên, forlệnh thay thế các biến. Khi nó xảy ra, tất cả các %dấu hiệu của tôi được nhân đôi, vì vậy điều này không làm gì ngoài việc bỏ qua tất cả chúng, dẫn đến call call set s=[%%t:.=%s%%%]. Sau đó, nó lặp lại các Nlần tuyên bố kết quả . Mỗi lần, calllệnh thay thế các biến. Tại thời điểm này, sbiến chỉ có một bộ%s, do đó, nó được thay thế, dẫn đến (ví dụ) call set s=[%t:.=[2,2]%]. Cuộc gọi bên trong sau đó thay thế tbiến, dẫn đến (ví dụ) set s=[[2,2],[2,2]], thực hiện nhiệm vụ mong muốn. Giá trị cuối cùng ssau đó được in.


+1 Wow, tôi sẽ không mong đợi điều đó. Tất cả các tập tin .bat khiêm tốn!
Adám

3

Clojure, 49 byte

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

Không phải là ví dụ Clojure ngắn nhất, nhưng tôi thích thú với việc trích dẫn và không trích dẫn.


3

Tôi , 7 byte

Tôi đã nhận được điều này từ đồng nghiệp của tôi, người tạo ra tôi.

#Bbhph~

#Bb     bản sao #chức năng B ound để b inding
   hp  h ook lập luận để (quyền) các p chức năng ower (repeat)
     h~h ook đối số bên trái ~(của toàn bộ chức năng kết quả)

Hãy thử trực tuyến!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.