Javascript: Erstellen Sie ein 10x10-Array von 1s

18

Offensichtlich wäre diese Herausforderung mit separaten Funktionen und Bibliotheken trivial, so dass sie nicht zulässig sind.

Ihr Code muss einer ECMAscript-Spezifikation entsprechen (jede Spezifikation reicht aus), sodass keine browserspezifischen Antworten möglich sind.

Auf das Array muss zugegriffen werden, nachdem es instanziiert wurde.

Ich habe eine Antwort, die ich vorerst zurückhalten werde.

Hinweis: Diese Herausforderung ist spezifisch für JavaScript, da die Erstellung mehrdimensionaler Arrays in JavaScript bekanntermaßen unpraktisch ist.

Shmiddty
quelle
Ich bin bei 57 Zeichen. Ist das eine gute Punktzahl?
John Dvorak
Ok, definitiv nicht :-)
John Dvorak
15
Sind Sie sicher, dass Sie nicht nur dieses schöne 1x1-Array von 10ern wollen? [10]
Kojiro
8
Wäre das [[10]]?
Yingted

Antworten:

10

Javascript ES6, 30

(x=i=>Array(10).fill(i))(x(1))

ES6 in Aktion :)

Afonso Matos
quelle
2
Hallo, diese Frage ist wie 2 Jahre alt. Es ist wahrscheinlich eine bessere Verwendung Ihrer JS-Code Golf-Fähigkeiten, um neuere Fragen zu beantworten;)
George
6
@ George Ich glaube nicht, dass etwas falsch ist, wenn man auf alte Herausforderungen antwortet. (Einige Herausforderungsautoren aktualisieren auch die akzeptierte Antwort, wenn ein neuer Gewinner hinzukommt, egal wie alt die Herausforderung ist.)
Martin Ender,
2
@ MartinBüttner Diese Antwort kann nicht akzeptiert werden, da ES6 jünger ist (es kam im Jahr 2015 :)) als diese Herausforderung, und Array.fill () ist nur ES6 :)
Katenkyo
Ich habe nur geantwortet, weil ich auch andere ES6-Antworten gesehen habe. Ich glaube nicht, dass daran etwas falsch ist. Der Autor aktualisiert möglicherweise seine Frage und andere nutzen möglicherweise mehrere Möglichkeiten zur Lösung des oben genannten Problems.
Afonso Matos
ES6 wurde akzeptiert, lange bevor sein Entwurf tatsächlich eingefroren wurde (das ist im Jahr 2015, ein paar Tage zurück). Ich bin mir jedoch nicht sicher, ob das richtig oder falsch ist.
Optimierer
27

Javascript, 34 Bytes

for(r=[b=[i=10]];i--;r[i]=b)b[i]=1

Da es anscheinend in Ordnung ist, die Zeilen nach Verweis gleich zu machen, ist es anscheinend in Ordnung, sich auf diese Tatsache zu verlassen. Dies hilft uns, eine for-Schleife abzuschalten, indem die Tabelle gleichzeitig mit den Zeilen erstellt wird. Also, hier ist mein neuer Kandidat.

Da r[0]und b[0]während der Schleife überschrieben werden, können sie Müll enthalten. Dies gibt uns einen weiteren freien Ausführungsplatz, um einige Kommas zu entfernen. Das geht leider r=b=[]nicht, da sie dann gleich by-ref sind.

Außerdem skaliert es gut (99x99 ist immer noch 34 Bytes), benötigt kein ES5 (die neuen Funktionen haben jedenfalls furchtbar lange Namen) und ist als Bonus unlesbar :-)

John Dvorak
quelle
3
Schön. Wunderschön.
Briguy37
1
Verdammt, ich endete mit: c=[b=[i=10]];while(i--)b[i]=c,c[i]=1. Hätte wissen sollen!!!
Mowwwalker
19

ECMAScript 6 - 33 Zeichen

x=(y=[..."1111111111"]).map(x=>y)

Gibt ein 10x10-Array mit "1" aus.

Dies missbraucht die Tatsache, dass die Zeichenfolge "1111111111" über alle erforderlichen Eigenschaften verfügt, die behandelt werden müssen, als wäre sie ein Array, sodass Sie den Spread-Operator verwenden können ... um es in ein Array von Zeichen umzuwandeln und es dann einer Kopie des Arrays mit zuzuordnen jedes Element verweist auf das "Original".

Oder mit nur einem Variablennamen (für 35 Zeichen):

x=(x=x=>[..."1111111111"])().map(x)

Oder für zusätzliche Verwirrung (aber bei 45 Zeichen)

x=[];x[9]=x;x=[...x].map(y=>[...x].map(x=>1))

oder (43 Zeichen)

y=y=>[...x].map(x=>y);x=[];x[9]=x;x=y(y(1))
MT0
quelle
Netter Missbrauch des ...Betreibers!
nderscore
13

44 Bytes

for(a=[i=10];i;)a[--i]=[1,1,1,1,1,1,1,1,1,1]

