Javascript: Buat array 10x10 1s

18

Tentunya tantangan ini akan sepele dengan fungsi dan perpustakaan yang terpisah, sehingga mereka tidak diizinkan.

Kode Anda harus sesuai dengan spesifikasi skrip ECMA (spesifikasi apa pun akan dilakukan), jadi tidak ada jawaban khusus peramban.

Array harus dapat diakses setelah instantiated.

Saya punya jawaban yang akan saya tahan untuk saat ini.

Catatan: tantangan ini khusus untuk javascript karena sangat tidak nyaman untuk membuat array multi dimensi dalam javascript.

Shmiddty
sumber
Saya di 57 karakter. Apakah ini skor yang bagus?
John Dvorak
Ok, pasti tidak :-)
John Dvorak
15
Apakah Anda yakin tidak hanya menginginkan array 10x 1s bagus ini? [10]
kojiro
8
Apakah itu akan terjadi [[10]]?
yingted

Jawaban:

10

Javascript ES6, 30

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

ES6 beraksi :)

Afonso Matos
sumber
2
Hai, pertanyaan ini seperti berumur 2 tahun. Mungkin lebih baik menggunakan keterampilan golf kode JS Anda untuk menjawab pertanyaan yang lebih baru;)
George
6
@ George Saya tidak berpikir ada yang salah dengan menjawab tantangan lama. (Beberapa penulis tantangan juga akan memperbarui jawaban yang diterima jika ada pemenang baru, tidak peduli berapa lama tantangan itu.)
Martin Ender
2
@ MartinBüttner Jawaban ini tidak dapat diterima karena diterima karena ES6 lebih muda (datang pada tahun 2015 :)) daripada tantangan ini, dan Array.fill () hanya ES6 :)
Katenkyo
Saya hanya menjawab karena saya melihat jawaban ES6 lainnya juga. Saya tidak berpikir ada yang salah dengan ini. Penulis dapat memperbarui pertanyaannya dan orang lain dapat memanfaatkan berbagai cara untuk menyelesaikan masalah di atas.
Afonso Matos
ES6 telah diterima jauh sebelum rancangannya benar-benar dibekukan (yaitu pada 2015, beberapa hari yang lalu). Namun saya tidak yakin apakah itu benar atau salah.
Pengoptimal
27

Javascript, 34 byte

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

Karena tampaknya OK untuk membuat baris sama dengan referensi, saya kira itu OK untuk mengandalkan fakta itu. Ini membantu kita mengurangi satu for-loop dengan membangun tabel pada saat yang sama dengan barisnya. Jadi, inilah kontestan baru saya.

Karena r[0]dan b[0]ditimpa selama loop, mereka dapat mengandung sampah. Ini memberi kami slot eksekusi gratis lainnya untuk mengurangi beberapa koma. Sedihnya, r=b=[]tidak akan berhasil, karena mereka setara dengan-ref.

Juga, ini berskala dengan baik (99x99 masih 34 byte), tidak memerlukan ES5 (fungsi baru memiliki nama yang sangat panjang, lagipula), dan sebagai bonus, itu tidak dapat dibaca :-)

John Dvorak
sumber
3
Cantik. Sangat cantik.
Briguy37
1
Sial, saya berakhir dengan: c=[b=[i=10]];while(i--)b[i]=c,c[i]=1. Seharusnya tahu !!!
mowwwalker
19

ECMAScript 6 - 33 Karakter

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

Menghasilkan array 10x10 "1" s.

Ini menyalahgunakan fakta bahwa string "1111111111" memiliki semua properti yang diperlukan untuk diperlakukan seolah-olah itu adalah array sehingga Anda dapat menggunakan operator spread ...untuk mengubahnya menjadi array karakter dan kemudian memetakannya ke salinan array dengan setiap elemen mereferensikan "asli".

Atau hanya dengan satu nama variabel (untuk 35 karakter):

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

Atau untuk kebingungan tambahan (tetapi pada 45 karakter)

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

atau (43 karakter)

