Javascript: Створіть 10x10 масив з 1s


18

Очевидно, що цей виклик був би тривіальним з окремими функціями та бібліотеками, тому їх заборонено.

Ваш код повинен відповідати специфікації ECMAscript (будь-яка специфікація), тому відповіді, які не стосуються браузера, не мають.

Масив повинен бути доступним після його ініціації.

У мене є відповідь, яку я поки що затримаю.

Примітка: ця проблема є специфічною для javascript, оскільки, як відомо, незручно робити багатовимірні масиви в JavaScript.


Мені 57 персонажів. Це хороший бал?
Джон Дворак

Гаразд, точно ні :-)
Джон Дворак

15
Ви впевнені, що не хочете просто цього приємного масиву 1x1 з 10 секунд? [10]
kojiro

8
Це було б [[10]]?
проголосив

Відповіді:


10

Javascript ES6, 30

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

ES6 в дії :)


2
Привіт, це питання як 2 роки. Можливо, краще використовувати свої навички гольф-коду JS, щоб відповісти на новіші запитання;)
Джордж

6
@George Я не думаю, що немає нічого поганого у відповіді на старі виклики. (Деякі автори викликів також оновлять прийняту відповідь, якщо з'явиться новий переможець, незалежно від того, скільки років це виклик.)
Мартін Ендер,

2
@ MartinBüttner Цю відповідь не можна прийняти, оскільки ES6 молодший (він прийшов у 2015 році :)), ніж цей виклик, а Array.fill () - це лише ES6 :)
Katenkyo

Я просто відповів, бо бачив і інші відповіді ES6. Я не думаю, що в цьому нічого поганого. Автор може оновити своє запитання, а інші можуть скористатися кількома способами вирішення проблеми, наведеної вище.
Afonso Matos

ES6 був прийнятий задовго до того, як його проект фактично замерз (тобто у 2015 році, кілька днів тому). Я не впевнений, правда, це правильно чи неправильно.
Оптимізатор

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

45 символів

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

Кожен елемент вказує на один і той же масив, але специфікація нічого не згадує проти цього!


4
специфікація каже, що "Масив повинен бути доступний після його екземпляра". . Я думаю, це означає, що ви повинні мати додаткових x=на початку
Крістіан Лупаску

все-таки дуже приємне рішення (+1)
Крістіан Лупаску

Це не дуже практично, хоча зміна значення відображатиметься на всіх масивах.
Габріеле Петріолі

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=[]в ініціалізатор 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 атм):

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
проголошено

3

54

Це вже побили, але ось моє рішення:

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

Функції зі стрілками будуть цікаві речі для JavaScript гольфу. Тепер якби я тільки міг зрозуміти, як банально побудувати Каррі.
kojiro

Вам потрібно буде вставити x=раніше x().map(або y=тощо), щоб зробити це доступним, правда?
Шміддті

@Schmiddty Так, так оновлено.
kojiro

3

39 байт

Використання розуміння масиву в ECMAScript 7:

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

В ES6 немає розуміння масиву, це пропозиція ES7.
Афонсо Матос

@afonsomatos, коли я зробив цю відповідь, він все ще був частиною проекту ES6. Оновлено зараз, хоча :)
nderscore

Заміна [1,1,1,1,1,1,1,1,1,1]з Array(10).fill(1)голить 4 символів.
Шміддті

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 на початковий фрагмент


Де я можу це протестувати? У моєму ФФ це не працює.
Qwertiy

Однак я пропустив кілька паренів, тому що 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=[]}

Збережено декілька знаків із пропозиціями Янса.

Читаема версія:

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. Хоча зазвичай корисні, чотири непотрібні байти тут просто неприйнятні.
Джон Дворак


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ɪᴋᴇʀ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.