N-dimensionales N ^ N-Array, gefüllt mit N


62

In:  Genug Speicher und eine positive ganze Zahl N

Out:  N-dimensionales N ^ N-Array, gefüllt mit N, wobei N ^ N N-mal-N-mal-N-mal-N bedeutet ...

Beispiele:

1: [1]Dies ist ein 1D-Array (eine Liste) der Länge 1, das eine einzelne 1 enthält

2: [[2,2],[2,2]]Dies ist ein 2D-Array (eine Tabelle) mit 2 Zeilen und 2 Spalten, gefüllt mit 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]]]Dies ist ein 3D-Array (ein Würfel) mit 3 Ebenen, 3 Zeilen und 3 Spalten, gefüllt mit 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 und 6: Bitte sehen Sie eine der Antworten.


Was wäre ein akzeptables Ausgabeformat, wenn unsere Sprache keine Arrays unterstützt?
Okx

17
Da "Genügend Speicher" Teil der Eingabe ist, möchte ich eine Antwort sehen, die einen Roboter so steuert, dass er den Speicher tatsächlich als Eingabe verwendet und einsteckt, bevor er verwendet wird.
user2357112

1
Müssen alle Arrays unterschiedliche Objekte sein?
Neil

1
@ user2357112 Ich denke, das ist eher ein Vorbedingungsproblem. Ich bezweifle, dass der op tatsächlich erwartet, dass die Funktion Speicher als Eingabe akzeptiert.
The Great Duck

2
@TheGreatDuck Richtig, aber ich bin mir ziemlich sicher, dass user2357112 es als Witz gemeint hat.
Adám

Antworten:


50

Python , 32 Bytes

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

Probieren Sie es online!

Erstellt einen String wie "[[[n]*n]*n]*n"bei nMultiplikationen und wertet ihn als Python-Code aus. Da die Auswertung innerhalb des Funktionsumfangs erfolgt, wird der Variablenname nzur Funktionseingabe ausgewertet.


3
Der Scope-Trick ist genial
Griffin

+1, dieser Eval-Trick spart wirklich eine Menge Bytes
MilkyWay90

31

J, 4 Bytes

$~#~

Probieren Sie es online!

Erläuterung

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

6
Als ich den Challenge-Titel sah, dachte ich sofort an J. Ziemlich cool, dass J sogar Jelly (die von J inspirierte Golfsprache) schlägt.
Däne

1
Es gibt auch, $~$~was gleichwertig ist, während es sich wiederholt
Meilen

2
$~$~übersetzt ins Englische ... GELD, bekomme mehr von, GELD, bekomme mehr von ...
Magic Octopus Urn


12

Mathematica, 22-20 Bytes

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

(* or *)

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

9

R 26

Dies ist die offensichtliche Antwort, aber vielleicht gibt es etwas Klügeres?

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

ist scan()notwendig?
Adám

Wenn man sich die anderen Antworten ansieht, scheint es, als müsste es entweder eine Funktion sein oder eine Eingabe akzeptieren?
Flunder

1
Richtig, ich kenne R überhaupt nicht. Ich dachte nur, dass man stattdessen irgendwie eine Funktion spezifizieren könnte.
Adám

Ja, können Sie ersetzen n=scan();durch , function(n)aber es macht es mehr.
Flunder

5
Sie können , indem Sie den ein Byte speichern ninnerhalb der Zuordnung array: array(n<-scan(),rep(n,n)).
Rturnbull

8

JavaScript (ES6),  44 bis  40 Byte

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

Demo


8

Haskell , 52 Bytes

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

Probieren Sie es online!

Inspiriert von der Antwort von @ nimi , aber mit mehr vordefinierten Funktionen.

  • Verwendet iterateund !!anstelle einer rekursiven Hilfefunktion.
  • Anstatt Listentrennzeichen "von Hand" filter(>'"').showzu erstellen, wird eine Liste mit Zeichenfolgen formatiert und die zusätzlichen "Zeichen entfernt.

8

05AB1E (Legacy) , 6 5 Bytes

-1 dank Kevin Cruijssen

F¹.D)

Probieren Sie es online!

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

Das Anführungszeichen Dkann entfernt werden, da die Eingabe implizit wieder verwendet wird (nicht sicher, ob dies beim Veröffentlichen der Antwort der Fall war, aber Sie benötigen das explizite DAnführungszeichen jetzt nicht mehr).
Kevin Cruijssen

1
@ KevinCruijssen Ich denke, dies ist eine der Antworten, die uns auf die Idee gebracht haben, implizit mehrere Eingaben zu machen :)
Riley

Ach ok Ich hatte zwar damit gerechnet, dass es zum Zeitpunkt des Postings noch nicht implizit sein würde, aber mir wurde klar, dass ich meinen Kommentar (den ich bearbeitet hatte) gepostet hatte. ;) Manchmal ist es komisch, wie viel explizite Dinge von alten Antworten (normalerweise vor 2017) erledigt werden und wie viel kürzer es jetzt erledigt werden kann.
Kevin Cruijssen


7

