N-мерный массив N ^ N, заполненный N

62

В:  Достаточно памяти и положительное целое число N

Out:  N-мерный массив N ^ N, заполненный N, где N ^ N означает N слагаемых N-by-N-by-N-by ...

Примеры:

1: [1]массив 1D (список) длиной 1, содержащий один 1

2: [[2,2],[2,2]]это двумерный массив (таблица) с 2 строками и 2 столбцами, заполненными 2

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]]]трехмерный массив (куб) с 3 слоями, 3 строками и 3 столбцами, заполненный 3 с

4: [[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[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
1
Все ли массивы должны быть отдельными объектами?
Нил
1
@ user2357112 Я думаю, что это больше проблема типа предварительного условия. Я сомневаюсь, что операционная система ожидает, что функция примет память как ввод.
Великая утка
2
@TheGreatDuck Правильно, но я почти уверен, что user2357112 это шутка.
Адам

Ответы:

50

Python , 32 байта

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

Попробуйте онлайн!

Делает строку как "[[[n]*n]*n]*n"с nумножением и оценивает ее как код Python. Поскольку оценка происходит в пределах области действия функции, имя переменной nоценивается на входе функции.

XNOR
источник
3
трюк в области гениальности
Griffin
+1, этот трюк Eval действительно играет много байтов
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
$~$~переведено на английский ... ДЕНЬГИ, получить больше, ДЕНЬГИ, получить больше ...
Волшебный осьминог Urn
12

Mathematica, 22 20 байт

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

(* or *)

Table@@Table[#,#+1]&
Юнг Хван Мин
источник
9

Р, 26

Это очевидный ответ, но, может быть, есть что-то умнее?

n=scan();array(n,rep(n,n))
Flounderer
источник
это scan()необходимо?
Адам
Глядя на другие ответы, кажется, что это либо должна быть функция, либо как-то принимать ввод?
Камбала
1
Да, я вообще не знаю R Я просто подумал, что вместо этого вы можете указать функцию.
Адам
Да, вы можете заменить n=scan();, function(n)но это делает его дольше.
Камбала
5
Вы можете сохранить один байт, помещая nназначение внутрь array: array(n<-scan(),rep(n,n)).
rturnbull
8

Haskell , 52 байта

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

Попробуйте онлайн!

Вдохновлен ответом @ nimi , но использует больше предопределенных функций.

  • Использует iterateи !!вместо рекурсивной справочной функции.
  • Вместо того, чтобы создавать разделители списка «вручную», используется filter(>'"').showдля форматирования списка строк, а затем для удаления лишних "символов.
Орджан Йохансен
источник
8

05AB1E (наследие) , 6 5 байт

-1 спасибо Кевину Круйссену

F¹.D)

Попробуйте онлайн!

F     # For 0 .. input
 ¹.D) # Push <input> copies of the result of the last step as an array
Райли
источник
Ведущий Dможет быть удален, потому что ввод снова используется неявно (не уверен, что это было так, когда вы опубликовали ответ, но вам больше не нужен явный ответ D).
Кевин Круйссен
1
@KevinCruijssen Я думаю, что это один из ответов, который дал нам идею принимать неявные данные несколько раз :)
Райли
Ах хорошо. Я действительно ожидал, что это не будет неявно еще во время публикации, но понял это после публикации моего комментария (который я отредактировал). ;) Иногда забавно, сколько явных вещей делается старым ответом (обычно до 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){:})

Попробуйте онлайн!

