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


18

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

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

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

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

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


Я на 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))

Приятное оскорбление ...оператора!
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);

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

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)

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

В 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

2

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

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

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


2

ES6, 54

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

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

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


Где я могу это проверить? Это не работает прямо в моем FF.
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 байтов.
августа
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.