Matrice N ^ N dimensionale riempita con N


62

In:  memoria sufficiente e numero intero positivo N

Out:  matrice N ^ N N-dimensionale riempita con N, dove N ^ N significa N termini di N-by-N-by-N-by ...

Esempi:

1: [1]che è un array 1D (un elenco) di lunghezza 1, contenente un singolo 1

2: [[2,2],[2,2]]che è un array 2D (una tabella) con 2 righe e 2 colonne, riempito con 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]]]che è un array 3D (un cubo) con 3 livelli, 3 file e 3 colonne, riempito con 3 secondi

4: [[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[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 e 6: vedi una delle risposte.


Se la nostra lingua non supporta gli array, quale sarebbe un formato di output accettabile?
Okx,

17
Poiché "Memoria sufficiente" fa parte dell'input, voglio vedere una risposta che controlli un robot per prendere effettivamente la memoria come input e collegarla prima di usarla.
user2357112

1
Tutti gli array devono essere oggetti distinti?
Neil

1
@ user2357112 Penso che sia più un problema di tipo precondizionato. Dubito che l'operazione effettivamente si aspetti che la funzione accetti la memoria come input.
The Great Duck

2
@TheGreatDuck Corretto, ma sono abbastanza sicuro che user2357112 lo intendesse come uno scherzo.
Adám

Risposte:


50

Python , 32 byte

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

Provalo online!

Crea una stringa come "[[[n]*n]*n]*n"con le nmultiplazioni e la valuta come codice Python. Poiché la valutazione avviene nell'ambito della funzione, il nome della variabile nrestituisce l'input della funzione.


3
il trucco dell'ambito è geniale
Griffin,

+1, quel trucco eval davvero gira un sacco di byte
MilkyWay90

31

J, 4 byte

$~#~

Provalo online!

Spiegazione

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

6
Quando ho visto il titolo della sfida, ho pensato subito a J. Abbastanza bello che J batte anche Jelly (il linguaggio del golf ispirato a J).
Dane,

1
C'è anche l' $~$~equivalente che si ripete
miglia

2
$~$~tradotto in inglese ... SOLDI, ottieni di più, SOLDI, ottieni di più ...
Magic Octopus Urn


12

Mathematica, 22 20 byte

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

(* or *)

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

9

R, 26

Questa è la risposta ovvia ma forse c'è qualcosa di più intelligente?

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

è scan()necessario?
Adám,

Guardando le altre risposte, sembra che debba essere una funzione o accettare input in qualche modo?
Flounderer,

1
Bene, non conosco affatto R. Ho solo pensato che potresti invece specificare una funzione in qualche modo.
Adám,

Sì, puoi sostituirlo n=scan();con function(n)ma lo allunga.
Flounderer

5
È possibile salvare un byte mettendo nl'assegnazione all'interno di 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

dimostrazione


8

Haskell , 52 byte

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

Provalo online!

Ispirato dalla risposta di @ nimi , ma utilizzando più funzioni predefinite.

  • Utilizza iteratee !!invece di una funzione di aiuto ricorsiva.
  • Invece di costruire delimitatori di elenchi "a mano", usa filter(>'"').showper formattare un elenco di stringhe, quindi rimuovendo i "caratteri extra .

8

05AB1E (legacy) , 6 5 byte

-1 grazie a Kevin Cruijssen

F¹.D)

Provalo online!

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

Il lead Dpuò essere rimosso perché l'input viene usato di nuovo in modo implicito (non sono sicuro che questo fosse un elemento quando hai pubblicato la risposta, ma non hai più bisogno dell'esplicito Dora).
Kevin Cruijssen,

1
@KevinCruijssen Penso che questa sia una delle risposte che ci ha dato l'idea di prendere implicitamente input più volte :)
Riley,

Ah ok. Mi aspettavo davvero che non fosse ancora implicitamente al momento della pubblicazione, ma mi sono reso conto che dopo aver pubblicato il mio commento (che ho modificato). ;) A volte è divertente quante cose esplicite vengono fatte dalla vecchia risposta (di solito prima del 2017) e quanto più breve può essere fatto ora.
Kevin Cruijssen,


7

Haskell, 62 byte

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

