Javascript: crea una matriz de 10x10 de 1s


18

Obviamente, este desafío sería trivial con funciones y bibliotecas separadas, por lo que no están permitidas.

Su código debe cumplir con una especificación ECMAscript (cualquier especificación servirá), por lo que no hay respuestas específicas del navegador.

La matriz debe ser accesible después de que se instancia.

Tengo una respuesta que retendré por ahora.

Nota: este desafío es específico de javascript porque es muy inconveniente hacer matrices multidimensionales en javascript.


Tengo 57 caracteres. ¿Es este un buen puntaje?
John Dvorak

Ok, definitivamente no :-)
John Dvorak

15
¿Estás seguro de que no solo quieres esta bonita matriz 1x1 de 10? [10]
kojiro

8
¿Sería eso [[10]]?
gritó

Respuestas:


10

Javascript ES6, 30

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

ES6 en acción :)


2
Hola, esta pregunta tiene como 2 años. Probablemente sea un mejor uso de sus habilidades de golf de código JS para responder preguntas más recientes;)
George

66
@ George No creo que haya nada malo en responder viejos desafíos. (Algunos autores del desafío también actualizarán la respuesta aceptada si aparece un nuevo ganador, sin importar la antigüedad del desafío.)
Martin Ender

2
@ MartinBüttner Esta respuesta no es elegible para ser aceptado ya que ES6 es más joven (llegó en 2015 :)) que este desafío, y Array.fill () es solo ES6 :)
Katenkyo

Solo respondí porque también vi otras respuestas de ES6. No creo que haya nada malo en esto. El autor puede actualizar su pregunta y otros pueden aprovechar múltiples formas de resolver el problema anterior.
Afonso Matos

ES6 ha sido aceptado mucho antes de que su borrador se congelara (es decir, en 2015, hace unos días). Sin embargo, no estoy seguro de si eso es correcto o incorrecto.
Optimizador

27

Javascript, 34 bytes

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

Dado que aparentemente está bien hacer que las filas sean iguales por referencia, creo que aparentemente está bien confiar en ese hecho. Esto nos ayuda a eliminar un bucle for mediante la creación de la tabla al mismo tiempo que sus filas. Entonces, aquí está mi nuevo concursante.

Dado r[0]y b[0]se sobrescriben durante el bucle, que pueden contener basura. Esto nos da otro espacio de ejecución gratuito para eliminar algunas comas. Lamentablemente, r=b=[]no lo haré, ya que son iguales por ref.

Además, se escala bien (99x99 sigue siendo 34 bytes), no requiere ES5 (las nuevas funciones tienen nombres terriblemente largos, de todos modos), y como beneficio adicional, es ilegible :-)


3
Hermosa. Absolutamente hermoso.
Briguy37

1
Joder, que terminó con: c=[b=[i=10]];while(i--)b[i]=c,c[i]=1. Debería haberlo sabido !!!
mowwwalker

19

ECMAScript 6 - 33 caracteres

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

Emite una matriz de 10x10 de "1" s.

Esto abusa del hecho de que la cadena "1111111111" tiene todas las propiedades necesarias para ser tratada como si fuera una matriz, por lo que puede usar el operador de propagación ...para transformarla en una matriz de caracteres y luego asignarla a una copia de la matriz con cada elemento hace referencia al "original".

O con un solo nombre de variable (para 35 caracteres):

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

O para confusión adicional (pero con 45 caracteres)

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

o (43 caracteres)

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

¡Buen abuso del ...operador!
nderscore

13

44 bytes

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

Versión previa:

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

Actualización muy inteligente!
Shmiddty

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

1
@AmericanUmlaut que no funciona
copie el

1
Me gusta ^para!=
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 apunta a la misma matriz, pero la especificación no menciona nada en contra de eso!


44
la especificación dice que "La matriz debe ser accesible después de que se instancia". . Supongo que eso significa que deberías tener un extra x=al principio
Cristian Lupascu

una muy buena solución, sin embargo (+1)
Cristian Lupascu

Sin embargo, eso no es muy práctico, ya que un cambio en un valor se reflejará en todas las matrices.
Gabriele Petrioli

7

Javascript, 51

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

O si todos los índices pueden apuntar a la misma matriz:

Javascript, 41

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

Todos los índices ahora apuntan a la misma columna, que probablemente no es deseada. (Intenta a[0][1] = 5; console.log(a[1][1]))
copia el

Sí, no vi eso. He actualizado mi respuesta.
grc

6

