Выразительный JavaScript (Хавербеке) - страница 69

), и убеждаться, что результирующая ячейка имеет как минимум заданные ширину и высоту, даже если внутренняя ячейка – меньше.

>// Ваш код.


>var sc = new StretchCell(new TextCell("abc"), 1, 2);

>console.log(sc.minWidth());

>// → 3

>console.log(sc.minHeight());

>// → 2

>console.log(sc.draw(3, 2));

>// → ["abc", "   "]

Интерфейс к последовательностям

Разработайте интерфейс, абстрагирующий проход по набору значений. Объект с таким интерфейсом представляет собой последовательность, а интерфейс должен давать возможность в коде проходить по последовательности, работать со значениями, которые её составляют, и как-то сигнализировать о том, что мы достигли конца последовательности.

Задав интерфейс, попробуйте сделать функцию >logFive, которая принимает объект-последовательность и вызывает >console.log для первых её пяти элементов – или для меньшего количества, если их меньше пяти.

Затем создайте тип объекта >ArraySeq, оборачивающий массив, и позволяющий проход по массиву с использованием разработанного вами интерфейса. Создайте другой тип объекта, >RangeSeq, который проходит по диапазону чисел (его конструктор должен принимать аргументы >from и >to).

>// Ваш код.


>logFive(new ArraySeq([1, 2]));

>// → 1

>// → 2

>logFive(new RangeSeq(100, 1000));

>// → 100

>// → 101

>// → 102

>// → 103

>// → 104

7. Проект: электронная жизнь

Вопрос о том, могут ли машины думать, так же уместен, как вопрос о том, могут ли подводные лодки плавать.

Эдсгер Дейкстра, «Угрозы вычислительной науке»

В главах-проектах я перестану закидывать вас теорией, и буду работать вместе с вами над программами. Теория незаменима при обучении программированию, но она должна сопровождаться чтением и пониманием нетривиальных программ.

Наш проект – постройка виртуальной экосистемы, небольшого мира, населённого существами, которые двигаются и борются за выживание.

Определение

Чтобы задача стала выполнимой, мы кардинально упростим концепцию мира. А именно – мир будет двумерной сеткой, где каждая сущность занимает одну клетку. На каждом ходу существа получат возможность выполнить какое-либо действие.

Таким образом, мы порубим время и пространство на единицы фиксированного размера: клетки для пространства и ходы для времени. Конечно, это грубое и неаккуратное приближение. Но наша симуляция должна быть развлекательной, а не аккуратной, поэтому мы свободно «срезаем углы».

Определить мир мы можем при помощи плана – массива строк, который раскладывает мировую сетку, используя один символ на клетку.

>var plan = ["############################",

>            "#      #    #      o      ##",