3D-движок, написанный на формулах MS Excel

https://www.gamasutra.com/blogs/CBel/20180208/308549/3D_engine_entirely_made_of_MS_Excel_formulae__Enjoy_this_Doomxls_file_.php
  • Перевод

Скриншот экрана игры

Эта статья посвящена тому, как я смог написать 3D-движок только на формулах Excel. Я реализовал следующий функционал:

  • бесконечная процедурно генерируемая карта лабиринта
  • рендеринг трассировкой лучей в реальном времени
  • вычисление окклюзии
  • рендеринг простейшего освещения
  • шейдер освещения и вычислений
  • движок естественного движения
  • в 3D-движке не используются макросы

* чтобы управлять игрой нажатием клавиш, нужны макросы, управляющие движением с помощью одной простой инструкции копирования.

Можете скачать файл и протестировать его самостоятельно!

Файлы




Контекст


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

Поначалу, какой бы мудрой ни казалась эта фраза, упоминание в этом списке Excel выглядело глупо…

Затем, после изучения машины Тьюринга, фраза стала для нас полностью верной, хотя и не вполне реализуемой.

Получив многолетний опыт работы с Excel, мы уже поняли, что единственное ограничение формулы Excel — недостаток способов ввода-вывода.

Но множество задач, решаемых исключительно формулами, по-прежнему выглядит впечатляюще.

Как бы то ни было, эта работа — не просто какое-то хвастовство… У меня были для неё серьёзные причины.

Электронные таблицы — это мощный инструмент, которому должен научиться каждый, ведь его можно использовать почти в любых деловых задачах.

Однако когда большинство людей доходят до решения более сложных задач, они стремятся использовать язык VBA, даже не понимая толком, зачем.

А начав изучать его, они пытаются использовать его для решения любых видов задач, даже для простого поиска или визуализации.

Сегодня я преподаю Excel, поэтому постараюсь объяснить людям, почему написание макроса на VBA для решения любой задачи без хорошего знания программирования — это не только пустая трата времени, но и серьёзный риск снижения качества электронной таблицы.

При использовании в бизнесе формулы обладают следующими преимуществами перед макросами:

  • Их быстрее писать для любого человека, если он не профессиональный программист-аналитик
  • Их проще поддерживать любому человеку, а не только профессиональному программисту. (Чаще всего макросы становятся бесполезны после ухода их разработчика.)
  • Гарантированное качество благодаря постоянной проверке значений. (Принудительное применение техники «разработка через тестирование»)
  • Они более эффективны в долговременной перспективе благодаря процессу создания формул в стиле «думай, прежде чем писать».
  • И они совершенно точно гораздо лучше интегрированы в сам инструмент создания электронных таблиц и следуют изначальному паттерну разработки электронных таблиц, в то время как макросы часто оказываются специфическими конструкциями, требующими в дальнейшем активной поддержки.

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

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

Если конкретнее, то я нашёл всего два случая, когда потребовался VBA:

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

В оставшейся части этой статьи я расскажу как работают электронные таблицы в различных аспектах игры.

Карта


Моя электронная таблица должна была стать игрой в стиле Doom в лабиринте.

Можно было создать для неё постоянную, построенную вручную карту, возможно, зацикленную по краям, но она бы потребовала дополнительного места, поисков и изначальной разработки дизайна.

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

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

Начальные состояния генератора случайных чисел должны быть позициями (x;y) на карте, чтобы мы могли получать разные значения для каждой позиции, и мы не можем получить результат предыдущего случайного числа как начальное состояние для следующего, или нам придётся хранить всю карту с самого начала.

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

Эксперименты с фрактальным генератором тоже оказались довольно затратными и давали интересные результаты только для небольшой части карты.

Тогда я обнаружил метод средних квадратов (middle-square method), который на самом деле не очень «случаен», потому что в нём используются последовательные начальные состояния. Но он подсказал мне идею того, что можно брать десятичную часть любого другого вычисления.

Я выяснил, что если брать десятичные части sin(x)+cos(y), то наконец-то получаются красивые числа без какого-либо прослеживаемого паттерна, а время вычислений при этом на удивление малО.

Для получения десятичных частей математические функции mod() и floor() гораздо более эффективны по сравнению с текстовой функцией подстроки mid().

Я стремился сделать карту похожей на крысиный лабиринт, поэтому создавал блоки не сплошными, чтобы они походили не на пещеры (в стиле Minecraft), а на лабиринт.

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

Плотностью размещения стен управляют два параметра.

С учётом этих правил мы можем или отображать лабиринт, или тестировать любую стену с заданной позицией с помощью трассировки лучей.

Стоит заметить, что карта «плоская», без подъёмов и спусков. Можно было добавить рельеф с помощью генератора рельефа (подошёл бы алгоритм Diamond-Square, потому что его можно написать без рекурсивной функции), но весь последующий процесс сильно облегчило бы вырезание отверстий в полу и потолке с дополнительным значением уровня.


Так, похоже, мы в аду

Трассировщик лучей


Трассировщик лучей должен определять для каждого пикселя экрана, какой первой поверхности касается луч, и получать от неё информацию (расстояние, угол падения света, цвет и т.д.).

Кроме того, трассировщику лучей требуется дополнительный луч, распространяющийся из этой точки (отражения, прозрачность), что напрямую увеличивает вычислительные затраты.

Окклюзия


Первым сложным моментом будет нахождение первого объекта на пути каждого луча.

Поскольку лабиринт на самом деле плоский с горизонтальными стенами, то ближайшая найденная стена будет одинаковой для всех пикселей одного столбца.

То есть процесс можно упростить до горизонтального «радара» в одном измерении.

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

Определение того, какую стену нужно проверять — это всего лишь тригонометрическая задача.

И поскольку у нас всего два типа стен, мы можем тестировать оба типа, а потом сохранять только ближайшую.

Одно из ограничений Excel заключается в отсутствии условного цикла и для экономии времени можно только пропускать тело цикла. Поэтому нам нужно ограничить максимальное расстояние проверки, считая, что если на этом расстоянии стена не найдена, то её нет.

Пол и потолок


Чтобы определить потолок и пол, нам достаточно определить, где заканчивается стена.

Отдельный лист изменяет расстояние до пола или потолка в зависимости от вертикального угла.

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

Эффективное сравнение реализовано использованием только проекции расстояния до стены и до пола/потолка по оси камеры. Конечное расстояние затем получается с помощью предварительно вычисленного коэффициента расстояния в шейдере расстояний. Постоянные предварительно вычисленные значения нужны для экономии ресурсов.

Освещение


Конечное освещение берётся из шейдера освещения, представляющего собой свет факела, в направлении камеры (и оружия).

Когда поверхность точно горизонтальна к лучу света, также добавляется отражение.

Стена может быть только горизонтальной (если добавить наклон, то он просто смещает окно экрана вверх и вниз, не поворачивая камеру)

Для каждого угла радара мы получаем угол между лучом и ближайшей найденной стеной.

Коэффициент отражения — это просто функция угла.

В конце концов освещение становится результатом функции коэффициента расстояния, потолка/пола или разрешения стен, коэффициента отражения и коэффициента шейдера освещения.

Экран дисплея


Эффективный дисплей реализуется с помощью условного форматирования — градиент цвета зависит от значения ячейки.

Сокрытие значения выполняется форматированием ячейки.

Коллизии со стенами


Игрок не должен проходить сквозь стены, иначе это разрушит весь смысл лабиринта.

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

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

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

Изучено 25 вариантов и к ним привязано три возможных исхода (для каждой оси смещения), чтобы получать результаты за как можно меньшее количество проверок.

Несмотря на то, что это казалось самой короткой частью игры, таблица смещений стала самой сложной в реализации. (В 10 раз больше, чем карта, в два раза больше кода распознавания стен.)

Враги



Привет, красное привидение!

Графический рендеринг


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

Целый отдельный лист посвящён вычислению формы сфер с учётом горизонтального радиуса и вертикальной высоты овоида. Для анимирования существа используется соотношение высоты/ширины.

