Javascript: สร้างอาร์เรย์ 10x10 จำนวน 1 วินาที


18

เห็นได้ชัดว่าความท้าทายนี้จะไม่สำคัญกับฟังก์ชั่นและไลบรารีแยกต่างหากดังนั้นจึงไม่ได้รับอนุญาต

รหัสของคุณจะต้องเป็นไปตามข้อกำหนด ECMAscript (ข้อกำหนดเฉพาะใด ๆ ) ดังนั้นจึงไม่มีคำตอบเฉพาะสำหรับเบราว์เซอร์

อาร์เรย์ต้องสามารถเข้าถึงได้หลังจากอินสแตนซ์นั้น

ฉันมีคำตอบที่ฉันจะระงับในตอนนี้

หมายเหตุ:ความท้าทายนี้มีเฉพาะกับจาวาสคริปต์เพราะไม่สะดวกที่จะสร้างอาร์เรย์หลายมิติในจาวาสคริปต์


ฉันอยู่ที่ 57 ตัวอักษร นี่เป็นคะแนนที่ดีหรือไม่?
John Dvorak

ตกลงไม่แน่นอน :-)
John Dvorak

15
คุณแน่ใจหรือไม่ว่าคุณไม่ต้องการอาร์เรย์ 1x1 อันยอดเยี่ยมนี้ [10]
kojiro

8
นั่นจะเป็น[[10]]อย่างไร
yingted

คำตอบ:


10

Javascript ES6, 30

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

การทำงาน ES6 :)


2
สวัสดีคำถามนี้เหมือน 2 ปี อาจเป็นการใช้ทักษะการเล่นกอล์ฟรหัส JS ของคุณได้ดีขึ้นเพื่อตอบคำถามเมื่อเร็ว ๆ นี้;)
George

6
@ George ฉันไม่คิดว่าจะมีอะไรผิดปกติกับการตอบคำถามท้าทายเก่า ๆ (ผู้ประพันธ์ท้าทายบางคนจะอัปเดตคำตอบที่ได้รับการยอมรับหากผู้ชนะคนใหม่เข้ามาไม่ว่าความท้าทายจะมีอายุเท่าไร)
Martin Ender

2
@ MartinBüttnerคำตอบนี้ไม่ฉลาดพอที่จะยอมรับว่า ES6 อายุน้อยกว่า (มาในปี 2015 :)) มากกว่าความท้าทายนี้และ Array.fill () เป็น ES6 เท่านั้น :)
Katenkyo

ฉันเพิ่งตอบเพราะฉันเห็นคำตอบ ES6 อื่น ๆ ด้วย ฉันไม่คิดว่าจะมีอะไรผิดปกติกับเรื่องนี้ ผู้เขียนอาจอัปเดตคำถามของเขาและคนอื่น ๆ อาจใช้ประโยชน์จากการแก้ปัญหาหลายวิธีด้านบน
Afonso Matos

ES6 ได้รับการยอมรับมานานก่อนที่ร่างของตนจะถูกแช่แข็ง (นั่นคือในปี 2558 ไม่กี่วันก่อน) ฉันไม่แน่ใจว่าสิ่งนั้นถูกต้องหรือไม่ถูกต้อง
เครื่องมือเพิ่มประสิทธิภาพ

27

Javascript, 34 ไบต์

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

เห็นได้ชัดว่ามันก็โอเคที่จะทำให้แถวเท่ากันโดยการอ้างอิงฉันคิดว่ามันโอเคที่จะพึ่งพาข้อเท็จจริงนั้น สิ่งนี้ช่วยให้เราสามารถกำจัดการวนรอบหนึ่งโดยการสร้างตารางในเวลาเดียวกันกับแถวของมัน ดังนั้นนี่คือผู้แข่งขันรายใหม่ของฉัน

ตั้งแต่ r[0]และb[0]ถูกเขียนทับในระหว่างการวนรอบพวกเขาสามารถมีขยะ สิ่งนี้ทำให้เรามีช่องการดำเนินการฟรีอีกหนึ่งช่องเพื่อกำจัดคอมม่า น่าเศร้าที่r=b=[]จะไม่ทำเช่นนั้นเพราะพวกเขาเท่าเทียมกันโดยอ้างอิง

นอกจากนี้มันมีขนาดที่ดี (99x99 ยังคงเป็น 34 ไบต์) ไม่จำเป็นต้องใช้ ES5 (ฟังก์ชั่นใหม่มีชื่อยาวมาก ๆ ) และเป็นโบนัสมันไม่สามารถอ่านได้ :-)


3
สวย. สวยงามอย่างแน่นอน
Briguy37

1
c=[b=[i=10]];while(i--)b[i]=c,c[i]=1ประณามฉันจบลงด้วย: น่าจะรู้ !!!
mowwwalker

19

ECMAScript 6 - 33 ตัวอักษร

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

ส่งออกอาร์เรย์ 10x10 ของ "1" s