rahnema1
источник
@LuisMendo Rats, я только собирался опубликовать это;)
мензурка
@beaker Whoops :-)
Луис Мендо
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.
Эрджан Йохансен
@ ØrjanJohansen: это отличная идея. Пожалуйста, опубликуйте это как отдельный ответ.
Ними
Не могли бы вы побрить байт (#0)=show? Не слишком знаком с Haskell
Cyoce
@Cyoce: Нет, это синтаксическая ошибка. Для правильного синтаксиса я мог бы перевернуть аргументы и использовать (#)0=show, но все определения функции должны иметь одинаковое количество аргументов. Вторая строка ( n#l='['...) нуждается в двух аргументах, поэтому первая строка также должна иметь два аргумента.
Ними
6

MATL, 8 байт

ttY"l$l*

Попробуйте это в MATL Online (я добавил некоторый код, показывающий фактический размер выходных данных, поскольку все n-мерные выходные данные в MATL показаны в виде 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  
Suever
источник
Я не могу точно сказать от MATL Online, правильно ли твое представление правильно. похоже, что каждый ответ представляет собой широкую матрицу.
Адам
4
@ Adám Размеры за пределами второго отображаются как свернутые во второй. Таким образом, в примере показан массив 3x9 вместо созданного массива 3x3x3. Если вы добавите Zyв конце кода, он говорит фактический размер
Луис Мендо
6

Python 2 , 36 байт

-2 байта благодаря @CalculatorFeline

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

Попробуйте онлайн!

Trelzevir
источник
~-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-байтовый Jelly ответ. Все еще недопустимо долго по сравнению с J :-)
Adám
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;}

Ungolfed:

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

}
Anacron
источник
1
Вы можете заменить i<=1на i<2?
Cliffroot
Да, @ Клиффрот. Это сработало. Спасибо!!
Anacron
1
Вы можете сохранить несколько байтов с помощью лямбды:(n,i)->{...}
Java 8 lambdas ftw
1
Хм, похоже, это требует дополнительного ввода. Вам нужно будет создать отдельный метод только для одного параметра, чтобы это было допустимо.
Якоб
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) -1 в базе n, где n - это ввод. Для каждого числа base-n k в подсчете выполняется следующее:

  1. Если k заканчивается хотя бы одной цифрой 0, выведите '[' для каждой цифры 0 в конце k.
  2. Распечатать номер
  3. Если k заканчивается хотя бы одной цифрой n-1, выведите ']' для каждой цифры n-1 в конце k.

(Для значения 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]].

То же самое, но с одной монадой и без необходимости в разделителе цепей:

4 байта

»€`¡
dylnan
источник
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в этом конкретном случае.
Эрик Outgolfer
Затем измените конец на <space>n. Проблема решена и бонус - больше байтов сохранено! : D (То есть пробелы в конце встроенного кода возможны, но не в начале? Это странно ...) Ссылка на
CalculatorFeline
@ Adám: в TIO, чтобы разрешить назначение главной функции в заголовке, а здесь, чтобы сохранить основную функцию в последней строке.
CalculatorFeline
4

Рубин, 28 26 байт

Спасибо Cyoce за сохранение 2 байта!

->n{eval'['*n+'n'+']*n'*n}

Похищенные бесстыдно из XNOR «s отличного ответа .

adrianmp
источник
1
Тебе нужны эти парены?
Cyoce
4

Рубин, 27 байт

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

Всего на 1 байт больше, но вместо трюка 'eval' из замечательного Python-ответа xnor используется другой подход.

гигабайт
источник
3

Perl 6 , 25 байт

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

Начинается с nи итеративно применяет времена преобразования «repeat n times» n, каждый раз создавая дополнительный уровень Listвложенности.

Попробуйте онлайн!

SMLS
источник
Используйте $_вместо этого, чтобы сохранить байт
Джо Кинг
@JoKing: я уже использую в $_качестве параметра внутреннего блока, поэтому не могу использовать его и в качестве параметра внешнего блока.
Smls
Да, но $nи $_всегда имеют одинаковое значение. Попробуйте онлайн!
Джо Кинг,
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 Не знаю, это ты имеешь в виду или нет, но спасибо за советы. Вы спасли мне 8 байтов!
Исмаэль Мигель
3

Clojure, 36 байт

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

Итерирует функцию, которая повторяет время своего аргумента n, создает бесконечную последовательность таких элементов, а затем принимает ее nth-й элемент.

Посмотри это онлайн

cliffroot
источник
3

Ребол, 45 байт

func[n][array/initial append/dup copy[]n n n]
draegtun
источник
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%

Batch на самом деле не имеет массивов, поэтому он просто печатает строковое представление массива. Объяснение: Первые две строки создают повторяющийся шаблон N .s, разделенных N-1 ,s в переменной t. Затем четвертая строка использует это в качестве Nвремен подстановки для создания Nмассива -mensional. Двойник callнеобходим из-за того, как работают операторы forand set. Сначала forкоманда подставляет переменные. Как это происходит, все мои %знаки удваиваются, так что это ничего не делает, кроме как заключить их в кавычки, что приводит к call call set s=[%%t:.=%s%%%]. Затем он повторяет итоговые значения операторов N. Каждый раз callкоманда подставляет переменные. На данный момент, sпеременная имеет только один набор%s, поэтому он подставляется, что приводит к (например) 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, но я забавляюсь цитатами и цитатами.

MattPutnam
источник
3

Я , 7 байт

Я получил это от моего коллеги, создателя I.

#Bbhph~

#Bb     копия #функция B ound в б inding
   hp  ч ООК аргумент к (справа) р функции Ауэр (повтор)
     h~ч ООК аргумент влево ~(всей полученной функции)

Попробуйте онлайн!

Адам
источник