В рендеринге стен и потолка используется градиент только по одному цвету, однако Excel позволяет использовать два последовательных (не сливающихся) градиента. Поэтому врагов можно отображать другим цветом. Для этого градиента можно использовать диапазон значений ниже 0, при том, что значение 0 — это чёрный цвет.

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

На границе сферы низкая толщина сохраняет только значение цвета по умолчанию стены за ней с отрицательным коэффициентом для превращения его в цвет монстра. Фильтр цвета освещения обеспечивает прозрачность на границе сферы.

Здесь вычисления тоже производятся в горизонтальной плоскости, а максимальный объём вычислений подготавливается перед завершением 3D-вычислений для каждого пикселя.

Поведение врагов


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

Чтобы позиция, скорость и ускорение были непрерывными (для плавного движения), я сделал траекторию своего рода конечным фракталом большого круга с добавленными к нему небольшими круговыми вариациями. Коэффициент соотношения между кругами (и даже соотношение x/y) случаен и ненатурален, поэтому траектория никогда не самозацикливается. Чтобы получить хороший случайный генератор детерминированных траекторий, я создал отдельный лист, отображающий траекторию.

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

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

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

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

Атаки врагов


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

Область видимости каждого монстра вычисляется на вкладке радара с учётом расположения стен.

Игрок получает урон, когда он оказывается внутри радиуса врага. Если игрок специально забирается внутрь врага, происходит то же самое.

Это создаёт эффект наносимого игроку урона — простой эффект негативного цвета во весь экран.

Добавлен также ещё один эффект — отмена рендеринга всех остальных врагов при нанесении урона игроку.

Жизнь игрока указана как один из элементов его статуса, который обрабатывается поэтапно, как и его положение.

Атаки игрока


Каждый враг получает значение статуса, определяющее его оставшуюся жизнь и фазу атаки. При некоторых значения враги просто не отображаются, при некоторых других враги медленно регенерируют, а последнее заставляет врага взорваться.

Эта упрощённая модель позволяет игроку предотвратить атаку врага, снизив его жизнь до нуля.

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

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

Смерть и перезапуск


Когда жизнь игрока снижается до нуля, бОльшая часть его действий приостанавливается и появляется экран конца игры.

Этот экран рендерится с помощью ещё одного шейдера освещения. К цвету применён эффект негатива, чтобы подчеркнуть нанесение урона.

Постепенное отображение сообщения «game over» реализовано с помощью небольшого коэффициента, увеличивающегося как степенная функция. Это позволяет будущим пикселям оставаться скрытыми до их появления, когда степень становится достаточно большой.

Сдвигание вниз — это простое смещение шейдера освещения, в который добавлены другие сообщения, например, рекорды (high score) и перезапуск игры.

Очки должны отрисовываться с помощью пикселей шрифтом очень низкого разрешения.

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

Похожие публикации