Esempio di utilizzo: f 2-> "[[2,2],[2,2]]". Provalo online! .

Il sistema di tipi rigorosi di Haskell impedisce una funzione che restituisce elenchi nidificati di profondità diverse, quindi costruisco il risultato come una stringa.

Come funziona:

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         

Possiamo fare la stessa idea più breve con più funzioni built-in: f n=iterate(filter(>'#').show.(<$[1..n]))(show n)!!n.
Ørjan Johansen

@ ØrjanJohansen: è un'ottima idea. Si prega di pubblicarlo come risposta separata.
nimi

Potresti radere un byte con (#0)=show? Non
ho molta

@Cyoce: No, questo è un errore di sintassi. Per una sintassi corretta potrei capovolgere gli argomenti e usare (#)0=show, ma tutte le definizioni di una funzione devono avere lo stesso numero di argomenti. La seconda riga ( n#l='['...) necessita di due argomenti, quindi anche la prima riga deve avere due argomenti.
nimi

6

MATL, 8 byte

ttY"l$l*

Provalo su MATL Online (ho aggiunto del codice che mostra la dimensione effettiva dell'output poiché tutte le uscite n-dimensionali in MATL sono mostrate come matrici 2D in cui tutte le dimensioni> 2 sono appiattite nella seconda dimensione).

Spiegazione

        % 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  

Non posso davvero dire da MATL Online se la tua richiesta fa la cosa giusta. sembra che ogni risposta sia una matrice ampia.
Adám,

4
@ Adám Le dimensioni oltre la seconda vengono visualizzate come compresse nella seconda. Quindi l'esempio mostra un array 3x9 invece dell'array 3x3x3 prodotto. Se aggiungi Zyalla fine del codice, indica la dimensione effettiva
Luis Mendo,

6

Python 2 , 36 byte

-2 byte grazie a @CalculatorFeline

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

Provalo online!


~-n== (n-1).
Calcolatrice

Sarebbe possibile includere un collegamento TIO ?
Adám,

1
In effetti questo! (-8 byte grazie all'algoritmo ottimizzato, +9 byte per aggiungere output)
CalculatorFeline

@CalculatorFeline È possibile inserire elementi in Intestazione e Piè di pagina per evitare l'inclusione nel conteggio dei byte.
Adám,

1
L'input e l'output non sono richiesti per l'invio completo del programma?
Calcolatrice

5

CJam , 12 byte

ri:X{aX*}X*p

Provalo online!

Spiegazione

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

Gelatina , 5 byte

⁾Wẋẋv

Provalo online!

Come?

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

Seconda risposta Jelly a 5 byte. Ancora inaccettabilmente lungo rispetto a J :-)
Adám,

2
... e non per mancanza di tentativi: 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;}

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
puoi sostituirlo i<=1con i<2?
cliffroot

Sì @cliffrott. Ha funzionato Grazie!!
anacron

1
È possibile salvare alcuni byte con un lambda:(n,i)->{...}

Java 8

1
Hmm, sembra che questo richieda un input extra. Dovrai creare un metodo separato per un solo parametro affinché questo sia valido.
Jakob,

5

JavaScript (ES6), 38 byte

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

La versione affamata di memoria di questo è di 45 byte:

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

5

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

Provalo online!


Il programma conta essenzialmente da 0 a (n ^ n) -1 nella base n, dove n è l'input. Per ogni numero base-n k nel conteggio, procede come segue:

  1. Se k termina con almeno una cifra 0, stampare un '[' per ogni cifra 0 alla fine di k.
  2. Stampa n.
  3. Se k termina con almeno una cifra n-1, stampare un ']' per ogni cifra n-1 alla fine di k.

(Il valore n = 1 deve contenere parentesi quadre come caso speciale. Questo valore di input genera anche un output a stderr, che può essere ignorato in base alle regole PPCG standard.)

Forse c'è un modo più breve per attuare questa idea.


Esecuzione di esempio:

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

Gelatina , 4 byte

R»µ¡

Provalo online!

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

Stessa cosa ma con una sola monade e senza bisogno del separatore di catene:

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

Provalo online!


-4 byte grazie a @CalculatorFeline


34 byte:

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

Deve essere chiamato come f(4,4)


Perché le tue linee di codice sono invertite rispetto al tuo link TIO?
Adám,

È possibile sostituire c>1con c per salvare 1 byte. (Markdown, smetti di deduplicare gli spazi tra le `s)
CalculatorFeline

@CalculatorFeline Non penso che possa; questo sarebbe c>0in questo caso particolare.
Erik the Outgolfer,

Quindi cambia la fine in <space>n. Problema risolto e bonus: più byte salvati! : D (Quindi gli spazi alla fine del codice inline sono possibili, ma non all'inizio? È strano ...) Collegamento TIO
CalculatorFeline

@Adám: su TIO per consentire l'assegnazione della funzione principale nell'intestazione e qui per mantenere la funzione principale sull'ultima riga.
Calcolatrice


4

Rubino, 27 byte

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

Solo 1 byte in più ma usando un approccio diverso invece del trucco 'eval' dalla meravigliosa risposta di Python di xnor.


3

Perl 6 , 25 byte

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

Inizia con ne applica in modo iterativo i tempi di trasformazione "ripeti n volte" n, creando ogni volta un ulteriore livello di Listannidamento.

Provalo online!


Usa $_invece per salvare un byte
Jo King il

@JoKing: lo uso già $_come parametro del blocco interno, quindi non posso usarlo come parametro del blocco esterno.
smls

Sì, ma $ne $_hanno sempre lo stesso valore. Provalo online!
Jo King,

3

PHP, 70 62 byte

Questo è il più semplice che posso inventare.

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

Prende l'input come primo argomento e stampa l'array risultante sullo schermo.


Grazie a @ user59178 per avermi salvato 8 byte !


La pre-assegnazione di variabili del genere non è necessaria, così come è $l. Il rilascio $i=0,e la sostituzione $lcon $n salva 7 byte. Un byte aggiuntivo può essere salvato non assegnando $F, assegnando $nin condizionale e usando un ternario $F?:$ninarray_fill()
user59178

@utente59178 Non so se questo è quello che avevi in ​​mente o no, ma grazie per i suggerimenti. Mi hai salvato 8 byte!
Ismael Miguel,

3

Clojure, 36 byte

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

Funzione di iterazione che ripete i suoi ntempi di argomento , produce una sequenza infinita di tali elementi e quindi prende il suo nth elemento.

Guardalo online


3

Rebol, 45 byte

func[n][array/initial append/dup copy[]n n n]

3

Lotto, 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 in realtà non ha array, quindi questo stampa solo la rappresentazione di stringa di un array. Spiegazione: Le prime due righe formano un modello ripetuto di N .s separati da N-1 ,s nella variabile t. La quarta riga quindi utilizza questo come modello di sostituzione Nvolte per creare l' Narray -dimensionale. Il doppio callè necessario a causa di come funzionano le dichiarazioni fore set. Innanzitutto, il forcomando sostituisce le variabili. A quanto pare, tutti i miei %segni sono raddoppiati, quindi questo non fa altro che annullare la citazione di tutti, risultando call call set s=[%%t:.=%s%%%]. Quindi ripete i Ntempi di istruzione risultanti . Ogni volta, il callcomando sostituisce le variabili. A questo punto, la svariabile ha un solo set di%s, quindi viene sostituito, risultando (ad esempio) call set s=[%t:.=[2,2]%]. La chiamata interna sostituisce quindi la tvariabile, risultando (ad es.) set s=[[2,2],[2,2]], Eseguendo l'assegnazione desiderata. sViene quindi stampato il valore finale di .


+1 Wow, non me lo sarei aspettato. Tutti salutano l'umile file .bat!
Adám

3

Clojure, 49 byte

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

Non l'esempio più breve di Clojure, ma mi sono divertito con le citazioni e le citazioni.


3

I , 7 byte

L'ho preso dal mio collega, il creatore di I.

#Bbhph~

#Bb     la copia #funzione B ound a B inding
   hp  h ook l'argomento (destra) del p funzione otenza (ripetizione)
     h~h ook l'argomento alla sinistra ~(dell'intero funzione risultante)

Provalo online!


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.