В одной из самых знаковых полос xkcd Рэндалл Манро визуализировал временные рамки нескольких фильмов в повествовательных диаграммах:
(Нажмите для увеличения версии.)
Источник: хзкд № 657 .
Учитывая спецификацию временной шкалы фильма (или другого повествования), вы должны создать такую диаграмму. Это конкурс популярности, поэтому победит ответ, набравший наибольшее количество голосов.
Минимальные требования
Чтобы немного уточнить спецификацию, вот минимальный набор функций, которые должен реализовывать каждый ответ:
Возьмите в качестве входных данных список имен персонажей, за которым следует список событий. Каждое событие является либо списком умирающих персонажей, либо списком групп персонажей (обозначая, какие персонажи в настоящее время вместе). Вот один пример того, как повествование в Парке Юрского периода может быть закодировано:
["T-Rex", "Raptor", "Raptor", "Raptor", "Malcolm", "Grant", "Sattler", "Gennaro", "Hammond", "Kids", "Muldoon", "Arnold", "Nedry", "Dilophosaurus"] [ [[0],[1,2,3],[4],[5,6],[7,8,10,11,12],[9],[13]], [[0],[1,2,3],[4,7,5,6,8,9,10,11,12],[13]], [[0],[1,2,3],[4,7,5,6,8,9,10],[11,12],[13]], [[0],[1,2,3],[4,7,5,6,9],[8,10,11,12],[13]], [[0,4,7],[1,2,3],[5,9],[6,8,10,11],[12],[13]], [7], [[5,9],[0],[4,6,10],[1,2,3],[8,11],[12,13]], [12], [[0, 5, 9], [1, 2, 3], [4, 6, 10, 8, 11], [13]], [[0], [5, 9], [1, 2], [3, 11], [4, 6, 10, 8], [13]], [11], [[0], [5, 9], [1, 2, 10], [3, 6], [4, 8], [13]], [10], [[0], [1, 2, 9], [5, 6], [3], [4, 8], [13]], [[0], [1], [9, 5, 6], [3], [4, 8], [2], [13]], [[0, 1, 9, 5, 6, 3], [4, 8], [2], [13]], [1, 3], [[0], [9, 5, 6, 3, 4, 8], [2], [13]] ]
Например, первая строка означает, что в начале графика T-Rex - одинокий, три Раптора - вместе, Малкольм - один, Грант и Саттлер - вместе, и т. Д. Со второго по последнее событие означает, что два из Хищников умирают ,
Насколько точно вы ожидаете, что ввод зависит от вас, пока эта информация может быть указана. Например, вы можете использовать любой удобный формат списка. Вы также можете ожидать, что символы в событиях снова будут полными именами символов и т. Д.
Вы можете (но не обязаны) предполагать, что каждый список групп содержит каждого живого персонажа ровно в одной группе. Однако, следует не считать , что группы или символы в пределах одного события в особенно удобном порядке.
Визуализируйте на экране или в файле (в виде векторной или растровой графики) диаграмму, которая имеет одну строку для каждого символа. Каждая строка должна быть помечена именем персонажа в начале строки.
- Для каждого нормального события должен быть по порядку некоторый поперечный разрез диаграммы, в котором группы символов четко напоминают близость их соответствующих линий.
- Для каждого события смерти строки соответствующих символов должны заканчиваться видимым большим двоичным объектом.
- Вам не нужно воспроизводить какие-либо другие особенности сюжетов Рэндалла, а также не нужно воспроизводить его стиль рисования. Прямые линии с резкими поворотами, все в черном, без дальнейших надписей и заголовка, прекрасно подходят для участия в конкурсе. Также нет необходимости эффективно использовать пространство - например, вы могли бы потенциально упростить свой алгоритм, только перемещая линии вниз, чтобы встретиться с другими персонажами, если есть различимое направление времени.
Я добавил эталонное решение, которое точно соответствует этим минимальным требованиям.
Делая это довольно
Это конкурс популярности, так что, помимо этого, вы можете реализовать все, что захотите. Наиболее важным дополнением является приличный алгоритм компоновки, который делает диаграмму более разборчивой, например, которая позволяет легко отслеживать изгибы линий и уменьшает количество необходимых пересечений линий. Это основная алгоритмическая проблема этой задачи! Голоса решат, насколько хорошо ваш алгоритм работает в чистоте на графике.
Но вот еще несколько идей, большинство из которых основаны на диаграммах Рэндалла:
Украшения:
- Цветные линии.
- Название для сюжета.
- Маркировка заканчивается.
- Автоматически перемаркирующие линии, которые прошли через занятый участок.
- Стиль, нарисованный от руки (или другой? Как я уже сказал, нет необходимости воспроизводить стиль Рэндалла, если у вас есть идея получше) для линий и шрифтов.
- Настраиваемая ориентация оси времени.
Дополнительная выразительность:
- Названные события / группы / смерти.
- Исчезающие и вновь появляющиеся линии.
- Персонажи входят поздно.
- Выделены, которые указывают (переносимые?) Свойства символов (например, см. Несущий кольцо на диаграмме LotR).
- Кодирование дополнительной информации по оси группировки (например, географическая информация, как на графике LotR).
- Путешествие во времени?
- Альтернативные реалии?
- Персонаж превращается в другого?
- Два персонажа сливаются? (Расщепление персонажа?)
- 3D? (Если вы действительно зашли так далеко, пожалуйста, убедитесь, что вы действительно используете дополнительное измерение для визуализации чего-то!)
- Любые другие важные функции, которые могут быть полезны для визуализации повествования фильма (или книги и т. Д.).
Конечно, многие из них потребуют дополнительного ввода, и вы можете при необходимости расширять свой формат ввода, но, пожалуйста, задокументируйте, как можно вводить данные.
Пожалуйста, включите один или два примера, чтобы продемонстрировать реализованные вами функции.
Ваше решение должно быть в состоянии справиться с любым действительным вкладом, но совершенно нормально, если оно лучше подходит для одних видов повествований, чем для других.
Критерии голосования
У меня нет иллюзий, что я могу рассказать людям, как они должны тратить свои голоса, но вот некоторые предлагаемые рекомендации в порядке важности:
- Downvote ответы, которые используют лазейки, стандартные или другие, или жестко закодировать один или несколько результатов.
- Не голосуйте за ответы, которые не отвечают минимальным требованиям (какими бы необычными они не были).
- Прежде всего, поддержите хорошие алгоритмы компоновки. Это включает ответы, которые не используют много вертикального пространства при минимизации пересечения линий, чтобы сохранить четкость графика, или которым удается закодировать дополнительную информацию по вертикальной оси. Визуализация группировок без большого беспорядка должна быть главной целью этой задачи, так что это остается соревнованием по программированию с интересной алгоритмической проблемой в глубине души.
- Upvote дополнительные функции, которые добавляют выразительную силу (то есть не просто украшение).
- Наконец, upvote хорошая презентация.
[[x,y,z]]
означало бы , что все символы в настоящее время вместе. Но если событие не содержит списков, а только символы напрямую, это даже смерть, поэтому в той же ситуации [x,y,z]
эти три символа умирают. Не стесняйтесь использовать другой формат, с явным указанием того, является ли что-то смертью или групповым событием, если это вам помогает. Приведенный выше формат является лишь предложением. Пока ваш формат ввода по крайней мере столь же выразителен, вы можете использовать что-то еще.