• Какие есть Алгоритмы генерации сетки Судоку?

    Adamos
    @Adamos
    Вряд ли кто-либо, всерьез занимавшийся программированием головоломок, мог не видеть коллекцию от Simon Tatham - с открытой лицензией и исходниками.
    Ответ написан
    Комментировать
  • Алгоритм Евклида?

    Alexandroppolus
    @Alexandroppolus
    кодир
    если a < b, то a%b всегда равно a
    Ответ написан
  • Алгоритм Евклида?

    @AlexSku
    не буду отвечать из-за модератора
    Да. На первом этапе a и b обмениваются местами (т.е. следующий вызов будет gcd(456, 243), так что а всегда больше b, до тех пор пока b не станет равным 0.
    Ответ написан
    1 комментарий
  • Зачем писать .to_string() при объявлении строки?

    vabka
    @vabka Куратор тега Rust
    Есть хорошая статья: https://habr.com/ru/post/274485/

    У строковых литералов тип &'static str. Тоесть это заимствованная ссылка на объект с неограниченным временем жизни.
    А to_string возвращает уже owned строку типа std::string::String

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

    Если ты хочешь получить именно String из строкового литерала, то есть сразу несколько вариантов, включая показанный:
    let a: String = String::from("a");
    let b: String = "b".to_string();
    let c: String = "c".into(); // или "c".into::<String>(), если не указывать тип явно.
    let d: String = "d".to_owned();
    Ответ написан
    Комментировать
  • Инвариант в линейном поиске?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    1. A[i] ∈ A
    2. i ∈ {0, ...A.length - 1} или i ∈ {}

    Как по мне, такой инвариант будет несколько бесполезен, поскольку не позволяет доказать правильность алгоритма (по индукции). Также "или i ∈ {}" ещё более бесполезное дополнение к условию, поскольку, хоть и не делает инвариант неверным, но делает его слабее, ведь внутри цикла (да и после него) в i всегда какое-то число.

    Имхо, хороший инвариант:
    В элементах A с индексами до [i-1] включительно не содержится v.
    Ответ написан
    Комментировать
  • ТАУ, Солодовников, стоит ли читать?

    @pfg21
    ex-турист
    ТАУ не устареет, ибо основано на высшей математике :)
    то что прослушал и ни.... не понял в ТАУ это нормально.
    Ответ написан
    2 комментария
  • Какой алгоритм вычисления кратности чисел более эффективен?

    Adamos
    @Adamos
    Если нужно определить кратность - то берем учебник Математика, 6 класс.
    Глава Признаки кратности 3, 5 и 9 с минимумом вычислений.
    Если же нужно заполнить массив - то потери времени на его заполнение, да в жабоскрипте, на порядки превышают стоимость этой простенькой проверки.
    Может ускорить (а может и замедлить) этот процесс замена в цикле ++i на прибавление того числа, которое действительно надо прибавить для получения следующего кратного - оно циклично повторяется: [3, 2, 1, 3, 1, 2, 3]. Проверка уберется, но вычислений, на самом деле, только прибавится. Зато без ветвления и пустых циклов.
    Ответ написан
    1 комментарий
  • Какой алгоритм вычисления кратности чисел более эффективен?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Судя по названию функции (sum) вам надо найти сумму чисел. Это делается в одно действие без циклов вообще.

    Если бы были нужны только числа делящееся на 3, то их сумма - f(n, 3)=3*floor(n/3)(floor(n/3)+1)/2. Эта формула получается вынесением 3 за скобки в сумме и дальше применением формулы армфметической прогрессии.

    Чтобы взять сумму делящихся на 3 или 5 надо взять сумму делящихся на 3, прибавить сумму делящихся на 5 и вычесть сумму делящихся на 15. Потому что делящиеся на 15 были подсчитанны 2 раза в первых слагаемых. Т.е. ответ - f(n,3)+f(n,5)-f(n,15)
    Ответ написан
    Комментировать
  • Баг тайпчекинга параметров функции?

    WblCHA
    @WblCHA
    Потому что АВ ─ это частный случай А.
    Грубо говоря, тайпскрипт сравнивает не названия интерфейсов, а их свойства и их типы. То есть ты можешь передавать любой тип, который является частным случаем типа, который необходим.
    Если поменяешь в АВ тип свойства а на string, то ошибка сразу же появится.
    Ответ написан
    9 комментариев
  • Это правильная реализация бинарного поиска?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Работает медленно, потому что вы обрезаете входной массив каждый раз. Для этого приходится обходить и копировать всю нужную часть. Поэтому суммарное время работы будет O(n).

    Чтобы работало быстро вам надо не менять lst, а помнить индексы границ текущего куска.

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

    И последнее, в питоне есть операция целочисленного деления - //. Используйте ее вместо приведения к int после деления.
    Ответ написан
    2 комментария
  • Как правильно подсказать тайпскрипту про вывод типа в шаблонной функции?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Вариант 1, использовать кастомный тайп гвард:
    type Value<T> = (() => T) | T
    
    function isFunctionValue<T>(value: Value<T>): value is () => T {
        return typeof value === 'function'
    }
    
    function funcStr(value: Value<string>): string {
      return isFunctionValue(value) ? value() : value
    }
    
    function funcTpl<T>(value: Value<T>): T {
      return isFunctionValue(value) ? value() : value
    }


    Вариант 2, исключить возможность функции из T:
    type Value<T> = T extends (...args: never[]) => unknown ? never : (() => T) | T
    
    function funcStr(value: Value<string>): string {
      return typeof value === 'function' ? value() : value
    }
    
    function funcTpl<T>(value: Value<T>): T {
      return typeof value === 'function' ? value() : value
    }
    Ответ написан
    4 комментария
  • Почему невозможно установить заголовки после их отправки клиенту?

    delphinpro
    @delphinpro
    frontend developer
    Как устроен HTTP протокол, вы конечно же не знаете?
    Вкратце:
    Это текстовый формат.
    Сначала идут заголовки
    Потом двойной перевод строки
    Потом данные страницы

    Заголовок1=значение
    Заголовок2=значение
    Заголовок3=значение
    
    Тело страницы ....


    Если отправить данные, то заголовки куда втыкать?
    Ответ написан
    Комментировать
  • Почему невозможно установить заголовки после их отправки клиенту?

    @abberati
    frontend-разработчик
    Почему нельзя дожарить картошку после того, как съел её?
    Ответ написан
    Комментировать
  • Как решить Марианскую впадину в познаниях математики?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    Для программирования в 90% случаев не нужна математика.
    Но вот логику она развивает. Пути 2 - брать учебники и решать задачки самому или нанять репетитора и делать все тоже самое, но с его помощью. По последнему, для сдачи ЕГЭ, скорее всего, все равно пойти придется.
    Да, все так просто и никто тебе таблетку волшебную тут не даст.
    Ответ написан
  • Геометрическая прогрессия и сложный процент это одно и то же?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Нет. Распишите формулы, они будут разные. В прогрессии каждый раз добавляется степень коэффициента q. В проценте происходит домножение на (1+q):
    A+Aq+Aq^2+Aq^3+...
    A+Aq+(Aq+Aq^2)+(Aq+2*Aq^2+Aq^3)+...
    Ответ написан
    Комментировать
  • В чем преимущество "фабричного метода" перед простым созданием объектов?

    @xfg
    Проблема, которую решает фабричный метод - это возможность отложить создание объекта на попозже. Скажем, у вас имеется некий алгоритм, в котором на одном из шагов требуется создание объекта. Вы знаете, что у вас может быть несколько различных реализаций такого объекта. Тогда вы можете создать фабричный метод и использовать его в своем алгоритме для создания объекта. Это позволяет вам переложить ответственность по созданию объекта на подклассы и таким образом написать общий алгоритм не привязываясь к конкретной реализации объекта.

    Советую для понимания посмотреть пример в англоязычной википедии и там же реализацию на Java. Суть в том, что у вас есть игра лабиринт. И есть два режима игры, обычный - когда игрок может перемещаться из комнаты только в смежную комнату и магический режим - когда игрок может перемещаться в любую комнату. Алгоритм самой игры для обоих режимов один и тот же, а вот бизнес-правила перемещения игрока по комнатам - разные. Вы реализуете эти бизнес-правила в OrdinaryRoom и MagicRoom, а в самом алгоритме игры вместо того, чтобы создавать какой-то из этих объектов - вызываете просто абстрактный метод makeRoom(). А затем создаете два подкласса, которые будут реализовывать метод makeRoom и возвращать нужный тип комнаты. Таким образом вы получаете два различных режима игры написав один алгоритм.

    Вообще смысл данного шаблона довольно сложно понять. В интернете его почти всегда объясняют неверно. Прямо как пример на C#. Это совсем не то, о чем писали в книге банды четырех. Пример соответствующий тому о чем рассказывается в книге реализован в примере на Java. Нужно приложить усилия и постараться вникнуть в идею. Можно перед этим изучить Template method, его проще понять, там похожая идея, только там вы перекладываете часть поведения на подклассы, а здесь перекладываете создание объекта на подклассы. Factory method практически всегда используется в связке с Template method если мы говорим о классической реализации шаблона из книги банды четырех.

    Вообще шаблон не настолько распространенный насколько может показаться. Мне с 2002 года в моей практике не пригодился ни разу.
    Ответ написан
    2 комментария
  • Как внутри класса вызвать метод другого класса?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Обычно, если один класс зависит от другого, то такие зависимости передают в конструктор:
    class Name1 {
      method1() {
        console.log(1);
      }
    }
    
    class Name2 {
      constructor(name1) {
        this.name1 = name1;
      }
    
      method2() {
        this.name1.method1();
      }
    }
    
    const name2 = new Name2(new Name1());
    name2.method2()

    А для обычного процедурного кода незачем плодить классы, JS - это не C# и не Java, тут можно создавать обычные функции
    Ответ написан
    Комментировать
  • Расставить ромбики в нужных координатах, ориентируясь на виртуальные координаты?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно трансформировать canvas: сжать по вертикали и повернуть на 45°. Теперь, если рисовать квадраты — получатся ромбики!

    Только Y-координата идёт сверху вниз – тут уж сами разберётесь. Наклоните голову влево, чтобы сориентироваться )


    А тут можно перемещаться стрелочками и A-S-D-W. Кликните внутри фрейма, чтобы клавиши заработали:
    Ответ написан
    8 комментариев
  • Расставить ромбики в нужных координатах, ориентируясь на виртуальные координаты?

    Seasle
    @Seasle Куратор тега JavaScript
    Это называется изометрия. Можете посмотреть эти видео:
    Ответ написан
    Комментировать
  • Расставить ромбики в нужных координатах, ориентируясь на виртуальные координаты?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Координаты центра ромба {x,y} - {130/2*(x-y), 84/2*(x+y)}

    Эту формулу можно вывести, например, не зная вообще ничего. Просто проведите все вертикальные линии через все центры ромбов. Какие ромбы лежат на одной прямой? Немного посмотрев, можно заметить, что это те, у которых разность координат одинаковая. Аналогично, проведя горизонтальные линии - можно заметить, что на одной горизонтали лежат ромбы с равной суммой координат.

    Далее надо найти координаты нескольких прямых и можно вывести формулу.

    Второй вариант - через геометрию векторов (это линейная алгебра, или еще нет - как это в школе-то называется вообще?). Нарисуйте вектор из ромба {0,0} в ромбы {1,0} и {0,1}. Ясно, что ромб с координатами {x,y} можно получить сложив x раз первый вектор и y раз второй. Подставляя координаты получите ту же формулу.
    Ответ написан
    Комментировать