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.


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 :)


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 :-)


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))

Netter Missbrauch des ...Betreibers!
nderscore


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!


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)

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;);

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)

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.


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)

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

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

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


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


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)+"]")

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.


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=[]}
}

0

JavaScript 73

function h(){s="1111111111",r=[10],i=-1;while(++i<10){r[i]=s.split("");}}

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 :)


0

Javscript ES6, 53

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

0

JavaScript (ES6), 35 Byte

A=Array(10).fill(Array(10).fill(1))

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