Javascript: Crie uma matriz 10x10 de 1s


18

Obviamente, esse desafio seria trivial com funções e bibliotecas separadas, portanto elas não são permitidas.

Seu código deve estar em conformidade com uma especificação ECMAscript (qualquer especificação serve), portanto, nenhuma resposta específica do navegador.

A matriz deve estar acessível após ser instanciada.

Tenho uma resposta que vou reter por enquanto.

Nota: esse desafio é específico para o javascript porque é notoriamente inconveniente criar matrizes multidimensionais em javascript.


Estou com 57 caracteres. Esta é uma boa pontuação?
precisa

Ok, definitivamente não é :-)
John Dvorak

15
Você tem certeza de que não quer apenas este belo arranjo 1x1 de 10s? [10]
kojiro

8
Seria isso [[10]]?
yingted 12/03/2013

Respostas:


10

Javascript ES6, 30

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

ES6 em ação :)


2
Olá, esta pergunta tem 2 anos. Provavelmente, é um melhor uso de suas habilidades de golfe com código JS para responder a perguntas mais recentes;) #
George George

6
@ George Eu não acho que haja algo errado em responder a velhos desafios. (Alguns autores desafio também irá atualizar a resposta aceite se um novo vencedor vem junto, não importa quantos anos o desafio é.)
Martin Ender

2
@ MartinBüttner Esta resposta não é elligible para ser aceito como ES6 é mais jovem (ele veio em 2015 :)) do que este desafio, e Array.fill () é ES6 única :)
Katenkyo

Acabei de responder porque também vi outras respostas do ES6. Eu não acho que haja algo errado nisso. O autor pode atualizar sua pergunta e outros podem tirar proveito de várias maneiras de resolver o problema acima.
Afonso Matos

O ES6 foi aceito muito antes do congelamento do seu rascunho (isto é, em 2015, alguns dias atrás). Não sei se isso está correto ou incorreto.
Optimizer

27

Javascript, 34 bytes

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

Como aparentemente não há problema em tornar as linhas iguais por referência, acho que não há problema em confiar nesse fato. Isso nos ajuda a eliminar um loop for criando a tabela ao mesmo tempo que suas linhas. Então, aqui está o meu novo concorrente.

Como r[0]e b[0]são substituídos durante o loop, eles podem conter lixo. Isso nos dá outro slot de execução gratuito para raspar algumas vírgulas. Infelizmente, r=b=[]não vai fazer, desde então eles são iguais por-ref.

Além disso, ele escala bem (99x99 ainda é 34 bytes), não requer ES5 (as novas funções têm nomes terrivelmente longos, de qualquer maneira) e, como bônus, é ilegível :-)


3
Lindo. Absolutamente lindo.
precisa saber é o seguinte

1
Droga, eu acabei com: c=[b=[i=10]];while(i--)b[i]=c,c[i]=1. Deveria saber!!!
precisa saber é o seguinte

19

ECMAScript 6 - 33 Caracteres

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

Produz uma matriz 10x10 de "1" s.

Isso abusa do fato de a string "1111111111" ter todas as propriedades necessárias para serem tratadas como se fosse uma matriz, para que você possa usar o operador de propagação ...para transformá-la em uma matriz de caracteres e mapeá-la para uma cópia da matriz com cada elemento referenciando o "original".

Ou com apenas um nome de variável (para 35 caracteres):

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

Ou para confusão extra (mas com 45 caracteres)

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

ou (43 caracteres)

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

Bom abuso do ...operador!
Ndscore # 23/14

13

44 bytes

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

Versão anterior:

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

Atualização muito inteligente!
Shmiddty

Para (a = [i = 9]; i;) a [i -] = [1,1,1,1,1,1,1,1,1,1]]
AmericanUmlaut

1
@AmericanUmlaut que não funciona
copie

1
Eu gosto ^de!=
John Dvorak

13

45 caracteres

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

Cada elemento aponta para a mesma matriz, mas a especificação não menciona nada contra isso!


4
a especificação diz que "a matriz deve estar acessível após ser instanciada". . Eu acho que isso significa que você deve ter um extra x=no início
Cristian Lupascu

uma solução muito agradável, no entanto, (+1)
Cristian Lupascu

Isso não é muito prático, pois uma alteração em um valor refletirá em todas as matrizes.
Gabriele Petrioli 10/01

7

Javascript, 51

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

Ou se todos os índices puderem apontar para a mesma matriz:

Javascript, 41

a=[1,1,1,1,1,1,1,1,1,1];a=a.map(a.sort,a)

Todos os índices agora apontam para a mesma coluna, o que provavelmente é indesejável. (Tente a[0][1] = 5; console.log(a[1][1])).
copie

Sim, eu não vi isso. Eu atualizei minha resposta.
grc

6

JavaScript, 45 44 bytes

Melhor que eu tenho até agora. (Ainda tentando).

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

