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.

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

Afonso Matos
fonte
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 :-)

John Dvorak
fonte
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))
MT0
fonte
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]
cópia de
fonte
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!

Casey Chu
fonte
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)
grc
fonte
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;);
Brigand
fonte
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)
Shmiddty
fonte
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.

John Dvorak
fonte
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)
kojiro
fonte
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])]
nderscore
fonte
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
XzKto
fonte
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

QuadmasterXLII
fonte
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

Dan Prince
fonte
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)+"]")
Maxime E
fonte
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 .

codeporn
fonte
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=[]}
}
Bobby Marinoff
fonte
0

JavaScript 73

function h(){s="1111111111",r=[10],i=-1;while(++i<10){r[i]=s.split("");}}
bacchusbeale
fonte
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 :)

Qwertiy
fonte
0

Javscript ES6, 53

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

JavaScript (ES6), 35 bytes

A=Array(10).fill(Array(10).fill(1))
user84702
fonte
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ɪᴋᴇʀ