สิ่งนี้เป็นการละเมิดความจริงที่ว่าสตริง "1111111111" มีคุณสมบัติที่จำเป็นทั้งหมดที่ต้องปฏิบัติเสมือนเป็นอาร์เรย์ดังนั้นคุณจึงสามารถใช้ตัวดำเนินการสเปรด...เพื่อแปลงมันเป็นอาร์เรย์ของตัวละครแล้วจึงจับคู่กับสำเนาของอาร์เรย์ด้วย แต่ละองค์ประกอบที่อ้างอิงถึง "ต้นฉบับ"

หรือมีชื่อตัวแปรเดียวเท่านั้น (สำหรับ 35 ตัวอักษร):

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

หรือเพิ่มความสับสน (แต่ไม่เกิน 45 ตัวอักษร)

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

หรือ (43 ตัวอักษร)

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

การละเมิดที่ดีของ...ผู้ประกอบการ!
nderscore

13

44 ไบต์

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

รุ่นก่อนหน้า:

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

การปรับปรุงที่ฉลาดมาก!
Shmiddty

สำหรับ (a = [i = 9]; i;) a [i -] = [1,1,1,1,1,1,1,1,1,1,1]
AmericanUmlaut

1
@AmericanUmlaut ที่ใช้งานไม่ได้
คัดลอก

1
ผมชอบ^สำหรับ!=
จอห์น Dvorak

13

45 ตัวอักษร

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

แต่ละองค์ประกอบชี้ไปที่อาเรย์เดียวกัน แต่สเป็คไม่ได้พูดถึงสิ่งใดต่อ!


4
ข้อมูลจำเพาะบอกว่า"อาร์เรย์ต้องสามารถเข้าถึงได้หลังจากอินสแตนซ์แล้ว" . ฉันเดาว่านั่นหมายความว่าคุณควรมีสิ่งพิเศษx=ในตอนแรก
Cristian Lupascu

วิธีแก้ปัญหาที่ดีมาก (+1)
Cristian Lupascu

ที่ไม่เป็นประโยชน์มากแม้ว่าการเปลี่ยนแปลงค่าจะสะท้อนให้เห็นในอาร์เรย์ทั้งหมด
Gabriele Petrioli

7

Javascript, 51

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

หรือถ้าดัชนีทั้งหมดได้รับอนุญาตให้ชี้ไปที่อาร์เรย์เดียวกัน:

Javascript, 41

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

ดัชนีทั้งหมดชี้ไปที่คอลัมน์เดียวกันซึ่งอาจไม่ต้องการ (ลองa[0][1] = 5; console.log(a[1][1]))
คัดลอก

ใช่ฉันไม่เห็นว่า ฉันอัพเดตคำตอบแล้ว
grc

6

JavaScript, 45 44 ไบต์

ดีที่สุดที่ฉันมี (ยังพยายามอยู่)

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

สั้นลง (ขอบคุณ mellamokb!)

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

โปรดทราบว่าforเกือบจะดีกว่าwhileเมื่อเล่นกอล์ฟ ข้อความพื้นฐานคือความยาวเท่ากัน ( while()vs for(;;)) แต่forให้ความยืดหยุ่นมากกว่า ในกรณีนี้คุณสามารถใส่x=[]initializer ของforและบันทึกหนึ่งตัวอักษร
mellamokb

@mellamokb ขอบคุณสำหรับเคล็ดลับ :-)
โจร

5

Javascript, 47

เนื่องจากโซลูชันดั้งเดิมของฉันถูกตีฉันจะโพสต์ทันที

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

น่าเสียดายที่0x3FF.toString(2)ไม่มีประสิทธิภาพมากพอ ๆ กับการแสดงรายการสตริงออกซึ่งไม่ค่อยมีประสิทธิภาพเท่าการประกาศอาร์เรย์แบบสแตติก

คุณสามารถกำจัดตัวละครตัวหนึ่งด้วยวิธีนี้ ( 46 ):

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

คุณสามารถบันทึกได้อีก 2 ตัวอักษรดังนี้: ( 44 )

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

โซลูชัน 44 ไบต์อื่นที่ใช้การปิดฟังก์ชันนิพจน์ JS 1.8 (FF only atm):

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

1
คุณสามารถบันทึกหนึ่งอักขระโดยเริ่มต้นiในaลักษณะนี้:a=[i=10]
codeporn

4

JavaScript, 57 ไบต์

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

ก่อนเล่นกอล์ฟ:

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

หมายเหตุ: นี่ต้องใช้ ES5 ดังนั้นอย่าคาดหวังมากจาก IE


ว้าว! eval('a=['+(b=Array(11)).join('['+b.join("1,")+'],')+']')ที่ผมเขียน นอกเหนือจากการมีคำพูดที่แตกต่างกันและการมีตัวแปรใน eval ของฉันเหล่านี้เป็นสิ่งเดียวกัน
mowwwalker

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

