Ответы пользователя по тегу Алгоритмы
  • Как реализовать алгоритм группировки массива по значению?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Решение в лоб: создаете ассоциативный массив, где ключ - время, значение - массив дней недели. И просто проходите каждый элемент $openingHours, берете с него время, проверяете, есть ли оно в нашем созданном массиве, если нет, создаем и добавляем туда день, если есть, то просто добавляем туда день.
    Ну, потом уже пишите функцию, которая преобразует наш созданный массив в тот, что вам нужно. Это тоже довольно просто, смотрим ключ, берем его значения, соединяем их через разделитель -, и используем как ключ в новом массиве.
    Ответ написан
    1 комментарий
  • Простой векторный графический редактор?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Ну, если бы на все задачи можно было найти точные инструкции, было бы скучно.
    Пробуйте написать начиная с малого, например:
    1) Создайте холст, просто объект, который будет помещать в себя фигуры. Это будет некий viewport.
    2) Сделайте скролл этого холста мышкой, во все стороны.
    3) Сделайте возможность динамически добавлять объекты на холст, сначала определите базовый объект, например прямоугольник или линию. Легче на этом моменте сразу определить интерфейс IShape, таким образом дальше будет легче унифицировать все объекты при добавлении их на холст, да и холст ничего не должен знать об этих объектах, только об интерфейсе.
    4) Сделайте drag&drop добавленных объектов, чтобы их можно было тащить.
    5) Добавьте зум, это не простой шаг, тут нужно многое учитывать, особенно часто на этой задаче ломается позиционирование drag&drop объектов.
    6) Сделайте трансформатор объектов, который будет изменять их размер (для прямоугольников и.т.д.), менять точки (для линий), вращать и.т.д.
    7) Сделайте редактор свойств, через который будете назначать атрибуты вашим объектам, такие как цвет заливки, цвет рамки, ширина рамки, непрозрачность и.т.д.
    8) Добавляйте потихоньку различные объекты. Можете подглядывать в другие редакторы, например inkscape.
    9) Реализуйте сохранение и загрузку холста. Тут лучше не изобретать свой формат данных, а использовать открытый, например svg.
    10) Буфер обмена. Тут либо свой формат в бинарник, либо тот же самый svg в текстовом виде (что куда лучше, так сделано в фигме).
    11) Отменить/вернуть - важная штука, и на первый взгляд простая. Но простая она только в том случае, если запоминать шаги путем снимка всех текущих объектов, но этот способ плохой. По нормальному нужно при любой операции над объектами на холсте делать снимок изменений. Например подвинули кубик на 10px влево, и записали в память значение
    { id: 'id кубика', x: -10 }
    и потом при нажатии отмена, будете просто делать обратную операцию, добавлять эти 10px. Тут у вас возникнут сложность с операцией "возврат", но думаю, если вы дошли до этого шага, упорство у вас уже есть. Пригодятся паттерны: command и memento
    12) Ну, тут уже по мелочи, различные киллер фичи, новые объекты, свойства, различные меню и.т.д.
    Ответ написан
    1 комментарий
  • Научится алгоритмическому мышлению?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Тут на самом деле все просто. Решение задач + просмотр чужих решений + чтение соответствующей литературы (чтобы принимать чужой опыт).
    Ответ написан
    2 комментария
  • Алгоритм пропорционального ресайза элемента?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Вот фрагмент из моего проекта

    if (isProportional) {
                            // Тянем за низ или вверх.
    			if (changeHeight) {
    				const rh = this.state.startParams.object.height / object.height; // Получаем соотношение начальной высоты к измененной
    				object.width = this.state.startParams.object.width / rh; // полученное соотношение применяем для ширины
    			} else if (changeWidth) { // Тянем влево или вправо
    				const rw = this.state.startParams.object.width / object.width; // Получаем соотношение начальной ширины  к измененной
    				object.height = this.state.startParams.object.height / rw; // полученное соотношение применяем для высоты
    			}
    		}
    Ответ написан
  • Алгоритм разделения слов, которые, при опечатке, случайно "склеились" (написаны без пробела)?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Мне кажется, даже если есть, то работает фигово. Например слово
    бакалея - бак алея (не путать с аллеей). Бой_кий, воз_лежать, жар_кий, кино_театр, ком_пас, бор_мотать.
    Мне кажется, даже с использованием машинного обучения возникнут неточности.
    Ответ написан
  • Алгоритм нахождения синуса любого угла?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Гуглите - приближенное вычисление синуса (подставьте нужную).
    Дело в том, что нет четкой формулы для нахождения значений этих функций, есть только приближенные, которые можно вычислять с заданной точностью, чем выше точность, тем дольше будет вычисляться.
    Ответ написан
  • Алгоритм равномерного распределения заявок?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Если в пачках строгое кол-во заявок, то можно отсортировать эту пачку по убыванию, и итерируя снизу (с большого) давать человеку с минимальным количеством заявок.
    UPD: Как-то так получается https://jsfiddle.net/zxhonma2/
    Ответ написан
    Комментировать
  • Как работает система "без убытка" в казино?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Все просто. Если вероятность победы всегда будет меньше 50% (даже 49%), то в долгосрочной перспективе, игрок всегда будет уходить в минус, а казино в плюс. Это как рулетка: 18 красных, 18 черный и зеро. При ставке на любую позицию, вероятность победы будет <= 18/(18 + 18 + 1) = ~0.486 Поэтому, грубо говоря, на 100 игр, пользователь побеждает 48 игр, а 52 проигрывает. 2 игры уходят в банк.
    Если же использовать вероятность 50%, то нужно делать комиссию, поставил 1, победил 0.8.
    С этими двумя способами, даже Мартингейл игроку не поможет. Главное, чтобы в случайном исходе небыло закономерностей, иначе даже простенький скрипт позволит пользователю выходить в плюс.
    Выходит вроде и честно, без обмана, без накруток, и гарантированно прибыльно для казино.
    Ответ написан
    2 комментария