Комментарии 83
    +20
    Шикарно, нету слов, одни восторги! Спасибо.
      +18
      Да уж… Месье знает толк :)
      В самом лучшем значении этой фразы!
      Мегакруто!
        +20
        Месье не просто знает толк ;) Месье как минимум познал дзен, суть бытия и вопрос, ответом на который было пресловутое 42)
        Это выше всяких похвал! Шедеврально!
          +7
          Не перевелись ещё маньяки в этом мире… Крутота!
            +38
            «Знание офисных приложений», после прочтения статьи, принимает для меня совсем иной смысл.
              +4
              Квинтэссенция «Офиса»!
              Бесконечные комнатушки опенспейса, музыка особенно доставляет:)
                +36

                "Подхожу к бухгалтерии — какая-то подозрительная тишина. Ну, точно, по сети в Ехсеl шпилят."

                +6
                (Для тех к то помнит.)

                Уровень Excel 95 достигнут. Через 2 года он выпустит космосим в Excel. А ещё через 3 года он сделает гоночки…
                  +3
                  Такое мог написать только человек, у которого на работе нет интернета, нельзя играть в игры, нельзя вообще ничего открывать, кроме блокнота с калькулятором, паинта, ворда и экселя. Максимум, что я могу сделать — это крестики-нолики. Ну и морской бой какой-нибудь, и то с VBA. Браво!
                    +1
                    нет поддержки разных ОС в libreoffice работать отказался, сюжета нет, геймплей вторичен (видел такое еще в году 99ом), но за реализацию 10из10ти)
                      +3
                      мой либр оффис заработал, просто сначала попросил в настройках включить макросы.
                        +1
                        Numbers тоже отказался… повыключал все формулы, либо заменил на свои.
                        +1
                        Crazy man! ;)
                          +2
                          А еще говорили, что товарищ oWart над Excel'ем извращается: Чем заняться айтишнику в армии или как я на VBA игры писал.
                          +1
                          В excel-е когда-то давно пытался картинки рисовать таким образом, но тормозило в те времена страшно. А тут вон оно что. Мегазачот ;)
                            +1
                            Парень, ты гений!
                              +11
                              Теперь осталось дождаться, пока кто-нибудь напишет прайс-лист на Unreal Engine :)
                                +1
                                Ждем Бухгалтерию Предприятия на CryEngine.
                                  0
                                  Excel на блюпринтах.
                                  +3

                                  Когда сам Doom на Excel портируют?

                                    +1
                                    Так уже, в 95-м

                                      +1
                                      Это как бы немножко не то же самое…
                                        +1
                                        Ну так без внятного ТЗ…
                                        Где ж вы были в 95-м? ;)
                                          +1
                                          Паскакаль учил :)
                                    +1
                                    Напомнило, habrahabr.ru/post/179295 :)
                                      +1
                                      Была идея перегнать в SVG, да весит больше ))
                                      +3
                                      на самом деле впечатляюще. Человек который смог сделать это без труда потом въедет в любой GL, DX, Metal или что там ещё понапридумывают. Это действительно уровень понимания того как это работает, а не просто пользование.
                                        +3
                                        Мечусь между двумя состояниям: «ненавижу автора» и «ненавижу себя».
                                        Впечетляющая работа!
                                          +13
                                          Вот, теперь знания Excel можно добавить в резюме.
                                            +10
                                            Великолепно. Пожалуй, единственная вещь, которой тут явно не хватает — это возможности грабить корованы.
                                              –9
                                              За реализацию — однозначно респект.
                                              По поводу философии «вокруг»- вопрос ужасно спорный, как ни крути.
                                              Да, современное железо позволяет реализовать на excel-е сложные штуки, но идея
                                              заменять программный продукт сложно устроенной таблицей — странна и сомнительна.
                                              Причины:
                                              1) Люди, освоившие ексель и имеющие потенциал к освоению настоящих языков программирования, могут остановиться и решить, что «а теперь я всё буду делать на экселе», как следствие — закроют себе множество возможностей для роста.
                                              2) Сам по себе эксель без vba не позволяет нормально версионировать результат и посмотреть, что именно изменилось и как. (Или уже есть удобный аналог git-а для формул?)
                                              Мёржить файлы, опять же, боль. Ссылки на внешние данные — работают криво и ломаются между версиями екселя. Бррр…
                                              3) Очень тяжко уползать от екселя к базам данных. (Хотя и можно, да. Но нужно отдельно сперва дорасти до понимания и принятия аналогичной SQL-ю системы хранения)

                                              Как следствие — это всё же довольно нишевый инструмент — обработать разномастный выхлоп разных прожек, построить такой-сякой-разэтакий графичек (хотя для чуть более серьезной визуализации — уже нужен gnuplot или VTK какой-нибудь), свести приход с расходом либо на верхнем уровне менеджмента, либо в конторе уровня «ларёк у дороги». Чуть более серьезные вещи — и нужны нормальные инструменты.
                                                +1
                                                2) Сам по себе эксель без vba не позволяет нормально версионировать результат и посмотреть, что именно изменилось и как. (Или уже есть удобный аналог git-а для формул?)

                                                Умеет:
                                                support.office.com/en-us/article/compare-two-versions-of-a-workbook-by-using-spreadsheet-compare-0e1627fd-ce14-4c33-9ab1-8ea82c6a5a7e
                                                  +1
                                                  Эмм. Ну, это не git а diff, всё же. От появления diff-а до появления CVS-а прошло 20 лет, если что. А от CVS-а до git-а — ещё лет 15 кажется. И вывод у этого чуда, эмм, сложен для понимания. Но лучше чем ничего, согласен.
                                                    +1
                                                    Вывод у лучшего мерджера файлов — Araxis Merge которым я пользовался для работы — ± не сильно лучше.
                                                      +1
                                                      Ни разу не пользовался. Посмотрите, что github делает (оно онлайн-тул, конечно, но всё же) — github.com/mickvav/snmpbuilder/commit/52df21b42747e01c98dc5c82995737de36c5dd7a#diff-3dd7b23e94954baac44c14c78ba8dc53
                                                      Видно где меняли, что было, что стало, контекст, в котором происходит дело.
                                                      Ровно ввиду того, что (обычно) при написании программы как программы контекст более-менее локален, а при пользовании таблицами — размазан — получается, что вывод diff-а показывает, где дело происходит и о чем речь вообще, а при работе с таблицами соорудить интерфейс, в котором это будет удобно в понимании — отдельная нетривиальная задача.
                                                      И то, что при изменении обработки 1000 строчек у вас меняется 1000 формул — никак не добавляет читаемости diff-у от excel-я. В программе это будет ровно одна строка.
                                                  +2
                                                  Насколько я понял (надеюсь, правильно), суть не в том чтобы сделать продукт, который способен заменить «нормальные» инструменты.
                                                  Мсье пробил потолок для любителей нестандартных офисных отношений.
                                                  Сказать что удивлен — ничего не сказать.
                                                  Присоединяюсь к товарищу сверху который не знает кого ненавидеть (автора или себя)
                                                    +1
                                                    После sql сложно возвращаться к excel-like кодингу
                                                      0
                                                      Как-бы так сказать. Это не реальный проект. А проект уровня «зацените, и так можно!». Вообще мега-круто, я считаю.
                                                      +1
                                                      Очень непривычное управление. Было бы здорово юзать wasd.
                                                        +3
                                                        Разобрался, переделал на WASD, очень круто, спасибо:)
                                                        +3
                                                        Мегакруто! Спасибо.
                                                        Подкину бизнес-идей — смартфон iExcel, браузер Excella, почтовый клиент Excelook, приставку для телевизора Sony Exceltion, умные excel-часы с возможностью устанавливать 1 048 576 будильников, фитнес-экслет с возможностью мерить показания тела и сохранять в Excel-файл, нейронную сеть на Excel, Excel-coin, методологию управления проектами Excram…
                                                        +2
                                                        В Exel 2000 не работает.
                                                          +8
                                                          Ага, и тестами код не покрыт.
                                                          +5
                                                          Когда на работе запрещают устанавливать игры…
                                                            0
                                                            Это конечно с виду необыкновенно круто, и демонстрирует отличную изобретательность, но, с реальными задачами фраза: «любые вычисления можно выполнить в любом языке программирования, даже через формулы электронной таблицы» не особо вяжется с реальной практикой. Хотя не отрицаю, что где-то 99,9% вычислений более-менее реализуемы.
                                                            Когда у нас есть ограниченные ресурсы, ограниченный (и тем более заранее известный) объём данных — это хорошая демонстрация, но как к примеру реализовать в Excel вычисления с неизвестным заранее объёмом данным? Как реализовывать списки (List) с переменным количеством значений/элементов?
                                                              +1
                                                              Из вашего комментария следует, что в картридже дэнди не может быть полноценной игры.
                                                                +1
                                                                Нет, и денди — не электронная таблица.
                                                                +1
                                                                Как реализовывать списки (List) с переменным количеством значений/элементов?

                                                                Вообще Excel позволяет косвенную адресацию.

                                                                  +1
                                                                  Это вообще не то. Так или иначе, ячейки заполнять надо.
                                                                  +1
                                                                  Как реализовывать списки (List) с переменным количеством значений/элементов?
                                                                  Начните с изучения абсолютных/относительных ссылок, функции СМЕЩ() и Диспетчера имён. Можно создавать даже многоуровневые списки, что уменьшит количество элементов.
                                                                    +1
                                                                    Я просто конкретизирую вопрос используя пример: допустим у нас есть столб неопределённой высоты (высота — вводимое значение), столб делится на сектора длиной 1м и массой 1кг, нужно подсчитывать число секторов (это элементарно) и нагрузку сверху на каждый сектор. Т.е. создать таблицу, в которой будет номер сектора и нагрузка на него сверху, сделать это используя практически любой язык программирования — элементарно, самый обычный список. А теперь вопрос: как реализовать это в Excel, при условии что мы не можем до бесконечности заполнять строки формулами под всевозможные габариты столба!? Если бы в Excel была возможность по условию редактировать из одной ячейки содержимое другой ячейки — без использования скриптов и макросов — тогда бы эта задача была реализуема, но насколько мне известно — такой функции нет.
                                                                      +1
                                                                      А теперь вопрос: как реализовать это в Excel, при условии что мы не можем до бесконечности заполнять строки формулами под всевозможные габариты столба!?
                                                                      Ять… вначале сами кастрируем задачу услвоиями, чтоб нельзя было сделать в экселе, потом побеждаем.
                                                                      Если есть универсальная растягиваемая формула, то она клонируется во все ячейки одним кликом мышки плюс операцией вставки.
                                                                      В другой столбец выводим номер сектора, если он есть. Если же нет, то записываем пусто. Расчет нагрузок производить, если номер сектора не равен пусто. Итого, формулы в двух столбах до 1048576 строки, но отображаются только нужные вам строки.
                                                                        +1
                                                                        Так я и говорил о кастрированности. Проблема как раз в том, что посреди вычислений требуется вмешательство человека, например растянуть если число строк оказалось недостаточным.
                                                                          +1
                                                                          Дано: универсально растягиваемая формула, клик по столбцу, ctrl+V.
                                                                          Вопрос, куда еще растягивать формулу, если на листе всего 1048576 строк?

                                                                          Вот это — вывод номера сектора:
                                                                          =ЕСЛИ(СТРОКА()<=$адрес$ячейки; СТРОКА();"")
                                                                          Вот это — вывод нагрузки:
                                                                          =(если(B1<>""; формула_расчета;"")

                                                                          Претензия уровня возможного переполнение Int при складывании двух больших чисел. Выкидываем все языки программирования, ибо думать надо?
                                                                            +1
                                                                            Вопрос, куда еще растягивать формулу, если на листе всего 1048576 строк?
                                                                            Дело не в бесконечном растягивании, а в автоматическом, без вмешательства пользователя.
                                                                            Дано: программист/бухгалтер/инженер/итд… (опытный эксельщик который пишет шаблон) и бухгалтер/обычный пользователь (который в экселе не понимает вообще ничего больше вбивания обычных цифр в определённые ячейки).
                                                                            Задача первого — написать универсальный шаблон, которым будет пользоваться второй, а второй даже о Ctrl+V не знает. Плюс ещё у второго калькулятор уровня целерон-2000 с потолком ОЗУ 512Мб (которые до сих пор встречаются).
                                                                            О каком миллионе строк (на все случаи жизни) может идти речь?
                                                                            Насколько мне известно изменять содержимое ячеек (не отображаемое, а саму формулу) невозможно без скриптов, что накладывает жёсткие ограничения на возможности Excel.
                                                                            Претензия уровня возможного переполнение Int при складывании двух больших чисел. Выкидываем все языки программирования, ибо думать надо?
                                                                            А если рассмотреть другую возможность, то даже имея мощный компьютер, но при наличии более масштабной задачи, то лимита в миллион строк — очень мало. Что касается ограничения Int, то Int64 (или даже Int32) — не миллион строк, даже близко, плюс в многих языках есть структуры, благодаря которым мы можем добавлять измерения, буквально до бесконечности и никаких ограничений, а с правильным алгоритмом ввода-вывода на хард проблем с лимитом ОЗУ не возникнет, даже на старом калькуляторе запашет. А что Excel!? Ну продублировали мы эту бесконечную таблицу из 2х колонок с ~миллионом строк на всю остальную часть листа, сколько там будет, ~миллион на ~16тыс? ~16777216? Больше, но не на много. И как в таком случае ограничивать? По всем столбцам прыгать и Ctrl+V делать? А если этого будет мало? Создавать клоны-листы? А что с ОЗУ случится? Допустим каждый символ закодирован в UTF-16*2^15(символов в ячейке)*16777216=1 терабайт ОЗУ на лист, и это только чисто содержимое ячеек, без учёта остальных данных (разграничение, связи, итд...), и вряд-ли Excel предусматривает частичный ввод-вывод.
                                                                            И это даже игнорируя то, что при количестве используемых ячеек, число которых на несколько порядков меньше, Excel умудряется махать ручкой уже на практике, ну да ладно, не будем рассматривать баги самой программы…
                                                                            Есть конечно чудесные аналоги, авторы которых с улыбкой смотрят на строковые ограничения софтины от мелкомягких, но возвращаясь к изначальной проблеме управления ячейками — даже там нету управления содержимым (по крайней мере я не видел), ибо в этом сама суть электронных таблиц.

                                                                            Практически и теоретически, электронные таблицы не подходят для всех вычислений, далеко не для всех.
                                                                              +1
                                                                              бляха муха, да щелкните вы уже по заголовку столбца и вставьте примеры формул, теоретик… где в моем описании знание пользователем как растягивать и вставлять формулы? в вашей исходной задаче нет ничего, чтоб требовало автоматического растягивания формул.
                                                                              далее мы видим, что интерпретируемын языки не нужны, ибо на калькуляторах тормозят, а под встраиваемые системы так вообще писать невозможно, видимо, из-за жестких ограничений на память место и тп. плюс прочие аргументы с двиганьем ворот (читай, прямыми признаками демагогии), слив аргумента про инт путем привязке к строкам (когда речь была о чем? правильно, о банальном суммировании двух больших чисел, главный бич кодеров, которые, так же как вы, задумываться не хотят) и вообще о ситуации про дурака, молитву и лоб (а еще точнее про стекоянный фалоимитатор).
                                                                              любой инструмент имеет ограничения, мозги же вам даны их обходить.
                                                                              но по вашим сообщениям понятно, что человечество не могло полететь в космос, высадиться на луну, вообще достичь прогресса, ибо у всех инструментов есть ограничения и пользоваться ими, следовательно, нельзя. если же вам докажут, что можно — превратим задачу в фарс путем ее раздувания до бессмысленных масштабов.
                                                                                +1
                                                                                в вашей исходной задаче нет ничего, чтоб требовало автоматического растягивания формул
                                                                                Разве? А это тогда что?
                                                                                как к примеру реализовать в Excel вычисления с неизвестным заранее объёмом данным? Как реализовывать списки (List) с переменным количеством значений/элементов?
                                                                                далее мы видим, что интерпретируемын языки не нужны, ибо на калькуляторах тормозят, а под встраиваемые системы так вообще писать невозможно
                                                                                А питончик с такой задачей и такими рамками справится, как и куча других интерпретируемых языков.
                                                                                плюс прочие аргументы с двиганьем ворот
                                                                                Я всё это изначально говорил. Просто вы не понимаете изначального условия, а я вам досконально расписываю.
                                                                                слив аргумента
                                                                                Я не пытаюсь холиварить, а говорю по делу про ограничения.
                                                                                про инт путем привязке к строкам… банальном суммировании двух больших чисел, главный бич кодеров
                                                                                Я про структуры, это совершенно разные вещи. А с добавлением измерений в итоге не будет никаких проблем в адресации. На содержимом ячеек это никак не скажется, она и в данный момент избыточна.
                                                                                любой инструмент имеет ограничения, мозги же вам даны их обходить
                                                                                Молоток не стеклорез. Excel очень сильно ограничен в вопросе вычислений.
                                                                                но по вашим сообщениям понятно, что человечество не могло полететь в космос, высадиться на луну, вообще достичь прогресса, ибо у всех инструментов есть ограничения и пользоваться ими, следовательно, нельзя
                                                                                Для этого нужны разные инструменты, для решения разных задач, и да, с одним только Excel'ем на Луну не улетишь. И я бы посмотрел на работника NASA, который просчитывает всю физику в электронной таблице.
                                                                                если же вам докажут, что можно — превратим задачу в фарс путем ее раздувания до бессмысленных масштабов
                                                                                Дело не в масштабах, а в неизвестных заранее объёмах данных. Пример с большим объёмом данных был для того, чтобы вам стало понятно, что невозможно предугадать сколько всего потребуется, а если делать по-максимуму (пределу Excel) — то никаких аппаратных ресурсов не хватит. Но вам, я как я вижу, этого просто не понять.
                                                                                  +1
                                                                                  Разве? А это тогда что?
                                                                                  Это тезис, который вы задачей хотели подтвердить. Неудачно, потому что надуманная претензия.
                                                                                  Причем о том, что задача решается в лоб и не требует авторастягивания формул — я вам какой уже коммент пишу, а вы тупо не можете взять и вбить в эксель его, дабы понять, м? Ну я даже не знаю, мне гифку записать на полминутки решения «дикой» проблемы из вашего примера, который был должен что-либо доказать.
                                                                                  А питончик с такой задачей и такими рамками справится, как и куча других интерпретируемых языков.
                                                                                  окей, давайте, покажите, как питон справится с задачей вывести в удобном интерфейсе несколько миллионов строк, с кучей расчетом на калькуляторе. Ведь это вы ж потом вынули аргумент о машинах возрастом примерно в 20 лет, ага. Но раз вы в аналогии не понимаете, что ж: ваш аргумент про быстродействие на старом железо абсолютно бредовый по причине того, что куча новых инструментов на старом железе тоже нихрена работать быстро не будут. Вы тупо проекты в визуалстудио не скомпилируете, например, вместо нескольких минут расчетов — они будут идти часами. Но это же проблема экселя, угу…

                                                                                  Причем учтите, если ваш пример на питоне не сможет в подобие интерфейса экселя, то вы именно тролль.
                                                                                  Причем если вы вообще утверждаете, что можно создать удобный интерфейса работы с хотя бы миллионом строк в вашей задаче, которые должен каким-то образом человек просмотреть и из этих данных что-либо путное глазами получить — то вы не просто тролль, а жирный. И не то что в эксель, а в решение реальных проблем не умеете от слова совсем.
                                                                                  Как человек, занимавшийся автоматизацией производства и навозившийся с экселями и прочим заявляю.
                                                                                  Я про структуры, это совершенно разные вещи.
                                                                                  а я про то, что если мозгами не пользоваться, то и стеклянный разобьешь, и руки порежешь. Вот вам, видимо не привыкать с порезанными руками ходить да разбитым лбом.
                                                                                  Для этого нужны разные инструменты, для решения разных задач, и да, с одним только Excel'ем на Луну не улетишь. И я бы посмотрел на работника NASA, который просчитывает всю физику в электронной таблице.
                                                                                  Но вы можете посмотреть на работников наса, которые на луну посылали ракеты с помощью перфокарт и об экселе даже не мечтали. Перфокарт. Двоичный код. Быстродействие меньше, чем у современных часов.
                                                                                  И да, этот коммент опять таки об умении пользоваться инструментами и порезанных руках, да разбитых лбах.
                                                                                  Дело не в масштабах, а в неизвестных заранее объёмах данных.
                                                                                  дело в том, что вместо того, что бы правильно ставить и разбивать задачи, вы пеняете на инструмент, который чего-то не умеет.
                                                                                  А с учетом, что для таких людей в эксель еще и VBA включили… Мы возвращаемся к порезанным рукам и разбитым лбам.
                                                                                  А если вспомнить какой-нибудь PowerPivot и прочие новшества современного экселя, то можно с грустью констатировать, что вы вообще тут кучу комментов пытаетесь рассуждать не зная инструмент от слова совсем.
                                                                                    +1
                                                                                    Это тезис, который вы задачей хотели подтвердить. Неудачно, потому что надуманная претензия.
                                                                                    А что тут надуманного? Excel не может в управление содержимым, из этого следуют ограничения, из-за который в плане вычислений (возможностей решения определённых задач) Excel жёстко ограничен.
                                                                                    не требует авторастягивания формул
                                                                                    Она сама себя продублирует без скриптов и вмешательства пользователя?
                                                                                    вы тупо не можете взять и вбить в эксель его, дабы понять, м?
                                                                                    Зачем вбивать формулы, которые мало того что не рабочие, а вторых примитивны для понимания того, что в них нет ничего чтобы решить поставленную задачу, в которой, напоминаю, фигурирует тезис «неизвестным заранее объёмом данным».
                                                                                    как питон справится с задачей вывести в удобном интерфейсе несколько миллионов строк
                                                                                    Ну во-первых речь идёт не о интерфейсе, а о вычислениях и данных, а во-вторых — легко. Для этого уже существуют если ещё не сотни, но с десяток точно различных модулей. Конечному-же пользователю/компании нужна готовая компьютерная программа под его задачи, не связанная по рукам и ногам ограничениями электронных таблиц. И я молчу о интерфейсе, а касаюсь только самих вычислений.
                                                                                    куча новых инструментов на старом железе тоже нихрена работать быстро не будут. Вы тупо проекты в визуалстудио не скомпилируете, например, вместо нескольких минут расчетов — они будут идти часами. Но это же проблема экселя, угу
                                                                                    Одной программы, написанной под конкретные задачи с неизвестным заранее объёмом данных и скомпилированной всего один раз (релиз-версия), написанной под старое железо — будет более чем достаточно, она будет работать с данными намного быстрее как минимум благодаря строгой типизации и не нужно будет вмешиваться в исходных код дабы отодвинуть ограничитель в виде числа строк, как в экселе это делается раз за разом. Я имел дело с инженерными расчётами, и считать физику в экселе — это просто боль, боль постоянных правок не исходных данных (входных значений), как это должно быть, но и нескольких десятков формул по туче вкладок, т.к. их приходится постоянно растягивать, вчера у тебя максимальная высота столба 8 метров, среди всех столбов что ты до этого считал, сегодня 10 метров, а завтра 100, а послезавтра 500.
                                                                                    Причем учтите, если ваш пример на питоне не сможет в подобие интерфейса экселя, то вы именно тролль.
                                                                                    Если в питон засунуть интерфейс экселя — то он и станет экселем (+VBA по-дефолту), а зачем это? Это тонна лишних функций. А насчёт не сможет — гуглите: «PyQt table», или смотрите прямо на ютубе. И при этом не будет ограничений в числе строк.
                                                                                    миллионом строк в вашей задаче, которые должен каким-то образом человек просмотреть и из этих данных что-либо путное глазами получить
                                                                                    А кто говорил про смотреть? Я это где-то упоминал? Задача поставлена «вычислять». Вы сами добавляете условия и сами же к ним придираетесь, и всё больше и больше переходите на личности, что на данном ресурсе — недопустимо. Но даже так — то в конечном продукте/программе — предусмотрена система отчётов, благодаря которой не нужно обязательно просматривать миллионы строк данных. И если, к примеру, что-то где-то «проседает» — это сразу видно на графиках или ещё проще можно добавить индикатор, который бы один раз пробежался по этим данным (не исключено что прямо во время подсчёта) и проверил бы их по условию (например последующее значение должно быть больше предыдущего и так для каждой строки, иначе exception&break с выводом номера строки), всё время обновляя своё значение, для экселя бы в таком случае потребовалась бы очень длинная формула (которая может не влезть в ячейку), либо ещё лишний столбец или столбцы, и то не факт что при всех случаях это вообще возможно. А насчёт посмотреть — «PyQt table».
                                                                                    Как человек, занимавшийся автоматизацией производства и навозившийся с экселями
                                                                                    А вот это очень интересно, вы сможете обновлять таблицу поступающими данными с сохранением предыдущих без VBA и без лишних телодвижений? Т.е. грубо говоря вести статистику методом: «вбил число+дату и нажал на кнопку», дабы потом эти данные обрабатывались в куче формул и так-же сохраняли свои результаты для вынесения определённых решений/корректировок/итд… (про графики и отчёты с прочей GUI'шной составляющей я молчу) Вам просто придётся постоянно двигать и растягивать формулы, постоянно скроллить, и всё это будет тормозить. Доверить такое действие (вбил-нажал) человеку — не проблема, а вот доверить ему правку формул — уже другое, опять же нужен будет VBA. Если у вас всё хорошо — то вы просто не сталкивались с достаточно большим объёмом данных. Рано или поздно вы задумаетесь: «а может всё-таки проще написать скрипт!?»… но это уже за рамками концепции электронных таблиц как таковых. Если таки жизненно необходим эксель за счёт интерфейса — то его можно спаять с питоном, модули для этого уже есть.
                                                                                    Но вы можете посмотреть на работников наса, которые на луну посылали ракеты с помощью перфокарт и об экселе даже не мечтали.
                                                                                    И пользовались они не только перфокартами, многие действия/вычисления они производили вручную, перфокарты предыдущие записи со склада не достанут, и в случае отклонений данные не скорректируют (а это всё те же вычисления), в отличии от современного ПО, данный пример лишь демонстрирует ограниченность электронных таблиц, ибо они тоже на такое не способны без сторонней помощи. А вот современные контроллеры (имеется ввиду ещё прошивка, не только хард), несмотря на все свои ограничения как по аппаратной части (это к примеру про современные часы), так и по размеру используемой памяти (ОЗУ), на такое способны.
                                                                                    И может хватит переходить на личности!? На данном ресурсе это недопустимо.
                                                                                    вы пеняете на инструмент, который чего-то не умеет
                                                                                    Он не умеет автоматически контролировать содержимое своих же мест хранения данных (ячеек), для этого нет стандартных функций, для этого приходится задействовать языки программирования. И из этого вытекает просто «тонна» практических ограничений.
                                                                                    Если бы в Excel была стандартная функция "=если_то_изменить_ячейку" (не сторонние скрипты), например:
                                                                                    =ЕСЛИ_ИЗМ(if;ячейка_которую_нужно_изменить;новое_содержимое)
                                                                                    … то я бы ни слова не сказал.
                                                                                    Например для конкретно поставленной задачи:
                                                                                    A1=5,41 //новое значение
                                                                                    B1=2,31 //старое значение
                                                                                    C1='=ЕСЛИ_ИЗМ(ОКРУГЛВВЕРХ(A1;0)>ОКРУГЛВВЕРХ(B1;0);СМЕЩ(A2;0;0;ОКРУГЛВВЕРХ(A1;0));"новое_содержимое") //заполнение
                                                                                    D1='=ЕСЛИ_ИЗМ(ОКРУГЛВВЕРХ(A1;0)<ОКРУГЛВВЕРХ(B1;0);СМЕЩ(ОКРУГЛВВЕРХ(A1;0)+2;0;0;ОКРУГЛВВЕРХ(B1;0)-ОКРУГЛВВЕРХ(A1;0);"") //стирание
                                                                                    E2='=ЕСЛИ_ИЗМ(ОКРУГЛВВЕРХ(A1;0)<>ОКРУГЛВВЕРХ(B1;0);B1;A1) //копирует содержимое

                                                                                    А чтобы был определённый порядок выполнения замен — можно поместить условие в условие через «или». Триггеры срабатывания через те же условия, как например сравнение в E2.
                                                                                    … и всё, не нужно ничего растягивать. Миллионы ситуаций геморроя отпадают. Появится возможность реализовывать бесконечные циклы (с временем на сон между итерациями разумеется), и миллионы других конечных примеров, невозможные вычисления с бесконечным потоком данных станут возможными. А про текущие шаблоны — они станут более универсальными, конечному пользователю практически не придётся вмешиваться в формулы. А простота данной функции — это не геморрой со скриптами и строками лишнего кода в виде эндифов.
                                                                                    Возможно я отстал от жизни, и некое подобие данной функции уже есть и я тут зря распинаюсь, но меня заверили что нет.
                                                                                    PowerPivot
                                                                                    Больше чем Excel, но меньше чем Access?
                                                                                    не зная инструмент от слова совсем
                                                                                    Ну так описанная мной выше функция присутствует?
                                                                                      +1
                                                                                      PS Код отображается некорректно (по крайней мере у меня в браузере), обрезается по горизонтали. Нужно скопировать и вставить в блокнот или посмотреть код страницы.
                                                                                        0
                                                                                        А что тут надуманного? Excel не может в управление содержимым, из этого следуют ограничения, из-за который в плане вычислений (возможностей решения определённых задач) Excel жёстко ограничен.
                                                                                        Все инструменты ограничены. Питон — то же.
                                                                                        Она сама себя продублирует без скриптов и вмешательства пользователя?
                                                                                        и после этого вы пишите, что не тролль? Еще раз, щелкаете на заголовок, вставляете и… Хотя по факту можно вставить только в ближайшую тысячу для вашей задачи, ибо вот эти ваши 8, 10, 100 и 500 метровые столбы — это смешно. После чего вы про ограничение в миллион строк заикаетесь.
                                                                                        Ах да, для вас трудно осознать, что формулы сами могут управлять отображением и вычислением себя по внешним условиям…
                                                                                        Одной программы, написанной под конкретные задачи с неизвестным заранее объёмом данных и скомпилированной всего один раз (релиз-версия), написанной под старое железо — будет более чем достаточно
                                                                                        И отдел программистов, чтоб поправить в ней одну формулу в столбце в случае изменений. Ах да, это пользователи умеют сами и без программистов, а вот формулу растянуть — уже никак, я забыл.
                                                                                        И при этом не будет ограничений в числе строк.
                                                                                        PowerPivot, еще раз.
                                                                                        А кто говорил про смотреть? Я это где-то упоминал? Задача поставлена «вычислять».
                                                                                        То есть ваша задача подразумевает, что это никому не нужно? Что требуемые вами миллионы строк расчетов исключительно ни для чего, просто так в табличку выпадают?
                                                                                        Т.е. создать таблицу, в которой будет номер сектора и нагрузка на него сверху
                                                                                        как это должно быть, но и нескольких десятков формул по туче вкладок, т.к. их приходится постоянно растягивать, вчера у тебя максимальная высота столба 8 метров, среди всех столбов что ты до этого считал, сегодня 10 метров, а завтра 100, а послезавтра 500.
                                                                                        допустим у нас есть столб неопределённой высоты (высота — вводимое значение), столб делится на сектора длиной 1м и массой 1кг, нужно подсчитывать число секторов (это элементарно) и нагрузку сверху на каждый сектор.

                                                                                        И вот для этого вам нужно более миллиона строк формул? Серьезно? Тихо плачу в углу.
                                                                                        данный пример лишь демонстрирует ограниченность электронных таблиц
                                                                                        данный пример демонстрирует лишь вашу упертость в ограниченности виденья. А то, что вы описали собственные боль и страданье с протяжкой формул на 8,10 и 100 метровые столбы — это именно то, что я описывал в сообщении выше. Про порезанные руки и разбитые лбы.
                                                                                        Не говоря уже о примерах, которые вы написали — это ппц. Спасибо за наглядную демонстрацию того, что вы не умеете в эксель.
                                                                                          0
                                                                                          А вообще, если б вам действительно так уж нужна была такая функция — давно б написали. А то питоны, компилируемые языки — их же никто не учит и в них никто ничего не пишет, там достаточно только мысль сформулировать. А в экселе все за вас должны были сделать и предусмотреть, да еще и интегралы решать и производные искать, ага. В обычном-то табличном редакторе…
                                                                                          .Value и .Replace вам в помощь, только не забывать, что работают они более менее внутри диапазонов по крайней ячейке, имеющей какие-либо свойства на этом листе.
                                                                                            0
                                                                                            Все инструменты ограничены. Питон — то же.
                                                                                            Питон только как пример, который обладает теми элементарными возможностями, в которые не могут электронные таблицы.
                                                                                            Ах да, для вас трудно осознать, что формулы сами могут управлять отображением и вычислением себя по внешним условиям
                                                                                            Отображением да, содержимым — нет. Отсюда и ноги всех ограничений растут.
                                                                                            И отдел программистов, чтоб поправить в ней одну формулу в столбце в случае изменений. Ах да, это пользователи умеют сами и без программистов, а вот формулу растянуть — уже никак, я забыл.
                                                                                            Целый отдел не нужен, достаточно лишь одного, и то не обязательно штатного. А что касается навыков пользователей — вы их переоцениваете. И вдобавок это гарантия что с формулами не произойдёт что-то вроде: «ой, оно само сломалось, я не трогал».
                                                                                            миллионы строк расчетов исключительно ни для чего, просто так в табличку выпадают?
                                                                                            Как пример — график. Допустим для столба помимо нагрузки сверху нужно учитывать ветровую нагрузку — это ещё столбец как минимум в примитивном примере, в реальном же всё куда сложнее. Допустим столб у нас полый и нам нужно посчитать толщину стенки, при очень большой высоте (или соотношении высота/диаметр) нужно учитывать что столб может погнуться под силой собственного веса и от ветра, особенно если на вершине столба есть очень тяжёлая конструкция (умышленные воздействия, как бегущий головой вперёд неадекват, в условном примере не учитываются), и вот нам нужно рассчитать на каком отрезке (секторе) столба какая толщина должна быть, а делать его не полым — экономически невыгодно (тоже учитываем, можно ещё столбец), ответ алгоритма устойчиво/не устойчиво — нас не устраивают, нам нужно знать слабые места в конструкции, в каждом секторе, на каждом отрезке, и чтобы человеку было наглядно понятно — выводить нужно это в виде графика, а для большей точности — нужно больше данных, если брать только нижнюю и верхнюю часть — то можно пропустить слабое место где-то посередине, место, выше которого давление от веса низкое, а ниже ветровая нагрузка слабее, главное не пропустить эту слабую точку (или область). А если заставить алгоритм самостоятельно подбирать значения толщины на разных отрезках (без циклов, многомерный график с матрицей возможных значений на входе) и реализовывать это в рамках двумерной таблицы — то никаких миллионов строк не хватит. И весь этот океан данных выводится в виде наглядного графика, который может быть многомерным (чем-то вроде графика поверхности, или набором графиков, если вам сложно), который удобен для визуального поиска «проблемных» мест, это не «просто так в табличку выпадают».
                                                                                            PS Задачу решить с помощью одной математической формулы — не получится из-за дискретности.
                                                                                            Пример «столба» может и смешной, но постарался передать суть некоторых нюансов, которых в реальности в десятки раз больше (порой и в сотни), а на место полого столба можно поставить любой другой высокий объект.
                                                                                            .Value и .Replace вам в помощь
                                                                                            … тонны эндифов, нет уж спасибо. Если уж использовать язык, то на полную. Учитывая сколько математических библиотек для каждого языка существует, и парсеров к ним — Excel становится практически ненужной записной книжкой, а так-же выступает в роли одноразового калькулятора.
                                                                                              0
                                                                                              О да, вы не тролль…
                                                                                              Питон только как пример, который обладает теми элементарными возможностями, в которые не могут электронные таблицы.
                                                                                              Угу, с учетом, что всем запретят писать на VBA или под ооо в Visual Basic или, та-дам, на Питоне, дабы ваше утверждение хоть капельку стало напоминать истину. Я уже говорил про «богу молиться»?
                                                                                              Отображением да, содержимым — нет. Отсюда и ноги всех ограничений растут.
                                                                                              Ноги растут из ж**пы. А мнимые ограничения — исключительно из вашей головы. Очень хотелось сделать вывод из этих двух утверждений, но вот это было бы переходом на личности.
                                                                                              Целый отдел не нужен, достаточно лишь одного, и то не обязательно штатного.
                                                                                              Итак, то что для написания программ и их изменения требуются программисты — это норм. То, что для пользования Экселем нужны либо знания, либо программисты — инструменты говно.
                                                                                              Вы последовательны…
                                                                                              А что касается навыков пользователей — вы их переоцениваете.
                                                                                              Ах да, мы ж не про инженеров тут рассуждаем, не про технических специалистов, а про бухгалтеров и дворников.
                                                                                              Как пример <...>
                                                                                              Прекрасный пример того, что на экселе прототип будет готов через пару деньков, а вот программисту не в теме придется через ваши дебри сознания продираться месяцами.
                                                                                              … тонны эндифов, нет уж спасибо
                                                                                              Фейспалм. Если программу писать будете — там же этого всего не будет, кончено. Там же пони радугой какают… Хотя, если вы только эндифами умеете писать — то это ваши тараканы.

                                                                                              Итак, констатация:
                                                                                              — Вы не знаете, что в экселе можно писать собственные функции, которые потом вызывать как обычные типа сумм().
                                                                                              — Вы не знаете, что в модуль листа можно записать функцию, которая будет отрабатывать при изменениях листа (Private Sub Worksheet_Change)
                                                                                              — Когда вам уже откровенно ткнули, что вы требуемую вам функцию могли бы написать сами, причем это затребовало бы меньше времени, чем вы тут бичуете «недостатки» Экселя… Вы слились под предлогом «тонн эндифов», что хорошо характеризует, что и в программировании вы нихрена не разбираетесь. Ровно один иф на проверку, есть что в ячейке или нет — если вам чисто записать в ту ячейку. Или чуть больше, если еще форматы нужны.

                                                                                              Хотя это и так было явно по тому, что вы в упор игнорили пример с управлением отображения ячейки, требуя автопротяжку. Если мозги не позовляют разбить задачи на блоки и решить их оптимально, то никакой инструмент не поможет… я ведь уже говорил про «разобъет и руки порежет»?
                                                                                                0
                                                                                                Угу, с учетом, что всем запретят писать на VBA или под ооо в Visual Basic или, та-дам, на Питоне, дабы ваше утверждение хоть капельку стало напоминать истину.
                                                                                                Вы сами требовали доказательства с питоном, а теперь оно вам не нравится.
                                                                                                А мнимые ограничения — исключительно из вашей головы.
                                                                                                Я уже просил пример управления содержимым.
                                                                                                Прекрасный пример того, что на экселе прототип будет готов через пару деньков, а вот программисту не в теме придется через ваши дебри сознания продираться месяцами
                                                                                                Любому человеку «не в теме» потребуется много времени, только для «вникания в тему», в остальном ограничения заключаются лишь в навыках программирования. Если делать что-то очень маленькое, то в экселе — да, быстрее, а если что-то серьёзное — то затрачиваемое время на эксель будет уходить всё больше и больше, в сравнении с языками.
                                                                                                Фейспалм. Если программу писать будете — там же этого всего не будет, кончено. Там же пони радугой какают… Хотя, если вы только эндифами умеете писать — то это ваши тараканы.
                                                                                                Язык можно выбрать, и во многих "всего не будет, кончено", VBA — эстетический кошмар. Лично я, не видел других языков для управления экселем «изнутри», да и снаружи лучше взаимодействия с экселем избегать. Версия меняется — всё ломается.
                                                                                                Вы не знаете, что в экселе можно писать собственные функции
                                                                                                Как это делать без VBA — не знаю, покажите.
                                                                                                Вы не знаете, что в модуль листа можно записать функцию, которая будет отрабатывать при изменениях листа (Private Sub Worksheet_Change)
                                                                                                С Worksheet Interface я знаком не по наслышке. Изменения обрабатывал через WorksheetChangeEventHandler. Конкретно ваше — это VBA, скрипты, а не стандартные возможности электронных таблиц, о отсутствии которых я писал в самом начале. Но вы почему-то не считаете это ограничением…
                                                                                                Когда вам уже откровенно ткнули
                                                                                                О чём я всё время и говорил: электронные таблицы не могут производить полноценные вычисления без костылей…
                                                                                                в программировании вы нихрена не разбираетесь
                                                                                                =)
                                                                                                Ровно один иф на проверку, есть что в ячейке или нет
                                                                                                Вы наверное не знаете, но когда обрабатывают большие объёмы данных с множеством условий — одного if'а мало. О чём я и говорил. И о чём я не однократно писал — вы просто не работали с достаточно большим объёмом данных.
                                                                                                  0
                                                                                                  Вы сами требовали доказательства с питоном, а теперь оно вам не нравится.
                                                                                                  Да-да. Питон же возник не из-за того, что я привел интерпретируемые языки в пример того, что на калькуляторах тормозить будут и куча других инструментов (что вы опять таки ставили в вину исключительно Экселю). Нет, нет же.
                                                                                                  Или потом не в качестве примера того, что подобная задача с нуля на языках программирования будет решаться намного дольше и потребует от пользователя намного больших усилий.
                                                                                                  А то, что тот же ООо включает в себя возможность писать функции на питоне — это ничего, это же не стандартная возможность ПО, это, видимо, магия. Вам недоступная…
                                                                                                  Итак, хорошо, какого фига вы в качестве доказательства своей позиции искусственно ограничиваете возможности ПО?
                                                                                                  Прямо таки про вас:
                                                                                                  В исполком пришла жалоба: «Напротив моего окна женская баня. Мне все видно и это отвлекает меня и вообще действует на мой моральный облик. Прошу предоставить мне новую квартиру». Приехала комиссия, смотрят в окно.
                                                                                                  — Ну и что? Ничего не видно!
                                                                                                  — А вы на шкаф залезьте!
                                                                                                  — Ну, залез, — говорит представитель, — все равно не видно!
                                                                                                  — Двигайтесь левее…
                                                                                                  — Все равно не видно!
                                                                                                  — Еще левее! Тут представитель двигается и падает с края шкафа.
                                                                                                  — Вот видите! А я так целый день!
                                                                                                  Вот и вы так… целый день страдаете…
                                                                                                  Я уже просил пример управления содержимым.
                                                                                                  Сами придумали, сами обиделись. Ещё раз:
                                                                                                  Вы не доказали необходимость этой функции. Вы требуете её, но не подводите основание необходимости решать задачу именно так. Когда же вам на коленке показывают, как функции могут менять отображение в зависимости от других параметров — вы отвергаете решение, ибо вы требуете сделать именно так, как захотелось вашей левой пятке, а не решить задачу.
                                                                                                  То есть инструмент плох, потому что вы им пользоваться не умеете правильно и понимая зачем и почему так.
                                                                                                  Логика уровня
                                                                                                  — Я хочу выходить через стену
                                                                                                  — Но есть же дверь, а стены — твердые, это ограничение физического мира.
                                                                                                  — Нет, мне надо именно через стену проходить, вы ничего не понимаете!

                                                                                                  в остальном ограничения заключаются лишь в навыках программирования. Если делать что-то очень маленькое, то в экселе — да, быстрее, а если что-то серьёзное — то затрачиваемое время на эксель будет уходить всё больше и больше, в сравнении с языками.
                                                                                                  То есть протягивать формулы пользователи не умеют, а писать проги (особенно на каком-нибудь питоне или С++) — влёт? Спасибо за наглядную демонстрацию каши в вашей голове.
                                                                                                  Конкретно ваше — это VBA, скрипты, а не стандартные возможности электронных таблиц, о отсутствии которых я писал в самом начале.
                                                                                                  А поддержка скриптовых языков в программы — это не стандартные возможности? А возможность написать функцию, которую потом можно будет использовать в формула ровно так, как стандартную — это не возможность данных программ?
                                                                                                  Еще раз:
                                                                                                  Вы хвалите языки программирования, потому что под них программисты что угодно напишут, а ругаете Эксель, потому что там расширение должен программист написать. Это не двойные стандарты даже уже. Это писец.
                                                                                                  А после удивляетесь, почему я вам указываю про расшибленный лоб и порезанные руки…
                                                                                                  Вы наверное не знаете, но когда обрабатывают большие объёмы данных с множеством условий — одного if'а мало. О чём я и говорил.
                                                                                                  ДЛЯ НАПИСАНИЯ ТРЕБУЕМОЙ ВАМИ ФУНКЦИИ ТРЕБУЕТСЯ ОДИН IF! ОДИН, бляха-муха, IF! И строчек двадцать кода, если без фанатизма.
                                                                                                  Всё. После чего вы можете писать формулы ровно так, как хотели выше при некоторых ограничениях.
                                                                                                  Но это же нарушает вашу непокобелимую уверенность, что это не вы не умеете использовать инструмент, а инструмент плохой.
                                                                                                  И о чём я не однократно писал — вы просто не работали с достаточно большим объёмом данных.
                                                                                                  О да, с большими объемами (столбами в 5, 8 и не дай бог 100 метров поделенными на метровые сегменты) только вы работаете. Никто больше в мире.
                                                                                                  Хотя да, я в основном по мелочам. Так, полгига оперативочки одним файликом выжрать и норм… Или старые версии ООо ронять путем превышения потоком занимаемого в оперативке размера 1,4 Гб.
                                                                                                    0
                                                                                                    интерпретируемые языки в пример того, что на калькуляторах тормозить будут и куча других инструментов
                                                                                                    Питончик работает довольно быстро. Быстрее экселя точно.
                                                                                                    подобная задача с нуля на языках программирования будет решаться намного дольше
                                                                                                    Какая задача? Писать в одну строку огромные условные конструкции с десятком скобок? Уж да, быстрее и не заблудишься.
                                                                                                    потребует от пользователя намного больших усилий
                                                                                                    Конечному пользователю уж лучше будет пользоваться готовой программой, а не искать в экселе — куда же вбить число.
                                                                                                    Итак, хорошо, какого фига вы в качестве доказательства своей позиции искусственно ограничиваете возможности ПО?
                                                                                                    Я почти в каждом сообщении напоминаю что суть именно в электронной таблице как таковой, а она не обладает данными возможностями. На данном компьютере эксель, а запустил на другом, а там какой-нибудь либре-офис или опен-офис, и гадай будут ли работать эти костыли или нет. Может быть скрипты вообще для безопасности отключены, ибо дыр в них уйма.
                                                                                                    Вы не доказали необходимость этой функции
                                                                                                    Вы просите доказательств очевидного? Любая система обработки данных должна работать с неограниченным (в т.ч. динамическим) объёмом данных, а для этого требуется управление содержимым внутри самой системы. В электронной таблице данной возможности нет. А гарантии работоспособности сторонний костылей нет.
                                                                                                    менять отображение
                                                                                                    if(a>1;=formula;"") — это не управление содержимым, такие данные не сохраняются в ячейке, это примитивное переключение отображения, уровень детсада.
                                                                                                    То есть протягивать формулы пользователи не умеют, а писать проги (особенно на каком-нибудь питоне или С++) — влёт?
                                                                                                    А зачем это пользователю? Один пишет — другой использует. Это называется разделением обязанностей, запишите, а то забудете, как изначальную причину, по которой я поднял данный вопрос.
                                                                                                    А поддержка скриптовых языков в программы
                                                                                                    Дело в электронной таблице.
                                                                                                    Вы хвалите языки программирования, потому что под них программисты что угодно напишут, а ругаете Эксель, потому что там расширение должен программист написать. Это не двойные стандарты даже уже. Это писец.
                                                                                                    Если человек пишет на С++ — он напишет только на нём, практически как и на любом другом языке. Одной только электронной таблицей сыт не будешь, нужны сторонние костыли, гарантии работоспособности которых под другими офисными пакетами — нет.
                                                                                                    Если говорить о VBA (он же бейсик) — то он даёт куда больше возможностей чем вся электронная таблица. Это просто невероятно — аргументировать его необходимость «как расширения», когда только оно одно обладает куда большими возможностями. Это ли не двойные стандарты? Таблица, и необходимый бонус в виде расширения, возможности которого по всем критериям превосходят таблицу, но при этом работоспособность гарантируется только в одной реализации ПО (ms office) и (вероятно) под ограниченным рядом версий (нет гарантии) что стандартные функции управления не изменятся в следующей же версии.
                                                                                                    ДЛЯ НАПИСАНИЯ ТРЕБУЕМОЙ ВАМИ ФУНКЦИИ ТРЕБУЕТСЯ ОДИН IF! ОДИН, бляха-муха… О да, с большими объемами (столбами в 5, 8 и не дай бог 100 метров поделенными на метровые сегменты) только вы работаете. Никто больше в мире.
                                                                                                    Это максимально примитивный пример, постарался сделать доступным для вашего понимания, в жизни всё куда сложнее, там в скобках просто напросто заблудитесь со своими ЕСЛИ(;;).
                                                                                                    Это был всего-лишь «линейный» пример показывающий неопределённость объёма данных. Его можно растянуть вниз (что вы и сделали), можно в сторону, я бы посмотрел, как на электронной таблице вы будете двигать в 3е и 4е измерение, тут стандартные функции вам уже не помогут. А такие вычисления в физике (да и не только) сплошь и рядом. Электронная таблица — очень ограниченный инструмент.

                                                                                                    PS Вы прицепились к моему примеру столбом и теперь заявляете одно и то-же, что это верх возможных вычислений и исходя из этого эксель может всё. А любые другие задачи называете изменением изначального условия — ну просто детский сад.
                                                                      +1
                                                                      На моем компе даже на минималках только 10 фпс. ))
                                                                        +3
                                                                        >Однако когда большинство людей доходят до решения более сложных задач, они стремятся использовать язык VBA, даже не понимая толком, зачем.

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

                                                                        И про понимание и поддержку вы также ошиблись. 10 строк вба кода будут всегда удобнее проще и быстрее 5 этажной формулы из впров и прочих непонятных сочитаний. Что уж говорить об условных операторах… сможет ли пользователь разобрать такой оператор тройной вложенности с отловом ошибок и теми же впрами и ссылками на диапазоны по всей книге?
                                                                          +3
                                                                          10 троллейбусов из буханки из 10, но при этом шикарно! Даже глянцевый блик реализован, круто.
                                                                            +1
                                                                            В качестве идеи — почему бы не стилизовать врагов под привидения, как в Пакмене?
                                                                            как-то так
                                                                            image

                                                                              +1
                                                                              Спасибо большое! Это восхитительно!

                                                                              Недавно обсуждали с коллегами, что в Excel можно автоматизировать построение наглядного графика проекта. Теперь у меня будет хороший аргумент показывающий возможности Excel.
                                                                                +2
                                                                                Жду порт Quake II на ваш движок.
                                                                                  +1
                                                                                  Не могу не оставить вот это здесь.
                                                                                  www.pouet.net/prod.php?which=53021

                                                                                  Конечно тут VBA, и подогнано под конкретные разрешения, но все равно это олдскулл, который тоже стоит увидеть.
                                                                                    +1
                                                                                    Антиалиазинг не помешал бы.
                                                                                    +1
                                                                                    Это конечно здорово, но:
                                                                                    1) Разве хэш медленный, если на каждый вариант клетки лабиринта нужно всего три (всегда по 2 стены) бита? То есть даже если брать медленный sha256, у нас целых 256 бит информации, из которых можно вытащить 64 клетки лабиринта с полными данными о 4 стенах. Не считая что есть более быстрые uniform хэши.
                                                                                    2) Почему такой странный алгоритм лабиринта? Неужели ни Прима, ни Уилсона, не реализовать?
                                                                                      +1
                                                                                      И этот человек просто преподает Excel? Наверно даже у программиста придумавшего Excel отвисла бы челюсть
                                                                                        +1

                                                                                        Хм, "Бухгалтерия Предприятие" на шейдерах? Что-то в этом есть.

                                                                                          +1

                                                                                          Что используется в качестве постоянно тикающего таймера?
                                                                                          Код с телефона не вижу

                                                                                            0
                                                                                            Так, кто-нибудь может к этому мультиплейер прикрутить? =) Будем по сети резаться!

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

                                                                                            Самое читаемое