Vorherige Version:

for(a=i=[];i^10;)a[i++]=[1,1,1,1,1,1,1,1,1,1]
Kopieren
quelle
Sehr cleveres Update!
Shmiddty
für (a = [i = 9]; i;) a [i -] = [1,1,1,1,1,1,1,1,1]
AmericanUmlaut
1
@ AmericanUmlaut, das nicht funktioniert
kopieren Sie
1
Ich mag ^für!=
John Dvorak
13

45 Zeichen

x=[a=[1,1,1,1,1,1,1,1,1,1],a,a,a,a,a,a,a,a,a]

Jedes Element zeigt auf dasselbe Array, aber die Spezifikation erwähnt nichts dagegen!

Casey Chu
quelle
4
Die Spezifikation besagt, dass auf das Array zugegriffen werden muss, nachdem es instanziiert wurde. . Ich denke, das bedeutet, dass du x=am Anfang eine zusätzliche haben
solltest
Trotzdem eine sehr schöne Lösung (+1)
Cristian Lupascu
Dies ist jedoch nicht sehr praktisch, da eine Änderung eines Werts für alle Arrays gilt.
Gabriele Petrioli
7

Javascript, 51

a=[];for(i=10;i;i--,a.push([1,1,1,1,1,1,1,1,1,1]));

Oder wenn alle Indizes auf dasselbe Array zeigen dürfen:

Javascript, 41

a=[1,1,1,1,1,1,1,1,1,1];a=a.map(a.sort,a)
grc
quelle
Alle Indizes verweisen jetzt auf dieselbe Spalte, was wahrscheinlich unerwünscht ist. (Versuch a[0][1] = 5; console.log(a[1][1])).
kopieren
Ja, das habe ich nicht gesehen. Ich habe meine Antwort aktualisiert.
Grc
6

JavaScript, 45 44 Bytes

Das Beste, was ich bisher habe. (Versuche immer noch).

x=[];while(x.push([1,1,1,1,1,1,1,1,1,1])-10);

Kürzer (danke mellamokb!)

for(x=[];x.push([1,1,1,1,1,1,1,1,1,1])-10;);
Räuber
quelle
Beachten Sie, dass dies forfast immer dem whileGolfen vorzuziehen ist . Die Grundaussage ist gleich lang ( while()vs for(;;)), forgibt Ihnen aber mehr Flexibilität. In diesem Fall können Sie x=[]den Initialisierer von eingeben forund ein Zeichen speichern.
Mellamokb
@ Mellamokb, danke für den Tipp :-)
Brigand
5

Javascript, 47

Da meine ursprüngliche Lösung geschlagen wurde, werde ich sie jetzt posten.

for(a=[],i=10;i--;a[i]='1111111111'.split(''));

Leider 0x3FF.toString(2)ist es nicht ganz so effizient wie das Auflisten des Strings, was nicht ganz so effizient ist wie das statische Deklarieren des Arrays.

Sie können einen Charakter folgendermaßen abschneiden ( 46 ):

for(a=[],i=10;i--;a[i]=[1,1,1,1,1,1,1,1,1,1]);

Sie können 2 weitere Zeichen wie folgt speichern: ( 44 )

for(a=[i=10];i--;)a[i]=[1,1,1,1,1,1,1,1,1,1]

Eine weitere 44-Byte-Lösung mit JS 1.8-Funktionsausdruck-Closures (nur FF atm):

x=(x=[1,1,1,1,1,1,1,1,1,1]).map(function()x)
Shmiddty
quelle
1
Sie können durch Initialisierung eines char speichern iin awie folgt aus :a=[i=10]
codeporn
4

JavaScript, 57 Bytes

r=eval("["+(A=Array(11)).join("["+A.join("1,")+"],")+"]")

Vor dem Golfen:

a=Array(11).join("1,");
b=Array(11).join("["+a+"],")
c=eval("["+b+"]")

Hinweis: Dies erfordert ES5, erwarten Sie also nicht viel vom IE.

John Dvorak
quelle
Wow! Ich schrieb eval('a=['+(b=Array(11)).join('['+b.join("1,")+'],')+']'). Abgesehen davon, dass ich unterschiedliche Anführungszeichen und die Variable inside eval habe, sind diese genau gleich
mowwwalker
2
a=eval("["+Array(11).join("[1,1,1,1,1,1,1,1,1,1],")+"]")hat 56 Jahre
alt
3

54

Dies wurde bereits geschlagen, aber hier ist meine Lösung:

function x(){return[1,1,1,1,1,1,1,1,1,1]}x=x().map(x)
Kojiro
quelle
Pfeilfunktionen werden interessante Dinge für das JavaScript-Golfen tun. Wenn ich nur herausfinden könnte, wie man Curry-Buildins trivial macht.
Kojiro
Sie müssten x=vor x().map(oder y=usw.) einfügen , um es zugänglich zu machen, richtig?
Shmiddty
@Schmiddty Ja, also aktualisiert.
Kojiro
3