y=y=>[...x].map(x=>y);x=[];x[9]=x;x=y(y(1))
MT0
sumber
Penyalahgunaan ...operator yang bagus!
nderscore
13

44 byte

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

Versi sebelumnya:

for(a=i=[];i^10;)a[i++]=[1,1,1,1,1,1,1,1,1,1]
salinan
sumber
Pembaruan yang sangat pintar!
Shmiddty
untuk (a = [i = 9]; i;) a [i -] = [1,1,1,1,1,1,1,1,1,1,1]
AmericanUmlaut
1
@AmericanUmlaut yang tidak berfungsi
salin
1
Saya suka ^untuk!=
John Dvorak
13

45 karakter

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

Setiap elemen menunjuk ke array yang sama, tetapi spec tidak menyebutkan apa-apa terhadap itu!

Casey Chu
sumber
4
spec mengatakan bahwa "Array harus dapat diakses setelah instantiated." . Saya kira itu berarti Anda harus memiliki tambahan x=di awal
Cristian Lupascu
solusi yang sangat bagus (+1)
Cristian Lupascu
Itu tidak terlalu praktis meskipun sebagai perubahan nilai akan mencerminkan semua array.
Gabriele Petrioli
7

Javascript, 51

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

Atau jika semua indeks diizinkan untuk menunjuk ke array yang sama:

Javascript, 41

a=[1,1,1,1,1,1,1,1,1,1];a=a.map(a.sort,a)
grc
sumber
Semua indeks sekarang menunjuk ke kolom yang sama, yang mungkin tidak diinginkan. (Coba a[0][1] = 5; console.log(a[1][1])).
salin
Ya saya tidak melihat itu. Saya telah memperbarui jawaban saya.
grc
6

JavaScript, 45 44 Bytes

Terbaik yang saya miliki sejauh ini. (Masih berusaha).

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

Lebih pendek (terima kasih mellamokb!)

for(x=[];x.push([1,1,1,1,1,1,1,1,1,1])-10;);
Perampok
sumber
Perhatikan bahwa forhampir selalu lebih disukai daripada whilesaat bermain golf. Pernyataan dasar adalah panjang yang sama ( while()vs for(;;)), tetapi formemberi Anda lebih banyak fleksibilitas. Dalam hal ini, Anda bisa memasukkan x=[]inisialisasi fordan menyimpan satu karakter.
mellamokb
@ellamokb, terima kasih atas tipnya :-)
Brigand
5

Javascript, 47

Karena solusi asli saya telah dikalahkan, sekarang saya akan mempostingnya.

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

Sayangnya, 0x3FF.toString(2)tidak seefisien hanya dengan menuliskan string, yang tidak seefisien hanya dengan mendeklarasikan array secara statis.

Anda dapat mengurangi satu karakter dengan cara ini ( 46 ):

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

Anda dapat menyimpan 2 karakter lebih seperti: ( 44 )

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

Solusi 44 byte lainnya menggunakan penutupan ekspresi fungsi JS 1.8 (hanya atm FF):

x=(x=[1,1,1,1,1,1,1,1,1,1]).map(function()x)
Shmiddty
sumber
1
Anda dapat menyimpan satu char dengan menginisialisasi idi aseperti ini:a=[i=10]
codeporn
4

JavaScript, 57 byte

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

Sebelum bermain golf:

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

Catatan: Ini perlu ES5, jadi jangan berharap banyak dari IE.

John Dvorak
sumber
Wow! Saya menulis eval('a=['+(b=Array(11)).join('['+b.join("1,")+'],')+']'). Selain memiliki kutipan yang berbeda dan saya memiliki variabel di dalam eval, ini persis sama
mowwwalker
2
a=eval("["+Array(11).join("[1,1,1,1,1,1,1,1,1,1],")+"]")memiliki 56
yingted
3

54

Ini sudah dikalahkan, tapi inilah solusi saya:

function x(){return[1,1,1,1,1,1,1,1,1,1]}x=x().map(x)
kojiro
sumber
Fungsi panah akan melakukan hal-hal menarik pada golf JavaScript. Sekarang seandainya saya bisa mencari cara untuk membangun Curry builtin secara sepele.
kojiro
Anda harus memasukkan x=sebelum x().map(atau y=, dll) agar dapat diakses, kan?
Shmiddty
@ Skiddiddy Ya, sangat diperbarui.
kojiro
3

39 byte

Menggunakan pemahaman array dalam ECMAScript 7:

x=[x for(y in x=[1,1,1,1,1,1,1,1,1,1])]
nderscore
sumber
Tidak ada pemahaman array di ES6, itu proposal ES7.
Afonso Matos
@afonomatos pada saat saya membuat jawaban ini, itu masih bagian dari konsep ES6. Ini diperbarui sekarang :)
nderscore
Mengganti [1,1,1,1,1,1,1,1,1,1]dengan Array(10).fill(1)mencukur 4 karakter.
Shmiddty
2

56 karakter

Jawabannya agak panjang, tetapi akan lebih baik untuk 100x100 dll.

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

Javascript, 36 karakter (ECMA 6)

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

Diuji di browser saya (Firefox di Ubuntu) dan di interpreter Javascript Codecademy

QuadmasterXLII
sumber
2

ES6, 54

Ini bukan yang terpendek, tapi saya pikir saya akan pergi untuk pendekatan yang berbeda dengan apa yang sudah ada di sini.

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

Melemparkan objek ke string. "[object Object]"
Split string menjadi chars ["[", "o", "b", ... "]"]
Ambil sepotong hanya 10
Map hasil pemetaan 1 ke slice awal

Dan Prince
sumber
Di mana saya bisa mengujinya? Tidak berfungsi dengan benar di FF saya.
Qwertiy
Namun, saya melewatkan beberapa paren karena asudah ada versi yang sepertinya berfungsi. Versi yang diperbarui harus berfungsi dalam FF dan simpul dengan flag --harmony.
Dan Prince
Sekarang mengembalikan array yang benar, tetapi tidak ditugaskan ke variabel apa pun.
Qwertiy
1

61 untuk bersenang-senang

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

Javascript - 64 63 59 karakter

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

Satu char disimpan dengan menyembunyikan iterator di array.

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

Menyimpan beberapa karakter dengan saran Jans.

Versi yang dapat dibaca:

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

Ya, ini bukan solusi terpendek, tetapi pendekatan lain tanpa menggunakan [1,1,1,1,1,1,1,1,1,1]array readymade .

codeporn
sumber
1
Ubah i-->0ke i--. Meskipun operator "downto" baik, itu tidak terlalu penting. ==0bisa dicukur oleh dua bit juga. Juga, tinggalkan var. Meskipun biasanya bermanfaat, empat byte tidak berguna hanya tidak dapat diterima di sini.
John Dvorak
0

Javascript 69 karakter (untuk saat ini)

b=[]
a=[]
for(i=100;i-->0;){
a.push(1)
if(i%10===0){b.push(a);a=[]}
}
Bobby Marinoff
sumber
0

JavaScript 73

function h(){s="1111111111",r=[10],i=-1;while(++i<10){r[i]=s.split("");}}
bacchusbeale
sumber
1
r=[10],tidak melakukan apa-apa saat Anda segera menimpa r[0]. Anda tidak perlu mendeklarasikan sdan hanya bisa melakukannya "1111111111".split("")tetapi itu adalah 22 karakter sedangkan [1,1,1,1,1,1,1,1,1,1]hanya 21 karakter.
MT0
0

Javascript ES6, 53

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

Tapi yang ada di array adalah string :)

Qwertiy
sumber
0

Javscript ES6, 53

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

JavaScript (ES6), 35 byte

A=Array(10).fill(Array(10).fill(1))
pengguna84702
sumber
1
Mengatur variabel bukanlah metode output yang disetujui. Namun, Anda dapat melakukan f=>Array(10).fill(Array(10).fill(1))(mendefinisikan fungsi anonim) selama 36 byte.
Rɪᴋᴇʀ