Javascript: Tạo một mảng 10 x 10 giây


18

Rõ ràng thách thức này sẽ không đáng kể với các chức năng và thư viện riêng biệt, vì vậy chúng không được phép.

Mã của bạn phải tuân theo một đặc tả ECMAscript (bất kỳ thông số kỹ thuật nào cũng được), vì vậy không có câu trả lời dành riêng cho trình duyệt.

Các mảng phải có thể truy cập sau khi nó được khởi tạo.

Tôi có một câu trả lời mà tôi sẽ giữ lại bây giờ.

Lưu ý: thách thức này là dành riêng cho javascript vì nó rất bất tiện khi tạo các mảng đa chiều trong javascript.


Tôi có 57 ký tự. Đây có phải là một điểm tốt?
John Dvorak

Ok, chắc chắn là không :-)
John Dvorak

15
Bạn có chắc chắn không chỉ muốn mảng 1x1 đẹp này trong 10 giây không? [10]
kojiro

8
Đó sẽ là [[10]]?
kéo dài

Câu trả lời:


10

Javascript ES6, 30

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

ES6 đang hoạt động :)


2
Xin chào, câu hỏi này giống như 2 tuổi. Có lẽ việc sử dụng tốt hơn các kỹ năng chơi gôn mã JS của bạn để trả lời các câu hỏi gần đây hơn;)
George

6
@George Tôi không nghĩ có gì sai khi trả lời những thách thức cũ. (Một số tác giả thử thách cũng sẽ cập nhật câu trả lời được chấp nhận nếu có người chiến thắng mới xuất hiện, bất kể thử thách đó bao nhiêu tuổi.)
Martin Ender

2
@ MartinBüttner Câu trả lời này không dễ hiểu vì được chấp nhận vì ES6 trẻ hơn (đến năm 2015 :)) so với thử thách này và Array.fill () chỉ là ES6 :)
Katenkyo

Tôi chỉ trả lời vì tôi thấy các câu trả lời ES6 khác. Tôi không nghĩ có gì sai với điều này. Tác giả có thể cập nhật câu hỏi của mình và những người khác có thể tận dụng nhiều cách để giải quyết vấn đề ở trên.
Afonso Matos

ES6 đã được chấp nhận từ lâu trước khi dự thảo của nó thực sự bị đóng băng (đó là vào năm 2015, một vài ngày trước). Tôi không chắc chắn cho dù đó là chính xác hay không chính xác.
Tối ưu hóa

27

Javascript, 34 byte

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

Vì rõ ràng OK để làm cho các hàng bằng nhau bằng tham chiếu, tôi đoán rằng rõ ràng là ổn khi dựa vào thực tế đó. Điều này giúp chúng ta loại bỏ một vòng lặp for bằng cách xây dựng bảng cùng lúc với các hàng của nó. Vì vậy, đây là thí sinh mới của tôi.

r[0]b[0]được ghi đè trong vòng lặp, chúng có thể chứa rác. Điều này cho chúng ta một vị trí thực thi miễn phí khác để cạo một số dấu phẩy. Đáng buồn thay, r=b=[]sẽ không làm, kể từ đó họ bằng nhau.

Ngoài ra, nó có tỷ lệ tốt (99x99 vẫn là 34 byte), không yêu cầu ES5 (các chức năng mới có tên rất dài, dù sao) và như một phần thưởng, không thể đọc được :-)


3
Xinh đẹp. Tuyệt đẹp.
Briguy37

1
Chết tiệt, tôi đã kết thúc với : c=[b=[i=10]];while(i--)b[i]=c,c[i]=1. Nên biết!!!
mowwwalker

19

ECMAScript 6 - 33 ký tự

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

Xuất ra một mảng 10 x 10 "s".

Điều này lạm dụng thực tế là chuỗi "1111111111" có tất cả các thuộc tính cần thiết được xử lý như thể nó là một mảng để bạn có thể sử dụng toán tử trải ...để biến nó thành một mảng các ký tự và sau đó ánh xạ nó thành một bản sao của mảng với mỗi yếu tố tham chiếu "bản gốc".

Hoặc chỉ có một tên biến (cho 35 ký tự):

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

Hoặc để thêm nhầm lẫn (nhưng ở 45 ký tự)

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

hoặc (43 ký tự)

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

Lạm dụng tốt đẹp của các ...nhà điều hành!
nderscore

13

44 byte

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

Phiên bản trước:

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

Cập nhật rất thông minh!
Shmiddty

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

1
@AmericanUmlaut không hoạt động
sao chép

1
Tôi thích ^cho!=
John Dvorak

13

45 ký tự

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

Mỗi phần tử trỏ đến cùng một mảng, nhưng thông số kỹ thuật không đề cập bất cứ điều gì chống lại điều đó!


4
thông số kỹ thuật nói rằng "Mảng phải có thể truy cập được sau khi nó được khởi tạo." . Tôi đoán điều đó có nghĩa là bạn nên có thêm một khoản x=đầu vào lúc đầu
Cristian Lupascu

tuy nhiên một giải pháp rất hay (+1)
Cristian Lupascu

Điều đó không thực tế lắm mặc dù việc thay đổi giá trị sẽ phản ánh trên tất cả các mảng.
Gabriele Petrioli

7

Javascript, 51

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

Hoặc nếu tất cả các chỉ mục được phép trỏ đến cùng một mảng:

Javascript, 41

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

Tất cả các chỉ số bây giờ đều trỏ đến cùng một cột, điều này có thể không mong muốn. (Thử a[0][1] = 5; console.log(a[1][1])).
sao chép

Vâng, tôi đã không nhìn thấy điều đó. Tôi đã cập nhật câu trả lời của mình.
grc