Mais curto (obrigado mellamokb!)

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

Note que forquase sempre é preferível ao whilegolfe. A declaração básica tem o mesmo comprimento ( while()vs for(;;)), mas foroferece mais flexibilidade. Nesse caso, você pode colocar x=[]o inicializador do fore salvar um caractere.
precisa saber é o seguinte

@mellamokb, obrigado pela dica :-)
Brigand

5

Javascript, 47

Como minha solução original foi derrotada, agora a publicarei.

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

Infelizmente, 0x3FF.toString(2)não é tão eficiente quanto listar a string, o que não é tão eficiente quanto declarar estaticamente a matriz.

Você pode cortar um caractere dessa maneira ( 46 ):

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

Você pode salvar mais 2 caracteres assim: ( 44 )

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

Outra solução de 44 bytes usando o fechamento da expressão da função JS 1.8 (somente FF atm):

x=(x=[1,1,1,1,1,1,1,1,1,1]).map(function()x)

1
Você pode salvar um caractere por inicializar iem acomo isto:a=[i=10]
codeporn

4

JavaScript, 57 bytes

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

Antes de jogar golfe:

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

Nota: Isso precisa do ES5, portanto, não espere muito do IE.


Uau! Eu escrevi eval('a=['+(b=Array(11)).join('['+b.join("1,")+'],')+']'). Além de ter citações diferentes e meu tendo o interior eval variável, estes são exatamente o mesmo
mowwwalker

2
a=eval("["+Array(11).join("[1,1,1,1,1,1,1,1,1,1],")+"]")tem 56
yingted

3

54

Isso já foi superado, mas aqui está a minha solução:

function x(){return[1,1,1,1,1,1,1,1,1,1]}x=x().map(x)

As funções de seta farão coisas interessantes no golfe com JavaScript. Agora, se eu pudesse descobrir como trivialmente embutir Curry.
Kojiro

Você precisaria inserir x=antes x().map(ou y=etc) para torná-lo acessível, certo?
Shmiddty

@ Schmiddty Sim, tão atualizado.
Kjiro

3

39 bytes

Usando compreensão de matriz no ECMAScript 7:

x=[x for(y in x=[1,1,1,1,1,1,1,1,1,1])]

Não há compreensão de matriz no ES6, essa é uma proposta do ES7.
Afonso Matos

@afonsomatos no momento em que respondi, ainda fazia parte do rascunho do ES6. Está atualizado agora :)
nderscore 19/06/2015

Substituindo [1,1,1,1,1,1,1,1,1,1]por Array(10).fill(1)barbear 4 caracteres.
Shmiddty

2

56 caracteres

Resposta bastante longa, mas será melhor para 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 caracteres (ECMA 6)

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

Testado no meu navegador (Firefox no Ubuntu) e no interpretador Javascript da Codecademy


2

ES6, 54

Não é o mais curto, mas pensei em seguir uma abordagem diferente do que já está aqui.

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

Converter um objeto em uma string "[object Object]"
Divida a string em caracteres ["[", "o", "b", ... "]"]
Pegue uma fatia de apenas 10
Mapeie o resultado do mapeamento 1 para a fatia inicial


Onde posso testá-lo? Não funciona direito no meu FF.
precisa saber é o seguinte

Eu tinha perdido algumas parênteses, no entanto, porque ajá existia essa versão parecia ter funcionado. A versão atualizada deve funcionar no FF e no nó com os sinalizadores --harmony.
Dan Prince

Agora ele retorna a matriz correta, mas não está atribuída a nenhuma variável.
precisa saber é o seguinte

1

61 por diversão

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

0

Javascript - 64 63 59 caracteres

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

Um caractere salvo, ocultando o iterador na matriz.

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

Salvo alguns caracteres com sugestões de Jans.

Versão legível:

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

Sim, não é a solução mais curta, mas outra abordagem sem usar [1,1,1,1,1,1,1,1,1,1]matrizes prontas .


1
Mude i-->0para i--. Embora o operador "downto" seja bom, não é realmente necessário. ==0também pode ser raspado em dois bits. Além disso, deixe de fora var. Embora normalmente seja útil, quatro bytes inúteis são inaceitáveis ​​aqui.
John Dvorak

0

Javascript 69 caracteres (por enquanto)

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],não faz nada quando você substitui imediatamente r[0]. Você não precisa declarar se poderia fazer, "1111111111".split("")mas isso é 22 caracteres, enquanto [1,1,1,1,1,1,1,1,1,1]apenas 21 caracteres.
MT0 25/05

0

Javascript ES6, 53

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

Mas os da matriz são cadeias :)


0

Javscript ES6, 53

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

0

JavaScript (ES6), 35 bytes

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

1
Definir uma variável não é um método de saída aprovado. No entanto, você pode fazer f=>Array(10).fill(Array(10).fill(1))(definindo uma função anônima) por 36 bytes.
Rɪᴋᴇʀ
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.