Javascript: créez un tableau 10x10 de 1

18

Évidemment, ce défi serait trivial avec des fonctions et des bibliothèques distinctes, donc elles ne sont pas autorisées.

Votre code doit être conforme à une spécification ECMAscript (n'importe quelle spécification fera l'affaire), donc aucune réponse spécifique au navigateur.

Le tableau doit être accessible après son instanciation.

J'ai une réponse que je vais retenir pour l'instant.

Remarque: ce défi est spécifique au javascript car il est notoirement peu pratique de créer des tableaux multidimensionnels en javascript.

Shmiddty
la source
Je suis à 57 caractères. Est-ce un bon score?
John Dvorak
Ok, certainement pas :-)
John Dvorak
15
Êtes-vous sûr de ne pas simplement vouloir ce joli tableau 1x1 de 10s? [10]
kojiro
8
Serait-ce [[10]]?
décédé

Réponses:

10

Javascript ES6, 30

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

ES6 en action :)

Afonso Matos
la source
2
Salut, cette question est comme 2 ans. C'est probablement une meilleure utilisation de vos compétences de golf en code JS pour répondre à des questions plus récentes;)
George
6
@George Je ne pense pas qu'il y ait quelque chose de mal à répondre aux anciens défis. (Certains auteurs de défis mettront également à jour la réponse acceptée si un nouveau gagnant se présente, quel que soit l'âge du défi.)
Martin Ender
2
@ MartinBüttner Cette réponse n'est pas éligible pour être acceptée car ES6 est plus jeune (il est venu en 2015 :)) que ce défi, et Array.fill () est ES6 uniquement :)
Katenkyo
Je viens de répondre parce que j'ai également vu d'autres réponses ES6. Je ne pense pas qu'il y ait quelque chose de mal à cela. L'auteur pourrait mettre à jour sa question et d'autres pourraient profiter de plusieurs façons de résoudre le problème ci-dessus.
Afonso Matos
ES6 a été accepté bien avant que son projet ne soit réellement gelé (c'est-à-dire en 2015, il y a quelques jours). Je ne sais pas si c'est correct ou incorrect.
Optimizer
27

Javascript, 34 octets

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

Puisqu'il est apparemment OK de rendre les lignes égales par référence, je suppose qu'il est apparemment OK de s'appuyer sur ce fait. Cela nous aide à raser une boucle for en construisant la table en même temps que ses lignes. Alors, voici mon nouveau candidat.

Depuis r[0]et b[0]sont écrasés pendant la boucle, ils peuvent contenir des ordures. Cela nous donne un autre créneau d'exécution gratuit pour raser certaines virgules. Malheureusement, r=b=[]cela ne suffira pas, car ils sont égaux par référence.

De plus, il évolue bien (99x99 est toujours 34 octets), ne nécessite pas ES5 (les nouvelles fonctions ont des noms terriblement longs, de toute façon), et en bonus, il est illisible :-)

John Dvorak
la source
3
Magnifique. Absolument magnifique.
Briguy37
1
Bon sang, je me suis retrouvé avec: c=[b=[i=10]];while(i--)b[i]=c,c[i]=1. Aurait dû savoir!!!
mowwwalker
19

ECMAScript 6 - 33 caractères

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

Produit un tableau 10x10 de "1".

Cela abuse du fait que la chaîne "1111111111" possède toutes les propriétés requises pour être traitée comme s'il s'agissait d'un tableau. Vous pouvez donc utiliser l'opérateur d'étalement ...pour le transformer en un tableau de caractères, puis le mapper sur une copie du tableau avec chaque élément faisant référence à "l'original".

Ou avec un seul nom de variable (pour 35 caractères):

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

Ou pour plus de confusion (mais à 45 caractères)

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

ou (43 caractères)

y=y=>[...x].map(x=>y);x=[];x[9]=x;x=y(y(1))
MT0
la source
Bon abus de l' ...opérateur!
nderscore
13

44 octets

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

La version précédente:

for(a=i=[];i^10;)a[i++]=[1,1,1,1,1,1,1,1,1,1]
copie
la source
Mise à jour très intelligente!
Shmiddty
pour (a = [i = 9]; i;) a [i -] = [1,1,1,1,1,1,1,1,1,1,1]
AmericanUmlaut
1
@AmericanUmlaut qui ne fonctionne pas
copie le
1
J'aime ^pour!=
John Dvorak
13

45 caractères

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

Chaque élément pointe vers le même tableau, mais la spécification ne mentionne rien contre cela!

Casey Chu
la source
4
la spécification dit que "le tableau doit être accessible après son instanciation." . Je suppose que cela signifie que vous devriez avoir un supplément x=au début
Cristian Lupascu
une très belle solution quand même (+1)
Cristian Lupascu
Ce n'est pas très pratique, car un changement de valeur se répercutera sur tous les tableaux.
Gabriele Petrioli
7

Javascript, 51

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

Ou si tous les indices sont autorisés à pointer vers le même tableau:

Javascript, 41

a=[1,1,1,1,1,1,1,1,1,1];a=a.map(a.sort,a)
grc
la source
Tous les indices pointent désormais vers la même colonne, ce qui est probablement indésirable. (Essayez a[0][1] = 5; console.log(a[1][1])).
copie du
Ouais je n'ai pas vu ça. J'ai mis à jour ma réponse.
grc
6

JavaScript, 45 44 octets

Le meilleur que j'ai jusqu'à présent. (En train d'essayer).

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

Plus court (merci mellamokb!)

for(x=[];x.push([1,1,1,1,1,1,1,1,1,1])-10;);
Brigand
la source
Notez que forc'est presque toujours préférable au whilegolf. L'instruction de base est de la même longueur ( while()vs for(;;)), mais forvous donne plus de flexibilité. Dans ce cas, vous pouvez mettre x=[]l'initialiseur du foret enregistrer un caractère.
mellamokb
@mellamokb, merci pour le conseil :-)
Brigand
5