JavaScript, 45 44 bytes

Lo mejor que tengo hasta ahora. (Aún intentando).

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

Más corto (gracias mellamokb!)

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

Tenga en cuenta que forcasi siempre es preferible whileal golf. La declaración básica es de la misma longitud ( while()vs for(;;)), pero forle brinda más flexibilidad. En este caso, puede poner x=[]el inicializador del fory guardar un carácter.
mellamokb

@mellamokb, gracias por el consejo :-)
Brigante

5

Javascript, 47

Como mi solución original ha sido superada, ahora la publicaré.

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

Desafortunadamente, 0x3FF.toString(2)no es tan eficiente como simplemente enumerar la cadena, que no es tan eficiente como declarar estáticamente la matriz.

Puedes afeitarte un personaje de esta manera ( 46 ):

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

Puede guardar 2 caracteres más así: ( 44 )

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

Otra solución de 44 bytes que utiliza cierres de expresión de función JS 1.8 (solo atm FF):

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

1
Puede guardar un personaje inicializando ide aesta manera:a=[i=10]
codeporn

4

JavaScript, 57 bytes

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

Antes de jugar al golf:

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

Nota: Esto necesita ES5, así que no esperes mucho de IE.


¡Guauu! Yo escribi eval('a=['+(b=Array(11)).join('['+b.join("1,")+'],')+']'). Aparte de tener diferentes cotizaciones y mi tener la función eval dentro variables, éstos son exactamente los mismos
mowwwalker

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

3

54

Esto ya ha sido superado, pero aquí está mi solución:

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

Las funciones de flecha harán cosas interesantes para el golf JavaScript. Ahora, si tan solo pudiera encontrar la manera trivial de Curry builtins.
kojiro el

Tendría que insertar x=antes x().map(o y=, etc.) para que sea accesible, ¿verdad?
Shmiddty

@Schmiddty Sí, muy actualizado.
kojiro

3

39 bytes

Uso de la comprensión de matriz en ECMAScript 7:

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

No hay comprensiones de matriz en ES6, esa es una propuesta de ES7.
Afonso Matos

@afonsomatos en el momento en que hice esta respuesta, todavía era parte del borrador de ES6. Sin embargo, ahora se actualiza :)
nderscore

Sustitución [1,1,1,1,1,1,1,1,1,1]con Array(10).fill(1)afeitados 4 caracteres.
Shmiddty

2

56 caracteres

Respuesta bastante larga, pero será mejor 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))

Probado en mi navegador (Firefox en Ubuntu) y en el intérprete de Javascript de Codecademy


2

ES6, 54

No es el más corto, pero pensé que tendría un enfoque diferente para lo que ya está aquí.

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

Convierta un objeto en una cadena "[object Object]"
Divida la cadena en caracteres ["[", "o", "b", ... "]"]
Tome una porción de solo 10
Asigne el resultado de la asignación 1 en la porción inicial


¿Dónde puedo probarlo? No funciona bien en mi FF.
Qwertiy

Sin embargo, me perdí algunos parens, porque aya existía esa versión parecía haber funcionado. La versión actualizada debería funcionar en FF y nodo con los indicadores --harmony.
Dan Prince

Ahora devuelve la matriz correcta, pero no está asignada a ninguna variable.
Qwertiy

1

61 por diversión

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

Un personaje guardado al ocultar el iterador en la matriz.

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

Guarde algunos caracteres con las sugerencias de Jans.

Versión legible:

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

Sí, no es la solución más corta, sino otro enfoque sin usar [1,1,1,1,1,1,1,1,1,1]matrices listas para usar .


1
Cambiar i-->0a i--. Si bien el operador "downto" es bueno, no es realmente necesario. ==0podría ser afeitado por dos bits también. Además, dejar de lado var. Aunque normalmente es útil, cuatro bytes inútiles son simplemente inaceptables aquí.
John Dvorak el

0

Javascript 69 caracteres (por ahora)

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],no hace nada ya que sobrescribe de inmediato r[0]. No necesita declarar sy podría hacerlo, "1111111111".split("")pero tiene 22 caracteres y [1,1,1,1,1,1,1,1,1,1]solo 21 caracteres.
MT0

0

Javascript ES6, 53

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

Pero los que están en la matriz son cadenas :)


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
Establecer una variable no es un método aprobado de salida. Sin embargo, puede hacerlo f=>Array(10).fill(Array(10).fill(1))(definiendo una función anónima) para 36 bytes.
Rɪᴋᴇʀ
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.