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.


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


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


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))

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]

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!


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)

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;);

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)

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.


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)

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])]

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

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


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


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)+"]")

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 .


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

0

JavaScript 73

function h(){s="1111111111",r=[10],i=-1;while(++i<10){r[i]=s.split("");}}

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


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
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ɪᴋᴇʀ
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.