Haskell, 62 Bytes

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

Anwendungsbeispiel: f 2-> "[[2,2],[2,2]]". Probieren Sie es online! .

Das strenge Typensystem von Haskell verhindert, dass eine Funktion verschachtelte Listen mit unterschiedlichen Tiefen zurückgibt. Daher konstruiere ich das Ergebnis als String.

Wie es funktioniert:

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         

Wir können mit mehr eingebauten Funktionen die gleiche Idee kürzer tun: f n=iterate(filter(>'#').show.(<$[1..n]))(show n)!!n.
Ørjan Johansen

@ ØrjanJohansen: das ist eine tolle idee. Bitte posten Sie es als separate Antwort.
Nimi

Könnten Sie sich ein Byte mit rasieren (#0)=show? Nicht allzu vertraut mit Haskell
Cyoce

@Cyoce: Nein, das ist ein Syntaxfehler. Für eine korrekte Syntax könnte ich die Argumente umdrehen und verwenden (#)0=show, aber alle Definitionen einer Funktion müssen die gleiche Anzahl von Argumenten haben. Die zweite Zeile ( n#l='['...) benötigt zwei Argumente, daher muss die erste Zeile auch zwei Argumente enthalten.
Nimi

6

MATL, 8 Bytes

ttY"l$l*

Probieren Sie es bei MATL Online aus (ich habe einen Code hinzugefügt, der die tatsächliche Größe der Ausgabe anzeigt, da alle n-dimensionalen Ausgaben in MATL als 2D-Matrizen angezeigt werden, bei denen alle Dimensionen> 2 in die zweite Dimension abgeflacht sind).

Erläuterung

        % 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  

Ich kann MATL Online nicht wirklich sagen, ob Ihr Beitrag das Richtige tut. Es sieht so aus, als ob jede Antwort eine breite Matrix ist.
Adám

4
@ Adám Dimensionen jenseits der Sekunde werden in der Sekunde komprimiert angezeigt. Das Beispiel zeigt also ein 3x9-Array anstelle des erzeugten 3x3x3-Arrays. Wenn Sie Zyam Ende des Codes hinzufügen , wird die tatsächliche Größe angegeben
Luis Mendo

6

Python 2 , 36 Bytes

-2 Bytes dank @CalculatorFeline

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

Probieren Sie es online!


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

Wäre es möglich, einen TIO-Link aufzunehmen ?
Adám

1
In der Tat das! (-8 Bytes aufgrund des optimierten Algorithmus, +9 Bytes zum Hinzufügen der Ausgabe)
CalculatorFeline

@CalculatorFeline Sie können Dinge in Kopf- und Fußzeile einfügen, um die Einbeziehung in die Byteanzahl zu vermeiden.
Adám

1
Werden bei vollständigen Programmeinreichungen keine Ein- und Ausgaben benötigt?
CalculatorFeline

5

CJam , 12 Bytes

ri:X{aX*}X*p

Probieren Sie es online!

Erläuterung

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

Gelee , 5 Bytes

⁾Wẋẋv

Probieren Sie es online!

Wie?

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

Zweite 5-Byte-Gelee-Antwort. Immer noch unannehmbar lang im Vergleich zu J :-)
Adám

2
... und nicht aus Versuchsgründen: D
Jonathan Allan

5

Java 97 96 95 Bytes

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
Sie ersetzen i<=1mit i<2?
Cliffroot

Ja, @cliffrott. Das hat funktioniert. Vielen Dank!!
Anacron

1
Sie könnten ein paar Bytes mit einem Lambda (n,i)->{...}

Java 8 lambdas ftw

1
Hmm, sieht so aus, als würde das zusätzliche Eingaben erfordern. Sie müssen eine separate Methode für nur einen Parameter erstellen, damit dieser gültig ist.
Jakob

5

JavaScript (ES6), 38 Byte

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

Die speicherhungrige Version davon ist 45 Bytes:

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

5

Bash + GNU-Dienstprogramme, 117 Bytes

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

Probieren Sie es online!


Das Programm zählt im Wesentlichen von 0 bis (n ^ n) -1 in der Basis n, wobei n die Eingabe ist. Für jede Basis-n-Zahl k in der Zählung wird Folgendes ausgeführt:

  1. Wenn k mit mindestens einer Ziffer 0 endet, geben Sie am Ende von k für jede Ziffer 0 ein '[' aus.
  2. Drucke n.
  3. Wenn k mit mindestens einer Ziffer n-1 endet, geben Sie am Ende von k für jede Ziffer n-1 ein ']' aus.

(Für den Wert n = 1 müssen als Sonderfall Klammern hinzugefügt werden. Dieser Eingabewert generiert auch eine Ausgabe an stderr, die unter Standard-PPCG-Regeln ignoriert werden kann.)

Vielleicht gibt es einen kürzeren Weg, um diese Idee umzusetzen.


Probelauf:

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

Gelee , 4 Bytes

R»µ¡

Probieren Sie es 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]].

Das Gleiche, aber mit einer einzigen Monade und ohne Kettenseparator:

4 Bytes

