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.


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


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


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

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]

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!


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)

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

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)

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.


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)

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

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

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


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


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

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 .


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

0

JavaScript 73

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

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


0

Javscript ES6, 53

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

0

JavaScript (ES6), 35 octets

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

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ɪᴋᴇʀ
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.