Javascript: crea un array 10x10 di 1s


18

Ovviamente questa sfida sarebbe banale con funzioni e librerie separate, quindi non sono consentite.

Il codice deve essere conforme a una specifica ECMAscript (qualsiasi specifica lo farà), quindi nessuna risposta specifica per il browser.

L'array deve essere accessibile dopo che è stato istanziato.

Ho una risposta che per ora trattengo.

Nota: questa sfida è specifica per javascript perché è notoriamente scomodo creare array multidimensionali in javascript.


Sono a 57 caratteri. È un buon punteggio?
John Dvorak,

Ok, sicuramente no :-)
John Dvorak il

15
Sei sicuro di non voler solo questo bel array 1x1 di 10s? [10]
Kojiro,

8
Sarebbe [[10]]?
gridò il

Risposte:


10

Javascript ES6, 30

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

ES6 in azione :)


2
Ciao, questa domanda è come 2 anni. Probabilmente è un uso migliore delle tue abilità di golf nel codice JS per rispondere a domande più recenti;)
George

6
@George Non credo ci sia niente di male nel rispondere alle vecchie sfide. (Alcuni autori della sfida aggiorneranno anche la risposta accettata se arriva un nuovo vincitore, non importa quanti anni abbia la sfida.)
Martin Ender

2
@ MartinBüttner Questa risposta non è comprensibile per essere accettata poiché ES6 è più giovane (è arrivato nel 2015 :)) di questa sfida, e Array.fill () è solo ES6 :)
Katenkyo,

Ho appena risposto perché ho visto anche altre risposte ES6. Non penso che ci sia qualcosa di sbagliato in questo. L'autore potrebbe aggiornare la sua domanda e altri potrebbero approfittare di molteplici modi per risolvere il problema sopra.
Afonso Matos,

L'ES6 è stato accettato molto prima che la sua bozza venisse effettivamente congelata (ovvero nel 2015, qualche giorno fa). Non sono sicuro se sia corretto o errato.
Ottimizzatore

27

Javascript, 34 byte

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

Dal momento che è apparentemente OK rendere le righe uguali per riferimento, immagino sia apparentemente OK fare affidamento su questo fatto. Questo ci aiuta a radere un for-loop costruendo la tabella contemporaneamente alle sue righe. Quindi, ecco il mio nuovo concorrente.

Poiché r[0]e b[0]vengono sovrascritti durante il ciclo, possono contenere immondizia. Questo ci dà un altro slot di esecuzione gratuita per radere alcune virgole. Purtroppo, r=b=[]non lo farà, da allora sono uguali per riferimento.

Inoltre, si ridimensiona bene (99x99 è ancora 34 byte), non richiede ES5 (le nuove funzioni hanno nomi terribilmente lunghi, comunque) e, come bonus, è illeggibile :-)


3
Bellissimo. Assolutamente bella.
Briguy37,

1
Accidenti, ho finito con: c=[b=[i=10]];while(i--)b[i]=c,c[i]=1. Avrei dovuto saperlo !!!
mowwwalker,

19

ECMAScript 6 - 33 Personaggi

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

Emette un array 10x10 di "1" s.

Questo abusa del fatto che la stringa "1111111111" ha tutte le proprietà necessarie per essere trattata come se fosse un array, quindi puoi usare l'operatore spread ...per trasformarlo in un array di caratteri e quindi mapparlo su una copia dell'array con ogni elemento che fa riferimento a "originale".

O con un solo nome di variabile (per 35 caratteri):

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

O per ulteriore confusione (ma a 45 caratteri)

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

o (43 caratteri)

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

Bel abuso ...dell'operatore!
nderscore,

13

44 byte

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

Versione precedente:

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

Aggiornamento molto intelligente!
Shmiddty,

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

1
@AmericanUmlaut che non funziona
copia il

1
Mi piace ^per!=
John Dvorak il

13

45 caratteri

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

Ogni elemento punta allo stesso array, ma le specifiche non menzionano nulla di contrario!


4
la specifica dice che "l'array deve essere accessibile dopo che è stato istanziato". . Immagino che ciò significhi che dovresti avere un extra x=all'inizio
Cristian Lupascu, il

una soluzione molto bella (+1)
Cristian Lupascu,

Ciò non è molto pratico, poiché una modifica a un valore si rifletterà su tutti gli array.
Gabriele Petrioli,

7

Javascript, 51

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

O se tutti gli indici sono autorizzati a puntare allo stesso array:

Javascript, 41

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

Tutti gli indici ora indicano la stessa colonna, che è probabilmente indesiderata. (Prova a[0][1] = 5; console.log(a[1][1])).
copia il

Sì, non l'ho visto. Ho aggiornato la mia risposta.
GRC

6

JavaScript, 45 44 byte

Meglio che abbia finora. (Ancora provando).

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

Più breve (grazie mellamokb!)

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