Javascript, 47

Puisque ma solution d'origine a été battue, je vais maintenant la publier.

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

Malheureusement, 0x3FF.toString(2) n'est pas aussi efficace que de simplement lister la chaîne, ce qui n'est pas aussi efficace que de simplement déclarer statiquement le tableau.

Vous pouvez raser un personnage de cette façon ( 46 ):

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

Vous pouvez enregistrer 2 caractères supplémentaires comme ceci: ( 44 )

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

Une autre solution de 44 octets utilisant des fermetures d'expression de fonction JS 1.8 (FF uniquement atm):

x=(x=[1,1,1,1,1,1,1,1,1,1]).map(function()x)
Shmiddty
la source
1
Vous pouvez enregistrer un omble chevalier en initialisant idans la amanière suivante:a=[i=10]
codeporn
4

JavaScript, 57 octets

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

Avant de jouer au golf:

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

Remarque: Cela nécessite ES5, alors n'attendez pas grand-chose d'IE.

John Dvorak
la source
Hou la la! J'ai écrit eval('a=['+(b=Array(11)).join('['+b.join("1,")+'],')+']'). En plus d'avoir des guillemets différents et que j'ai la variable dans eval, ce sont exactement les mêmes
mowwwalker
2
a=eval("["+Array(11).join("[1,1,1,1,1,1,1,1,1,1],")+"]")a 56 ans
perdu
3

54

Cela a déjà été battu, mais voici ma solution:

function x(){return[1,1,1,1,1,1,1,1,1,1]}x=x().map(x)
kojiro
la source
Les fonctions fléchées feront des choses intéressantes au golf JavaScript. Maintenant, si seulement je pouvais comprendre comment trivialement incorporer Curry.
kojiro
Vous auriez besoin d'insérer x=avant x().map(ou y=, etc.) pour le rendre accessible, non?
Shmiddty
@Schmiddty Oui, donc mis à jour.
kojiro
3

39 octets

Utilisation de la compréhension des tableaux dans ECMAScript 7:

x=[x for(y in x=[1,1,1,1,1,1,1,1,1,1])]
nderscore
la source
Il n'y a aucune compréhension de tableau dans ES6, c'est une proposition ES7.
Afonso Matos
@afonsomatos au moment où j'ai fait cette réponse, elle faisait toujours partie du projet ES6. Il est maintenant mis à jour cependant :)
nderscore
Remplacement [1,1,1,1,1,1,1,1,1,1]par Array(10).fill(1)rasage 4 caractères.
Shmiddty
2

56 caractères

Réponse plutôt longue, mais sera meilleure pour 100x100 etc.

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

Javascript, 36 caractères (ECMA 6)

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

Testé dans mon navigateur (Firefox sur Ubuntu) et dans l'interpréteur Javascript Codecademy

QuadmasterXLII
la source
2

ES6, 54

Ce n'est pas le plus court, mais j'ai pensé que j'opterais pour une approche différente de ce qui est déjà là.

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

Convertir un objet en chaîne "[object Object]"
Scinder la chaîne en caractères ["[", "o", "b", ... "]"]
Récupérer une tranche de seulement 10
Mapper le résultat du mappage 1 sur la tranche initiale

Dan Prince
la source
Où puis-je le tester? Cela ne fonctionne pas correctement dans mon FF.
Qwertiy
J'avais manqué quelques parens, cependant, car adéjà existait cette version semblait avoir fonctionné. La version mise à jour devrait fonctionner dans FF et node avec les drapeaux --harmony.
Dan Prince
Maintenant, il renvoie le bon tableau, mais il n'est affecté à aucune variable.
Qwertiy
1

61 pour le plaisir

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

Javascript - 64 63 59 caractères

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

Un caractère enregistré en masquant l'itérateur dans le tableau.

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

Enregistré quelques caractères avec des suggestions de Jans.

Version lisible:

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

Oui, ce n'est pas la solution la plus courte, mais une autre approche sans utiliser de [1,1,1,1,1,1,1,1,1,1]tableaux prêts à l'emploi .

codeporn
la source
1
Remplacez i-->0par i--. Bien que l'opérateur "downto" soit sympa, ce n'est pas vraiment nécessaire. ==0pourrait également être rasé de deux bits. Aussi, laissez de côté var. Bien que normalement utiles, quatre octets inutiles sont tout simplement inacceptables ici.
John Dvorak
0

Javascript 69 caractères (pour l'instant)

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

JavaScript 73

function h(){s="1111111111",r=[10],i=-1;while(++i<10){r[i]=s.split("");}}
bacchusbeale
la source
1
r=[10],ne fait rien car vous écrasez immédiatement r[0]. Vous n'avez pas besoin de déclarer set pourriez simplement le faire, "1111111111".split("")mais cela fait 22 caractères alors qu'il [1,1,1,1,1,1,1,1,1,1]n'y a que 21 caractères.
MT0
0

Javascript ES6, 53

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

Mais ceux du tableau sont des chaînes :)

Qwertiy
la source
0

Javscript ES6, 53

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

JavaScript (ES6), 35 octets

A=Array(10).fill(Array(10).fill(1))
user84702
la source
1
La définition d'une variable n'est pas une méthode de sortie approuvée. Cependant, vous pouvez le faire f=>Array(10).fill(Array(10).fill(1))(définir une fonction anonyme) pour 36 octets.
Rɪᴋᴇʀ