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


62

В:  Досить пам'яті та натурального числа N

Вихід:  N-мірний масив N ^ N, заповнений N, де N ^ N означає N термінів N-від-N-від-N-by ...

Приклади:

1: [1]який являє собою 1D масив (список) довжиною 1, що містить одинарний 1

2: [[2,2],[2,2]]це 2D масив (таблиця) з 2 рядками та 2 стовпцями, заповнений 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: Будь ласка, дивіться одну з відповідей.


Якщо наша мова не підтримує масиви, який би був прийнятний вихідний формат?
Окск,

17
Оскільки "Досить пам'яті" є частиною введення, я хочу побачити відповідь, яка керує роботом, щоб насправді взяти пам'ять як вхід і підключити її до її використання.
користувач2357112

1
Чи всі масиви повинні бути різними об'єктами?
Ніл

1
@ user2357112 Я думаю, що це скоріше проблема типу передумови. Я сумніваюся, що оп дійсно очікує, що функція прийме пам'ять як вхідний.
Велика качка

2
@TheGreatDuck Правильно, але я впевнений, що user2357112 мав на увазі це як жарт.
Адам

Відповіді:


50

Пітон , 32 байти

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

Спробуйте в Інтернеті!

Створює рядок, подібний "[[[n]*n]*n]*n"до nмультиплікацій, і оцінює його як код 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. Досить круто, що Дж навіть б'є Jelly (мова для гольфу, натхненна J).
Дейн

1
Є також, $~$~що рівнозначно, а також повторюється
миль

2
$~$~перекладено на англійську мову ... ГРОШІ, отримайте більше грошей, отримайте більше ...
Magic Octopus Urn



9

R, 26

Це очевидна відповідь, але, можливо, є щось розумніше?

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

це scan()необхідно?
Adám

Дивлячись на інші відповіді, здається, це або має бути функцією, або якось приймати вклад?
Flounderer

1
Правильно, я взагалі не знаю R. Я просто думав, що ви можете якось вказати функцію замість цього.
Adám

Так, ви можете замінити n=scan();, function(n)але це довше.
Flounderer

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 Щури, я саме збирався опублікувати цю;)
стаканчик

@beaker Whoops :-)
Луїс Мендо

7

Хаскелл, 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.
Ørjan Johansen

@ ØrjanJohansen: це чудова ідея. Будь ласка, опублікуйте це як окрему відповідь.
німі

Не могли б ви поголити байт (#0)=show? Не надто знайомий з Haskell
Cyoce

@Cyoce: Ні, це синтаксична помилка. Для правильного синтаксису я міг би перевернути аргументи і використовувати (#)0=show, але всі визначення функції повинні мати однакову кількість аргументів. Другий рядок ( n#l='['...) потребує двох аргументів, тому перший рядок також повинен мати два аргументи.
німі

6

MATL, 8 байт

ttY"l$l*

Спробуйте це на MATL Online (я додав код, який показує фактичний розмір виводу, оскільки всі n-мірні виходи в MATL показані у вигляді двовимірних матриць, де всі розміри> 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, чи правильно це робиться у ваших публікаціях. схоже, що кожна відповідь - це широка матриця.
Adám

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 ?
Adám

1
Насправді це! (-8 байт за рахунок оптимізованого алгоритму, +9 байт для додавання виводу)
CalculatorFeline

@CalculatorFeline Ви можете помістити речі в Header and Footer, щоб уникнути включення в кількість байтів.
Adám

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-байтова відповідь желе. Досі неприйнятно довгий порівняно з 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;}

Безголівки:

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 Це спрацювало. Дякую!!
анакрон

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 - вхід. Для кожного базового 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]]]



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

Рубін, 27 байт

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

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


3

Perl 6 , 25 байт

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

Починається з nітераційно застосовує час трансформації "повторити n разів" n, щоразу створюючи додатковий рівень Listвкладення.

Спробуйте в Інтернеті!


Використовуйте $_натомість, щоб зберегти байт
Jo King

@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, вона створює нескінченну послідовність таких елементів, а потім приймає свій nелемент.

Дивіться це в Інтернеті



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-вимірного масиву. Подвійний callнеобхідний через те, як працюють forі 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

I , 7 байт

Я отримав це від свого колеги, творця я.

#Bbhph~

#Bb    #функція  копіювання B ound to b inding
   hp  h ook аргумент на (праворуч) функцію p ower (повторити)
     h~h ook аргумент зліва ~(від усієї результуючої функції)

Спробуйте в Інтернеті!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.