39 Bytes

Verwenden des Array-Verständnisses in ECMAScript 7:

x=[x for(y in x=[1,1,1,1,1,1,1,1,1,1])]
nderscore
quelle
In ES6 gibt es kein Array-Verständnis, das ist ein ES7-Vorschlag.
Afonso Matos
@afonsomatos Als ich diese Antwort gab, war sie immer noch Teil des ES6-Entwurfs. Es ist jetzt aber aktualisiert :)
nderscore
Ersetzen [1,1,1,1,1,1,1,1,1,1]mit Array(10).fill(1)rasiert 4 Zeichen.
Shmiddty
2

56 Zeichen

Ziemlich lange Antwort, aber besser für 100x100 usw.

for(a=[[i=k=0]];++i<100;m?0:a[k=i/10]=[1])a[k][m=i%10]=1
XzKto
quelle
2

Javascript, 36 Zeichen (ECMA 6)

(a=[b=[]]).fill(b.fill(a[9]=b[9]=1))

Getestet in meinem Browser (Firefox unter Ubuntu) und im Codecademy Javascript Interpreter

QuadmasterXLII
quelle
2

ES6, 54

Es ist nicht die kürzeste, aber ich dachte, ich würde anders vorgehen als hier.

a=(''+{}).split('').slice(0,10).map(_=>a.map(_=>1))

Cast ein Objekt in einen String "[object Object]"
Split die Zeichenfolge in Zeichen [ „[“, „o“, „b“, ... „]“]
Schnappen Sie sich ein Stück von nur 10
Karte des Ergebnis der Abbildung 1 auf den Anfangs - Slice

Dan Prince
quelle
Wo kann ich es testen? Es funktioniert nicht richtig in meinem FF.
Qwertiy
Ich hatte jedoch einige Parens verpasst, da adiese Version bereits existierte und funktioniert zu haben schien. Die aktualisierte Version sollte in FF und Node mit den --harmony-Flags funktionieren.
Dan Prince
Jetzt wird das richtige Array zurückgegeben, aber keiner Variablen zugewiesen.
Qwertiy
1

61 zum Spaß

eval("r=["+("["+(Array(11).join("1,"))+"],").repeat(11)+"]")
Maxime E
quelle
0

Javascript - 64 63 59 Zeichen

for(var a=b=[],i=100;i-->0;b[i%10]=1)if(i%10==0){a[i/10]=b;b=[]}

for(var a=b=[i=100];i-->0;b[i%10]=1)if(i%10==0){a[i/10]=b;b=[]}

Ein Zeichen wurde gespeichert, indem der Iterator im Array ausgeblendet wurde.

for(a=b=[1],i=100;i--;b[i%10]=1)if(i%10==0){a[i/10]=b;b=[]}

Einige Zeichen mit Jans Vorschlägen gespeichert.

Lesbare Version:

for(var a = b = [i = 100]; i-- > 0; b[i % 10] = 1) {
  if(i % 10 == 0) {
    a[i / 10] = b;
    b = [];
  }
}

Ja, es ist nicht die kürzeste Lösung, sondern ein anderer Ansatz ohne Verwendung von vorgefertigten [1,1,1,1,1,1,1,1,1,1]Arrays.

codeporn
quelle
1
Wechseln Sie i-->0zu i--. Der "Downto" -Operator ist zwar nett, aber nicht wirklich notwendig. ==0könnte auch durch zwei Bits rasiert werden. Auch auslassen var. Während normalerweise nützlich, sind vier nutzlose Bytes hier einfach nicht akzeptabel.
John Dvorak
0

Javascript 69 Zeichen (für jetzt)

b=[]
a=[]
for(i=100;i-->0;){
a.push(1)
if(i%10===0){b.push(a);a=[]}
}
Bobby Marinoff
quelle
0

JavaScript 73

function h(){s="1111111111",r=[10],i=-1;while(++i<10){r[i]=s.split("");}}
Bacchusbeale
quelle
1
r=[10],tut nix da du sofort überschreibst r[0]. Sie müssen nicht deklarieren sund können dies einfach tun, "1111111111".split("")aber das sind 22 Zeichen, wohingegen [1,1,1,1,1,1,1,1,1,1]es nur 21 Zeichen sind.
MT0
0

Javascript ES6, 53

x="1".repeat(100).match(/.{10}/g).map(s=>s.split(""))

Aber die im Array sind Strings :)

Qwertiy
quelle
0

Javscript ES6, 53

x=eval("["+("["+"1,".repeat(10)+"],").repeat(10)+"]")
Qwertiy
quelle
0

JavaScript (ES6), 35 Byte

A=Array(10).fill(Array(10).fill(1))
user84702
quelle
1
Das Festlegen einer Variablen ist keine genehmigte Ausgabemethode. Sie können jedoch f=>Array(10).fill(Array(10).fill(1))eine anonyme Funktion für 36 Byte definieren.
26.