Javascript: создать массив 1x размером 10x10

18

Очевидно, что эта задача будет тривиальной с отдельными функциями и библиотеками, поэтому они не допускаются.

Ваш код должен соответствовать спецификации ECMAscript (подойдет любая спецификация), поэтому нет ответов, специфичных для браузера.

Массив должен быть доступен после его создания.

У меня есть ответ, который я пока воздержусь.

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

Shmiddty
источник
Я на 57 символов. Это хороший результат?
Джон Дворак
Хорошо, определенно нет :-)
Джон Дворак
15
Вы уверены, что вам не нужен этот симпатичный массив 10х 1х1? [10]
Кодзиро
8
Это будет [[10]]?
Yingted

Ответы:

10

Javascript ES6, 30

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

ES6 в действии :)

Афонсо Матос
источник
2
Привет, этот вопрос как 2 года. Вероятно, лучше использовать свои навыки игры в гольф в JS-коде, чтобы ответить на более свежие вопросы;)
Джордж
6
@ Джордж Я не думаю, что есть что-то не так с ответом на старые вызовы. (Некоторые авторы заданий также обновят принятый ответ, если придет новый победитель, независимо от того, сколько лет заданию.)
Мартин Эндер
2
@ MartinBüttner Этот ответ непонятен тем, что его приняли, поскольку ES6 моложе (это произошло в 2015 году :)), чем этот вызов, а Array.fill () - только ES6 :)
Katenkyo,
Я просто ответил, потому что я видел другие ответы ES6 тоже. Я не думаю, что с этим что-то не так. Автор может обновить свой вопрос, а другие могут воспользоваться несколькими способами решения вышеуказанной проблемы.
Афонсу Матос,
ES6 был принят задолго до того, как его черновой вариант был заморожен (то есть в 2015 году, несколько дней назад). Я не уверен, правда ли это правильно или неправильно.
Оптимизатор
27

Javascript, 34 байта

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

Поскольку, по-видимому, можно сделать строки равными по ссылке, я полагаю, что можно полагаться на этот факт. Это помогает нам избавиться от одного цикла for, создавая таблицу одновременно с ее строками. Итак, вот мой новый участник.

Поскольку 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)

Выводит массив «1» размером 10x10.

Это нарушает тот факт, что строка «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))
mt0
источник
Приятное оскорбление ...оператора!
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]
копия
источник
Очень умное обновление!
Шмиддти
для (a = [i = 9]; i;) a [i -] = [1,1,1,1,1,1,1,1,1,1]
AmericanUmlaut
1
@AmericanUmlaut, который не работает
скопируйте
1
Мне нравится ^за!=
Джон Дворак
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)
GRC
источник
Все индексы теперь указывают на один и тот же столбец, что, вероятно, нежелательно. (Попробуй 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);

Короче (спасибо, мелламокб!)

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

x=(x=[1,1,1,1,1,1,1,1,1,1]).map(function()x)
Shmiddty
источник
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)
Кодзиро
источник
Функции стрелок сделают интересные вещи для игры в гольф на JavaScript. Теперь, если бы я только мог понять, как тривиально встроить карри.
Кодзиро
Вам нужно было вставить x=до x().map(или y=и т. Д.), Чтобы сделать его доступным, верно?
Шмиддти
@Schmiddty Да, так что обновлено.
Кодзиро
3

39 байт

Использование понимания массива в ECMAScript 7:

x=[x for(y in x=[1,1,1,1,1,1,1,1,1,1])]
nderscore
источник
В ES6 нет понимания массива, это предложение ES7.
Афонсу Матос
@afonsomatos, когда я сделал этот ответ, он все еще был частью проекта ES6. Это обновляется сейчас, хотя :)
nderscore
Замена [1,1,1,1,1,1,1,1,1,1]с Array(10).fill(1)бритья 4 знака.
Шмиддты
2

56 символов

Довольно длинный ответ, но будет лучше для 100х100 и т. Д.

for(a=[[i=k=0]];++i<100;m?0:a[k=i/10]=[1])a[k][m=i%10]=1
XzKto
источник
2

Javascript, 36 символов (ECMA 6)

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

Протестировано в моем браузере (Firefox на Ubuntu) и в интерпретаторе Codecademy Javascript

QuadmasterXLII
источник
2

ES6, 54

Это не самое короткое, но я подумал, что пойду по-другому, к тому, что уже здесь.

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

Привести объект к строке. "[object Object]"
Разделить строку на символы ["[", "o", "b", ... "]"].
Получить фрагмент из 10 символов. Отобразить
результат отображения 1 на начальный фрагмент.

Дэн Принц
источник
Где я могу это проверить? Это не работает прямо в моем FF.
Qwertiy
Однако я пропустил несколько паренов, потому что aуже существовала эта версия, которая, казалось, работала. Обновленная версия должна работать в FF и узле с флагами --harmony.
Дэн Принс
Теперь он возвращает правильный массив, но он не назначен ни одной переменной.
Qwertiy
1

61 для развлечения

eval("r=["+("["+(Array(11).join("1,"))+"],").repeat(11)+"]")
Максим Е
источник
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]массивов.

codeporn
источник
1
Изменить i-->0на i--. Оператор downto хорош, но на самом деле это не обязательно. ==0может быть сбрита на два бита, а также. Кроме того, пропустите var. Хотя обычно это полезно, четыре бесполезных байта здесь просто неприемлемы.
Джон Дворак
0

Javascript 69 символов (на данный момент)

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("");}}
bacchusbeale
источник
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(""))

Но в массиве есть строки :)

Qwertiy
источник
0

Javscript ES6, 53

x=eval("["+("["+"1,".repeat(10)+"],").repeat(10)+"]")
Qwertiy
источник
0

JavaScript (ES6), 35 байт

A=Array(10).fill(Array(10).fill(1))
user84702
источник
1
Установка переменной не является утвержденным методом вывода. Тем не менее, вы можете сделать f=>Array(10).fill(Array(10).fill(1))(определение анонимной функции) для 36 байтов.
августа