Будь как можно злее

16

Вступление

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

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

Например, если вы получили целое число, 6567вы можете оставить его как есть, разделить его на две части 65,67или четыре 6,5,6,7. Это дает вам следующие максимальные различия:

6567    -> max() = 0
65,67   -> max(|65-67|) = 2
6,5,6,7 -> max(|6-5|,|6-5|,|6-6|,|6-7|,|5-6|,|5-7|,|6-7|) = 2

Так как вы только хотите быть злыми вы не предпочитаете 67более 7и , таким образом , вы будете выводить либо 2или 4.


Другое (менее частный случай); учитывая целое число, 121131вы можете разделить его следующим образом:

121131      -> max() = 0
121,131     -> max(|121-131|) = 10
12,11,31    -> max(|12-11|,|12-31|,|11-31|) = 20
1,2,1,1,3,1 -> max(…) = 2

На этот раз есть только одно решение, а именно 3- с тремя людьми разница максимальна.

Вызов

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

правила

  • Вход всегда будет ≥ 1
  • Ввод может быть целым числом, списком цифр или строкой
  • Вам не нужно обрабатывать неверные данные

Testcases

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

In -> splits (difference) -> Out
1 -> [1] (0) -> 1
10 -> [1,0] (1) -> 2
11 -> [11] or [1,1] (0) -> 1 or 2
12 -> [1,2] (1) -> 2
42 -> [4,2] (2) -> 2
101 -> [1,0,1] (1) -> 3
2222 -> [2222] or [22,22] or [2,2,2,2] (0) -> 1 or 2 or 4
6567 -> [65,67] or [6,5,6,7] (2) -> 2 or 4
123000 -> [123,000] (123) -> 2
123001 -> [123,001] (122) -> 2
121131 -> [12,11,31] (20) -> 3
294884 -> [294,884] (590) -> 2
192884729 -> [192,884,729] (692) -> 3
123456189012 -> [123456,189012] (65556) -> 2
123457117346 -> [1234,5711,7346] (6112) -> 3
ბიმო
источник
1
Интересно, кто-нибудь представит решение на языке программирования зло? : D
SK19

Ответы:

5

Желе ,  16  14 байтов

Ṁ_Ṃ
sLÆD$ḌÇÞṪL

Монадическая ссылка, берущая список целых чисел (цифр) и возвращающая целое число.

Попробуйте онлайн! или увидеть тестовый набор

Как?

Ṁ_Ṃ - Link 1, maximal difference: list of numbers
Ṁ   - maximum
  Ṃ - minimum
 _  - subtract

sLÆD$ḌÇÞṪL - Main link: list of numbers, theDigits  e.g. [1,2,3,0,0,1]
    $      - last two links as a monad:
 L         -   length                                    6
  ÆD       -   divisors                                  [1,2,3,6]
s          - split into chunks (vectorises)              [[[1],[2],[3],[0],[0],[1]],[[1,2],[3,0],[0,1]],[[1,2,3],[0,0,1]],[[1,2,3,0,0,1]]]
     Ḍ     - from decimal (vectorises)                   [[1,2,3,0,0,1],[12,30,1],[123,1],[123001]]
       Þ   - sort by:
      Ç    -   call last link (1) as a monad              3             29        122     0
           -                                         ... [[123001],[1,2,3,0,0,1],[12,30,1],[123,1]]
        Ṫ  - tail                                        [123,1]
         L - length                                      2
Джонатан Аллан
источник
Да, я знаю, что ты не знаешь Pyth! +1 потому что умы желе думают одинаково! Жаль, ŒṖи ./оба длиннее
мистер Xcoder
4

Pyth , 20 байтов

leoeSaM^N2vcRQ*M{yPl

Попробуй это здесь!

Я больше не использую разделы, потому что это оказывается дольше !!! В итоге я разбился на подсписки длины, равные делителям длины.

Мистер Xcoder
источник
4

05AB1E , 12 байтов

gDÑΣôDδαà}θ÷

Попробуйте онлайн!

05AB1E , 12 байтов

gDÑΣôàsß-}θ÷

Попробуйте онлайн!

Как это устроено

gDÑΣôDδαà} θ ÷ | Полная программа.

г | Длина (количество цифр).
 D | Дублируйте (вставьте две копии длины в стек).
  С | Получите делители (вершины стека).
   Σ} | Сортировать по ключевой функции.
-------------------------------------------------- ------------
    ôDδαà | Ключевая функция # 1.
    ô | Разделить (вход) на куски такого размера.
     D | Дубликат.
      δα | Наружный продукт абсолютной разницы.
        а | Получи максимум.
    оса- | Ключевая функция № 2 (альтернатива).
    ô | Разделить (вход) на куски такого размера.
     а | Максимум.
      с | Поменяйте местами два верхних элемента.
       ß | Минимум.
        - | Вычитание.
-------------------------------------------------- ------------
          θ ÷ | Разделите длину на максимальный элемент, используя пользовательскую сортировку.

05AB1E просто невероятно лаконичен для этой задачи.

Мистер Xcoder
источник
4

JavaScript (ES6), 118 115 байт

Сохранено 3 байта благодаря @ edc65

Принимает ввод в виде строки.

f=(s,k=l=s.length,m)=>k?f(s,k-1,l%k||(d=Math.max(...a=s.match(eval(`/.{${l/k}}/g`)))-Math.min(...a))<m?m:(r=k,d)):r

Контрольные примеры

Arnauld
источник
1
Вы пробовали eval вместо RegExp?
edc65
@ edc65 Я постоянно забываю об этом. Спасибо!
Арно