• Скидка на чек, алгоритм разбиения?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Во-первых, раз округления до второй цифры после запятой, умножте во время вычисления все суммы на 100 и считайте все копейках. Тогда округления будут до целых чисел - так проще.

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

    Т.е. в вашем примере скидка должна быть 86.1/1086.1. В позиции1 цена будет 9800*(1-86.1/1086.1) = 9023.11 ~ 9024.

    Для этого можно сделать
    item.price = item.price - floor(item.price * discount / total )


    После всех таких операций вам останется вычесть из чека число копеек, не превышающее суммарное количество всех позиций. Сколько их надо вычесть найти легко - подсчитайте сумму чека с новыми ценами и вычтете из нее, сколько должно быть в конце (100000 в вашем примере).

    Дальше можно брать позиции в каком-то порядке и убавлять их цену на 1 копейку. Если чек удешивился недостаточно - то продолжаем цикл. Если удешевили больше чем надо, то текущую позицию разбиваем на 2 позиции: одну с ценой на 1 копейку меньше, но с количеством, сколько осталось скинуть, вторую с изначальной ценой и остаточным количеством. Если чек удешевился как раз, то выходим из цикла. Это работает даже если количества дробные.

    Что-то вроде:
    leftover = ... # сколько осталось скинуть с чека
    foreach item in items:
      if leftover == 0: break
      if item.count > leftover:
        new_item = item
        new_item.count = item.count - leftover
        item.count = leftover
        item.price -= 1
        items.add(new_item)
        break
      else:
        item.price -= 1
        leftover -= item.count


    Есть, правда, один крайний случай. Что делать, если все товары стоят по 0.01 изначально? Можно ли скидывать товар до 0? Если можно, то этот алгоритм работает. Если нет, то такой чек вообще никак нельзя урезать.
    Ответ написан
    Комментировать
  • Чем синхронизировать файлы между 3мя серверами?

    @pfg21
    ex-турист
    syncthing - бесплатный опенсорс
    resilio sync - коммерческий закрытый
    два демона п2п (читай торрент-облако) синхронизации файлов с небольшими отличиями в функциональности.
    оба умеют inotify. оба развиваются. обоим пофих на отвал личей из роя.
    https://www.linux.org.ru/forum/desktop/13719483?la...
    Ответ написан
    2 комментария
  • Как сделать красивый фон, если фото/картинка в вертикальном положении?

    SagePtr
    @SagePtr
    Еда - это святое
    Могу словами описать алгоритм построения изображения:
    1) Вычисляем ширину боковой полосы ((итоговая ширина - исходная ширина) / 2)
    2) Создаём временное изображение шириной с боковую полосу, но на n пикселей шире (в зависимости от силы размытия)
    3) Копируем во временное изображение левую часть картинки (втупую функцией imagecopy), выровняв её по левому краю.
    4) Размываем функцией imagefilter, силу размытия подбирайте сами на свой художественный вкус.
    5) Создаём конечное изображение
    6) Копируем наше размытое изображение в левую часть конечного изображения
    7) Во временное изображение копируем правую часть исходного изображения с выравниванием по правому краю
    8) Повторяем размытие для него
    9) Копируем в конечное изображение по правому краю
    10) Напоследок - копируем исходное изображение в конечное изображение по центру (левая координата = ((конечная ширина - исходная ширина) / 2)
    11) Сохраняем изображение и освобождаем память (впрочем, PHP сам освободит)
    Ответ написан
    Комментировать
  • Имеет ли смысл хранить статику в облаке?

    @Ambrosian
    Да, вполне можно (на поддомене основного домена).
    Плюс - более быстрая параллельная загрузка страницы с нескольких серверов.
    На SEO не влияет.
    Ответ написан
    1 комментарий
  • DNS api.telegram.org доступен у вас?

    sim3x
    @sim3x
    host -t A api.telegram.org 8.8.4.4
    Using domain server:
    Name: 8.8.4.4
    Address: 8.8.4.4#53
    Aliases: 
    
    api.telegram.org has address 149.154.167.200
    api.telegram.org has address 149.154.167.198
    api.telegram.org has address 149.154.167.197
    api.telegram.org has address 149.154.167.199
    Ответ написан
    Комментировать
  • DNS api.telegram.org доступен у вас?

    jasonOk
    @jasonOk
    Легче болтать, чем код писать
    149.154.167.199
    Ответ написан
    Комментировать
  • Как сделать смену пароля root при загрузки debian?

    3vi1_0n3
    @3vi1_0n3
    Из-за первой строчки в /etc/rc.local:
    #!/bin/sh -e
    echo -e не работает просто. Можно попробовать ша-бэнг заменить на
    #!/bin/bash
    Ответ написан
    3 комментария
  • Есть ли готовое решение для развертывания гостевых машин на KVM?

    merryjane
    @merryjane
    Системный администратор
    Есть несколько вариантов:
    1. Запускать не "голый" KVM, а какое-либо облачное решение nebula\openstack. Там есть возможность передовать в гостя псевдоустройство на котором лежит скриптик и который будет запускаться, а в скрипте уже логика может любая.
    2. Использовать систему контроля конфигурации (puppet, chef...). Машины при этом надо будет наливать из заготовленного образа, в котором уже будет присутствовать пакет нужной системы с прописанным в нем сервером.
    3. Тоже самое, что и пункт 2, но реализованное через ansible. То-есть после установки гостя, откуда-то натравливается на него ansible и ставит подключает все что надо.

    Второй и третий пункты требудт чтобы на машинке после установки работала сеть.
    Ответ написан
    Комментировать
  • Есть ли готовое решение для развертывания гостевых машин на KVM?

    Ernillew
    @Ernillew
    Администрирую *nix-системы с 1997 года
    Грузитесь по PXE, загрузочный образ подготовьте, что бы по крону накатывал обновления.
    Что еще нужно?
    Ответ написан
    Комментировать
  • Удаленое управление компьютером. Что почитать?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    начни с ssh
    а почитать для начала можно это
    Ответ написан
    Комментировать