填充N的N维N ^ N数组


62

输入:  足够的内存和一个正整数N

出:  用N填充的N维N ^ N数组,其中N ^ N表示N个N个N个N个N个项的N个项...

例子:

1:[1]是长度为1的一维数组(列表),包含单个1

2:[[2,2],[2,2]]这是一个2行2列的2D数组(一个表),用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]]]这是一个3D数组(一个多维数据集),具有3层,3行和3列,填充了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和6:请参阅答案之一。


如果我们的语言不支持数组,那么可接受的输出格式是什么?
Okx

17
由于“足够的内存”是输入的一部分,因此我想看到一个答案,该答案可以控制机器人将内存实际用作输入并在使用前将其插入。
user2357112 '17

1
所有的数组都需要是不同的对象吗?
尼尔

1
@ user2357112我认为这更多是一个前提类型问题。我怀疑op实际上期望该函数接受内存作为输入。
大鸭

2
@TheGreatDuck正确,但是我可以肯定user2357112只是在开玩笑。
亚当

Answers:


50

Python,32字节

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

在线尝试!

使得像一个字符串"[[[n]*n]*n]*n"nmultiplcations,并评估它作为Python代码。由于评估发生在功能范围内,因此变量名称将n评估为功能输入。


3
范围的技巧是天才
格里芬

+1,这个评估把戏真的击倒了很多字节
MilkyWay90

31

J,4个字节

$~#~

在线尝试!

说明

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

6
当我看到挑战标题时,我立刻想到了J。J甚至击败Jelly(受J启发的高尔夫语言),真是太酷了。
戴恩

1
$~$~重复的同时也具有同等的功能
英里

2
$~$~翻译成英语...钱,得到更多,钱,得到更多...
魔术八爪鱼缸


12

Mathematica,22个 20字节

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

(* or *)

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

9

R,26

这是显而易见的答案,但是也许有些聪明之处?

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

scan()必要吗?
亚当

查看其他答案,看来它要么必须是一个函数,要么是以某种方式接受输入?
Flounderer

1
是的,我根本不认识R。我只是认为您可以以某种方式指定函数。
亚当

是的,您可以替换为n=scan();function(n)但是它会使它更长。
Flounderer

5
您可以通过将n分配放在array:中节省一个字节array(n<-scan(),rep(n,n))
rturnbull

8

JavaScript(ES6), 44个  40字节

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

演示版


8

Haskell,52个字节

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

在线尝试!

@nimi的答案启发,但使用了更多预定义的功能。

  • 使用iterate!!代替递归帮助功能。
  • 代替“手工”构造列表定界符,它filter(>'"').show用于格式化字符串列表,然后去除多余的"字符。

8

05AB1E(旧版)6 5字节

-1感谢Kevin Cruijssen

F¹.D)

在线尝试!

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

领先的D可移除,因为输入被隐式再次使用(不知道这是一件事,当你张贴的答案,但你并不需要显式的D再现在)。
凯文·克鲁伊森

1
@KevinCruijssen我认为这是使我们有了多次隐式输入的想法的答案之一:)
Riley

喔好吧。我确实希望它在发布时不会隐含,但是在发布我的评论(我编辑过)后才意识到。;)有时很有趣的是,旧答案(通常在2017年之前)做了多少明确的事情,而现在可以完成多少次。
凯文·克鲁伊森

7

八度,35 33 25 23 20字节

@(N)ones(N+!(1:N))*N

在线尝试!

@(N)ones(N*ones(1,N))*N

@(N)repmat(N,N*ones(1,N))

感谢@LuisMendo节省了8个字节

@(N)ones(num2cell(!(1:N)+N){:})*N

在线尝试!

先前的答案:

@(N)repmat(N,num2cell(!(1:N)+N){:})

在线尝试!


@LuisMendo Rats,我正要张贴那个;)
烧杯

@beaker Whoops :-)
Luis

7

Haskell,62个字节

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

用法示例:f 2-> "[[2,2],[2,2]]"在线尝试!

Haskell的严格类型系统阻止函数返回不同深度的嵌套列表,因此我将结果构造为字符串。

这个怎么运作:

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         

我们可以用更多的内置函数做同样的想法更短:f n=iterate(filter(>'#').show.(<$[1..n]))(show n)!!n
与Orjan约翰森

@ØrjanJohansen:好主意。请将其作为单独的答案发布。
nimi