»€`¡


4

Python 3 , 57 53 50 38 Bytes

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

Probieren Sie es online!


-4 Bytes dank @CalculatorFeline


34 Bytes:

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

Muss aufgerufen werden als f(4,4)


Warum sind Ihre Codezeilen im Vergleich zu Ihrem TIO-Link umgekehrt?
Adám

Sie können ersetzen c>1mit c 1 Byte zu speichern. (Markdown, hör auf, Leerzeichen in `s
CalculatorFeline

@CalculatorFeline Ich glaube nicht, dass er das kann. das wäre c>0in diesem speziellen Fall.
Erik der Outgolfer

Dann ändere das Ende auf <space>n. Problem gelöst und Bonus - mehr Bytes gespart! : D (Leerzeichen am Ende des Inline-Codes sind möglich, aber nicht am Anfang? Das ist seltsam ...) TIO link
CalculatorFeline

@Adám: Auf TIO, um die Zuweisung der Hauptfunktion in der Kopfzeile zu ermöglichen und hier, um die Hauptfunktion in der letzten Zeile zu belassen.
CalculatorFeline


4

Ruby, 27 Bytes

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

Nur noch 1 Byte, aber mit einem anderen Ansatz als dem 'Eval'-Trick von xnors wundervoller Python-Antwort.


3

Perl 6 , 25 Bytes

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

Beginnt mit nden Transformationszeiten "n-mal wiederholen" und wendet diese iterativ an n, wobei jedes Mal eine zusätzliche ListVerschachtelungsebene erstellt wird.

Probieren Sie es online!


Verwenden Sie $_stattdessen, um ein Byte zu speichern
Jo King

@JoKing: Ich verwende es bereits $_als Parameter des inneren Blocks, daher kann ich es auch nicht als Parameter des äußeren Blocks verwenden.
smls

Ja, aber $nund $_haben immer den gleichen Wert. Probieren Sie es online!
Jo King

3

PHP, 70 62 Bytes

Dies ist das einfachste, was ich mir vorstellen kann.

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

Nimmt die Eingabe als erstes Argument und druckt das resultierende Array auf dem Bildschirm.


Vielen Dank an @ user59178 für das Speichern von 8 Bytes !


Eine solche Vorbelegung von Variablen ist nicht erforderlich $l. Das Dropping $i=0,& Ersetzen $lmit $n spart 7 Byte. Ein zusätzliches Byte kann nicht die Zuordnung gespeichert werden $F, die Zuordnung $nin der bedingten und unter Verwendung eines ternären $F?:$nin derarray_fill()
user59178

@ user59178 Ich weiß nicht, ob das das ist, was du im Sinn hattest oder nicht, aber danke für die Tipps. Du hast mir 8 Bytes gerettet!
Ismael Miguel

3

Clojure, 36 Bytes

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

Iteriert eine Funktion, die ihre Argumentationszeiten wiederholt n, erzeugt sie eine unendliche Folge solcher Elemente und nimmt dann ihr nth-Element.

Sehen Sie es online


3

Rebol, 45 Bytes

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

3

Batch, 141 Bytes

@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 enthält eigentlich keine Arrays, daher wird nur die Zeichenfolgendarstellung eines Arrays gedruckt. Erläuterung: Die ersten beiden Zeilen bilden ein sich wiederholendes Muster von N .s, das N-1 ,in der Variablen durch s getrennt ist t. In der vierten Zeile wird dies dann als Substitutionsmuster Nverwendet, um das Neindimensionale Array zu erstellen . Das Doppelte callist notwendig, weil die Anweisungen forund setfunktionieren. Erstens ersetzt der forBefehl Variablen. Zufälligerweise werden alle meine %Zeichen verdoppelt, was nichts anderes bewirkt, als sie alle zu entfernen, was zur Folge hat call call set s=[%%t:.=%s%%%]. Anschließend werden die resultierenden Anweisungszeiten wiederholt N. Der callBefehl ersetzt jedes Mal Variablen. Zu diesem Zeitpunkt hat die sVariable nur eine einzige Menge von%s, also wird es ersetzt, was zu (zB) führt call set s=[%t:.=[2,2]%]. Der innere Aufruf ersetzt dann die tVariable, was dazu führt, dass (z. B.) set s=[[2,2],[2,2]]die gewünschte Zuweisung ausgeführt wird. Der Endwert von swird dann gedruckt.


+1 Wow, das hätte ich nicht erwartet. Alle begrüßen die bescheidene .bat-Datei!
Adám

3

Clojure, 49 Bytes

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

Nicht das kürzeste Clojure-Beispiel, aber ich habe mich mit dem Zitieren und Nichtzitieren amüsiert.


3

ich , 7 Bytes

Das habe ich von meinem Kollegen bekommen, dem Schöpfer von I.

#Bbhph~

#Bb     die #Kopierfunktion B ound b inding
   hp  h so schnell und das Argument (rechts von) der p ower Funktion (repeat)
     h~h so schnell und das Argument nach links ~(der gesamte sich ergebende Funktion)

Probieren Sie es online!


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.