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.