6

JavaScript, 45 44 byte

Tốt nhất tôi có cho đến nay. (Vẫn đang cố gắng).

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

Ngắn hơn (cảm ơn mellamokb!)

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

Lưu ý rằng forhầu như luôn luôn thích hợp hơn whilekhi chơi golf. Câu lệnh cơ bản có cùng độ dài ( while()vs for(;;)), nhưng forcho phép bạn linh hoạt hơn. Trong trường hợp này, bạn có thể đặt x=[]trình khởi tạo forvà lưu một ký tự.
mellamokb

@mellamokb, cảm ơn vì tiền boa :-)
Brigand

5

Javascript, 47

Vì giải pháp ban đầu của tôi đã bị đánh bại, bây giờ tôi sẽ đăng nó.

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

Thật không may, 0x3FF.toString(2)không hiệu quả bằng việc chỉ liệt kê chuỗi ra, điều này không hiệu quả bằng việc khai báo mảng một cách tĩnh.

Bạn có thể cạo một ký tự theo cách này ( 46 ):

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

Bạn có thể lưu thêm 2 ký tự như vậy: ( 44 )

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

Một giải pháp 44 byte khác sử dụng đóng biểu thức hàm JS 1.8 (chỉ FF atm):

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

1
Bạn có thể tiết kiệm một char bằng cách khởi tạo itrong anhư thế này:a=[i=10]
codeporn

4

JavaScript, 57 byte

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

Trước khi chơi golf:

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

Lưu ý: Điều này cần ES5, vì vậy đừng mong đợi nhiều từ IE.


Ồ Tôi đã viết eval('a=['+(b=Array(11)).join('['+b.join("1,")+'],')+']'). Ngoài việc có các trích dẫn khác nhau và tôi có biến trong eval, chúng hoàn toàn giống nhau
mowwwalker

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

3

54

Điều này đã bị đánh bại, nhưng đây là giải pháp của tôi:

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

Các hàm mũi tên sẽ làm những điều thú vị để chơi golf JavaScript. Bây giờ nếu tôi chỉ có thể tìm ra cách xây dựng Curry tầm thường.
kojiro

Bạn cần phải chèn x=trước x().map(hoặc y=, v.v.) để làm cho nó có thể truy cập được, phải không?
Shmiddty

@Schmiddty Có, cập nhật.
kojiro

3

39 byte

Sử dụng hiểu mảng trong ECMAScript 7:

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

Không có sự hiểu biết mảng trong ES6, đó là một đề xuất ES7.
Afonso Matos

@afonsomatos tại thời điểm tôi đưa ra câu trả lời này, nó vẫn là một phần của dự thảo ES6. Nó được cập nhật ngay bây giờ :)
nderscore

Thay thế [1,1,1,1,1,1,1,1,1,1]bằng Array(10).fill(1)cạo 4 chars.
Shmiddty

2

56 ký tự

Câu trả lời khá dài, nhưng sẽ tốt hơn cho 100x100, v.v.

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

2

Javascript, 36 ký tự (ECMA 6)

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

Đã thử nghiệm trong trình duyệt của tôi (Firefox trên Ubuntu) và trong trình thông dịch Javascript Codecademy


2

ES6, 54

Nó không phải là ngắn nhất, nhưng tôi nghĩ tôi sẽ tìm một cách tiếp cận khác với những gì đã có ở đây.

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

Truyền một đối tượng thành một chuỗi "[object Object]"
Chia chuỗi thành các ký tự ["[", "o", "b", ... "]"]
Lấy một lát chỉ 10
Ánh xạ kết quả ánh xạ 1 lên lát cắt ban đầu


Tôi có thể kiểm tra nó ở đâu? Nó không hoạt động ngay trong FF của tôi.
Qwertiy

Tôi đã bỏ lỡ một số parens, tuy nhiên, vì ađã tồn tại phiên bản đó dường như đã hoạt động. Phiên bản cập nhật sẽ hoạt động trong FF và nút có cờ --harmony.
Dan Prince

Bây giờ nó trả về mảng bên phải, nhưng nó không được gán cho bất kỳ biến nào.
Qwertiy


0

Javascript - 64 63 59 ký tự

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

Một char được lưu bằng cách ẩn iterator trong mảng.

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

Lưu một số ký tự với đề xuất Jans.

Phiên bản dễ đọc:

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

Vâng, đó không phải là giải pháp ngắn nhất, mà là một cách tiếp cận khác mà không sử dụng [1,1,1,1,1,1,1,1,1,1]mảng readymade .


1
Thay đổi i-->0thành i--. Mặc dù toán tử "dowo" là tốt, nhưng nó không thực sự cần thiết. ==0cũng có thể được cạo đi bởi hai bit. Ngoài ra, bỏ đi var. Mặc dù thông thường hữu ích, bốn byte vô dụng chỉ không được chấp nhận ở đây.
John Dvorak

0

Javascript 69 ký tự (hiện tại)

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],không làm gì khi bạn ghi đè ngay lập tức r[0]. Bạn không cần phải khai báo svà chỉ có thể làm "1111111111".split("")nhưng đó là 22 ký tự trong khi [1,1,1,1,1,1,1,1,1,1]chỉ có 21 ký tự.
MT0

0

Javascript ES6, 53

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

Nhưng những cái trong mảng là chuỗi :)


0

Javs ES6, 53

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

0

JavaScript (ES6), 35 byte

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

1
Đặt một biến không phải là một phương thức đầu ra được phê duyệt. Tuy nhiên, bạn có thể làm f=>Array(10).fill(Array(10).fill(1))(xác định hàm ẩn danh) cho 36 byte.
Rɪᴋᴇʀ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.