3

54

สิ่งนี้ถูกตีแล้ว แต่นี่เป็นวิธีแก้ปัญหาของฉัน:

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

ฟังก์ชั่นลูกศรจะทำสิ่งที่น่าสนใจสำหรับจาวาสคริปต์กอล์ฟ ตอนนี้ถ้าฉันเท่านั้นที่สามารถคิดได้ว่าจะสร้างแกงเล็ก ๆ น้อย ๆ
kojiro

คุณต้องแทรกx=ก่อนx().map(หรือy=ฯลฯ ) เพื่อให้สามารถเข้าถึงได้ใช่ไหม
Shmiddty

@Schmiddty ใช่อัปเดตแล้ว
kojiro

3

39 ไบต์

ใช้ความเข้าใจอาร์เรย์ใน ECMAScript 7:

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

ไม่มีความเข้าใจในอาร์เรย์ใน ES6 นั่นคือข้อเสนอ ES7
Afonso Matos

@ afonsomatos ในขณะที่ฉันตอบคำถามนี้มันยังคงเป็นส่วนหนึ่งของร่าง ES6 มันได้รับการปรับปรุงแล้วในขณะนี้ :)
nderscore

แทนที่[1,1,1,1,1,1,1,1,1,1]ด้วยArray(10).fill(1)โกน 4 ตัวอักษร
Shmiddty

2

56 ตัวอักษร

ค่อนข้างยาวคำตอบ แต่จะดีกว่าสำหรับ 100x100 เป็นต้น

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

2

Javascript, 36 ตัวอักษร (ECMA 6)

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

ทดสอบในเบราว์เซอร์ของฉัน (Firefox บน Ubuntu) และในล่าม Javascript Codecademy


2

ES6, 54

มันไม่ได้สั้นที่สุด แต่ฉันคิดว่าฉันจะหาวิธีที่แตกต่างสำหรับสิ่งที่มีอยู่แล้วที่นี่

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

โยนวัตถุเป็นสตริง"[object Object]"
แบ่งสตริงออกเป็นตัวอักษร ["[", "o", "b", ... "]"]
คว้าชิ้นเพียง 10
แผนที่ผลลัพธ์ของการแมป 1 ลงบนชิ้นเริ่มต้น


ฉันจะทดสอบได้ที่ไหน มันไม่ทำงานใน FF ของฉัน
Qwertiy

ฉันพลาดบาง parens แต่เนื่องจากaมีอยู่แล้วรุ่นที่ดูเหมือนจะทำงาน เวอร์ชันที่อัปเดตควรทำงานใน FF และโหนดด้วยแฟล็ก --harmony
ด่านเจ้าชาย

ตอนนี้มันจะส่งคืนอาร์เรย์ที่ถูกต้อง แต่ไม่ได้กำหนดให้กับตัวแปรใด ๆ
Qwertiy


0

Javascript - 64 63 59 ตัวอักษร

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

ถ่านหนึ่งตัวถูกบันทึกไว้โดยการซ่อนตัววนซ้ำในอาร์เรย์

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

บันทึกตัวอักษรบางส่วนพร้อมคำแนะนำของ Jans

รุ่นที่อ่านได้:

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

ใช่ไม่ใช่โซลูชันที่สั้นที่สุด แต่เป็นอีกวิธีหนึ่งที่ไม่ต้องใช้[1,1,1,1,1,1,1,1,1,1]อาร์เรย์สำเร็จรูป


1
เปลี่ยนไปi-->0 i--ในขณะที่โอเปอเรเตอร์ "downto" นั้นดี แต่ก็ไม่จำเป็น ==0สามารถโกนออกได้สองบิตเช่นกัน varนอกจากนี้ลาออก ในขณะที่มีประโยชน์ตามปกติสี่ไบต์ที่ไร้ประโยชน์จะไม่สามารถยอมรับได้ที่นี่
John Dvorak


0

JavaScript 73

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

1
r=[10],r[0]ไม่ทำอะไรเลยในขณะที่คุณเขียนทับได้ทันที คุณไม่จำเป็นต้องประกาศsและสามารถทำได้"1111111111".split("")แต่นั่นคือ 22 ตัวอักษรในขณะที่[1,1,1,1,1,1,1,1,1,1]มีเพียง 21 ตัวอักษร
MT0

0

Javascript ES6, 53

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

แต่สิ่งที่อยู่ในอาร์เรย์เป็นสตริง :)



0

JavaScript (ES6), 35 ไบต์

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

1
การตั้งค่าตัวแปรไม่ใช่วิธีการส่งออกที่ได้รับอนุมัติ อย่างไรก็ตามคุณสามารถทำได้f=>Array(10).fill(Array(10).fill(1))(กำหนดฟังก์ชั่นที่ไม่ระบุชื่อ) เป็น 36 ไบต์
Rɪᴋᴇʀ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.