Si noti che forè quasi sempre preferibile whilequando si gioca a golf. L'istruzione di base ha la stessa lunghezza ( while()vs for(;;)), ma foroffre maggiore flessibilità. In questo caso, è possibile inserire x=[]l'inizializzatore di fore salvare un carattere.
mellamokb,

@mellamokb, grazie per la punta :-)
Brigand

5

Javascript, 47

Poiché la mia soluzione originale è stata superata, ora la posterò.

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

Sfortunatamente, 0x3FF.toString(2)non è così efficiente come elencare semplicemente la stringa, il che non è altrettanto efficace come dichiarare staticamente l'array.

Puoi radere un personaggio in questo modo ( 46 ):

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

Puoi salvare altri 2 personaggi in questo modo: ( 44 )

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

Un'altra soluzione da 44 byte che utilizza le chiusure di espressioni di funzione JS 1.8 (solo FF atm):

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

1
Puoi salvare un carattere inizializzando iin aquesto modo:a=[i=10]
codeporn

4

JavaScript, 57 byte

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

Prima di giocare a golf:

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

Nota: questo richiede ES5, quindi non aspettarti molto da IE.


Wow! Ho scritto eval('a=['+(b=Array(11)).join('['+b.join("1,")+'],')+']'). Oltre ad avere virgolette diverse e il fatto che io abbia la variabile dentro eval, queste sono esattamente le stesse
mowwwalker,

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

3

54

Questo è già stato battuto, ma ecco la mia soluzione:

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

Le funzioni freccia faranno cose interessanti per il golf JavaScript. Ora, se solo potessi capire come incorporare banalmente Curry.
Kojiro,

Dovresti inserire x=prima x().map(o y=, ecc.) Per renderlo accessibile, giusto?
Shmiddty,

@Schmiddty Sì, così aggiornato.
Kojiro,

3

39 byte

Utilizzo della comprensione dell'array in ECMAScript 7:

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

Non ci sono comprensioni dell'array in ES6, questa è una proposta ES7.
Afonso Matos,

@afonsomatos al momento in cui ho dato questa risposta, faceva ancora parte del progetto ES6. Ora è aggiornato però :)
nderscore

Sostituzione [1,1,1,1,1,1,1,1,1,1]con Array(10).fill(1)rasatura 4 caratteri.
Shmiddty,

2

56 caratteri

Risposta piuttosto lunga, ma sarà migliore per 100x100 ecc.

for(a=[[i=k=0]];++i<100;m?0:a[k=i/10]=[1])a[k][m=i%10]=1

2

Javascript, 36 caratteri (ECMA 6)

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

Testato nel mio browser (Firefox su Ubuntu) e nell'interprete Javascript Codecademy


2

ES6, 54

Non è il più breve, ma ho pensato di scegliere un approccio diverso a ciò che è già qui.

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

Trasmetti un oggetto a una stringa "[object Object]"
Dividi la stringa in caratteri ["[", "o", "b", ... "]"]
Prendi una porzione di soli 10
Mappa il risultato della mappatura 1 sulla sezione iniziale


Dove posso provarlo? Non funziona proprio nel mio FF.
Qwertiy,

Avevo perso alcune parentesi, tuttavia, perché agià esisteva quella versione sembrava aver funzionato. La versione aggiornata dovrebbe funzionare in FF e nodo con i flag --harmony.
Dan Prince,

Ora restituisce l'array giusto, ma non è assegnato a nessuna variabile.
Qwertiy,

1

61 per divertimento

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

0

Javascript - 64 63 59 caratteri

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 carattere salvato nascondendo l'iteratore nella matrice.

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

Hai salvato alcuni caratteri con i suggerimenti di Jans.

Versione leggibile:

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

Sì, non è la soluzione più breve, ma un altro approccio senza l'utilizzo di [1,1,1,1,1,1,1,1,1,1]array pronti .


1
Cambia i-->0in i--. Mentre l'operatore "downto" è simpatico, non è proprio necessario. ==0potrebbe essere rasato anche da due bit. Inoltre, lascia fuori var. Sebbene normalmente utili, quattro byte inutili sono inaccettabili qui.
John Dvorak,

0

Javascript 69 caratteri (per ora)

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],non fa nulla mentre si sovrascrive immediatamente r[0]. Non è necessario dichiarare se si potrebbe semplicemente fare, "1111111111".split("")ma sono 22 caratteri mentre [1,1,1,1,1,1,1,1,1,1]sono solo 21 caratteri.
MT0,

0

Javascript ES6, 53

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

Ma quelli nell'array sono stringhe :)


0

Javscript ES6, 53

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

0

JavaScript (ES6), 35 byte

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

1
L'impostazione di una variabile non è un metodo di output approvato. Tuttavia, è possibile eseguire f=>Array(10).fill(Array(10).fill(1))(definizione di una funzione anonima) per 36 byte.
Rɪᴋᴇʀ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.