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оценивается на входе функции.


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



9

Р, 26

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

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

это 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){:})

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


@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  

Я не могу точно сказать от MATL Online, правильно ли твое представление правильно. похоже, что каждый ответ представляет собой широкую матрицу.
Адам

4
@ Adám Размеры за пределами второго отображаются как свернутые во второй. Таким образом, в примере показан массив 3x9 вместо созданного массива 3x3x3. Если вы добавите Zyв конце кода, он говорит фактический размер
Луис Мендо

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

Желе , 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)));
    }

}

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 байта

»€`¡


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

Рубин, 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вложенности.

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


Используйте $_вместо этого, чтобы сохранить байт
Джо Кинг

@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-й элемент.

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



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, но я забавляюсь цитатами и цитатами.


3

Я , 7 байт

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

#Bbhph~

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.