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.

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

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

John Dvorak
fuente
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))
MT0
fuente
¡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]
Copiar
fuente
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!

Casey Chu
fuente
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)
grc
fuente
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;);
Bandido
fuente
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)
Shmiddty
fuente
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.

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

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

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

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

JavaScript 73

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

Qwertiy
fuente
0

Javscript ES6, 53

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

JavaScript (ES6), 35 bytes

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