你能剃一个字节(#0)=show吗?对Haskell不太熟悉
Cyoce's

@Cyoce:不,这是语法错误。为了获得正确的语法,我可以翻转参数并使用(#)0=show,但是函数的所有定义必须具有相同数量的参数。第二行(n#l='['...)需要两个参数,因此第一行还必须具有两个参数。
nimi

6

MATL,8个字节

ttY"l$l*

MATL Online上尝试一下(我添加了一些代码来显示输出的实际大小,因为MATL中的所有n维输出都显示为2D矩阵,其中所有维> 2都被展平为第二维)。

说明

        % 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  

我真的无法从MATL Online判断您提交的内容是否正确。似乎每个答案都是一个广泛的矩阵。
亚当

4
@Adám超出第二个的尺寸显示为折叠成第二个。因此,该示例显示了一个3x9数组,而不是生成的3x3x3数组。如果Zy在代码末尾添加,它会告诉您实际大小
Luis Mendo

6

Python 2,36个字节

-2个字节,感谢@CalculatorFeline

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

在线尝试!


~-n== (n-1)
CalculatorFeline

是否可以包含TIO链接
亚当

1
其实这个!(由于优化了算法,-8字节,+ 9字节添加了输出)
CalculatorFeline

@CalculatorFeline可以将内容放在页眉和页脚中,以避免包含在字节数中。
亚当

1
完整程序提交中不需要输入和输出吗?
CalculatorFeline

5

CJam,12个字节

ri:X{aX*}X*p

在线尝试!

说明

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

果冻,5 个字节

⁾Wẋẋv

在线尝试!

怎么样?

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

第二个 5字节的果冻答案。仍然不能接受的长时间相比,Ĵ :-)
亚当

2
...而不是不想尝试:D
乔纳森·艾伦

5

Java 97 96 95字节

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

取消高尔夫:

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
你可以替换i<=1使用i<2
悬崖根

是的@cliffrott。那行得通。谢谢!!
anacron

1
您可以使用lambda保存一些字节:(n,i)->{...}

Java 8

1
嗯,看起来这需要额外的输入。您需要仅使用一个参数的单独方法才能使其生效。
Jakob

5

JavaScript(ES6),38个字节

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

需要大量内存的版本为45个字节:

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

5

Bash + GNU实用程序,117个字节

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] \ []

在线尝试!


程序本质上从0到以n为底的(n ^ n)-1计数,其中n是输入。对于计数中的每个以n为底的数字k,它将执行以下操作:

  1. 如果k以至少一位数字0结尾,则在k的末尾为每个数字0打印'['。
  2. 打印n。
  3. 如果k以至少一位n-1结尾,则在k的末尾为每位n-1打印一个']'。

(在特殊情况下,值n = 1需要添加方括号。此输入值还会生成一些输出到stderr,在标准PPCG规则下可以忽略此输出。)

也许有一个较短的方法可以实现这个想法。


样品运行:

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

果冻,4字节

R»µ¡

在线尝试!

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

同样的事情,但是只有一个monad,并且不需要链分隔符:

4字节

»€`¡


4

Python 3中57 53 50 38个字节

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

在线尝试!


-4个字节,感谢@CalculatorFeline


34个字节:

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

需要称为 f(4,4)


与TIO链接相比,为什么您的代码行相反?
亚当

您可以替换c>1使用c ,以节省1个字节。(降价,停止对`s进行重复数据删除)
CalculatorFeline

@CalculatorFeline我不认为他可以;那会c>0在这种特殊情况下。
Erik the Outgolfer

然后将结尾更改为<space>n。问题解决了,奖金–节省了更多字节!:D(因此,在内联代码的末尾可以加空格,但不能在开头?这很奇怪...)TIO链接
CalculatorFeline

@Adám:在TIO上,允许在头中分配主要功能,此处将主要功能保留在最后一行。
CalculatorFeline


4

Ruby,27个字节

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

仅多了1个字节,但使用了不同的方法,而不是xnor出色的Python回答中的“ eval”技巧。



3

PHP,70 62字节

这是我能想到的最简单的方法。

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

将输入作为第一个参数,并在屏幕上打印结果数组。


感谢@ user59178为我节省了8个字节


不需要像这样预先分配变量$l。删除$i=0,&替换$l$n 保存7个字节。一个额外的字节可以通过不分配被保存$F,分配$n在有条件的并且使用三元$F?:$narray_fill()
user59178

@ user59178我不知道您是否打算这样做,但是,谢谢您的提示。您为我节省了8个字节!
Ismael Miguel

3

Clojure,36个字节

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

迭代函数,该函数重复其自变量n时间,生成此类元素的无限序列,然后获取其n第th个元素。

在线观看



3

批处理,141字节

@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%

批处理实际上没有数组,因此仅打印数组的字符串表示形式。说明:前两行在变量中建立了一个由N .s分隔的N-1 ,s 的重复模式t。然后,第四行将其用作替代模式N时间以创建- N维数组。call由于forand set语句是如何工作的,因此必须使用double 。首先,该for命令替换变量。碰巧的是,我所有的%符号都加倍了,所以除了取消引用所有这些之外,此操作无济于事,结果为call call set s=[%%t:.=%s%%%]。然后,它重复生成的语句N时间。每次,该call命令都会替换变量。此时,s变量只有一组%s,因此将其替换,从而产生(eg)call set s=[%t:.=[2,2]%]。然后,内部调用替换该t变量,从而导致(例如)set s=[[2,2],[2,2]]执行所需的赋值。s然后打印的最终值。


+1哇,我没想到。所有人都赞美不起的.bat文件!
亚当

3

Clojure,49个字节

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

不是最简短的Clojure示例,而是我引述了引号和引文的意思。


3

I,7个字节

我是从我的创造者我的同事那里得到的。

#Bbhph~

#Bb     复印#功能 ound到b inding
   hp  ħ OOK的参数(的右侧)p奥尔函数(重复)
     h~ħ OOK参数向左~(在整个得到的函数的)

在线尝试!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.