Будьте максимально злі


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
  • Введенням може бути ціле число, список цифр або рядок
  • Вам не доведеться обробляти недійсні введення

Тестові шафи

Вам потрібно лише повідомити про необхідну кількість людей, можливі розділи - лише для ілюстрації:

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

Так, я знаю, ти не знаєш Піта! +1 тому, що желейні розуми думають однаково! Шкода ŒṖі ./обидва довші
містер Xcoder

4

Pyth , 20 байт

leoeSaM^N2vcRQ*M{yPl

Спробуйте тут!

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


4

05AB1E , 12 байт

gDÑΣôDδαà}θ÷

Спробуйте в Інтернеті!

05AB1E , 12 байт

gDÑΣôàsß-}θ÷

Спробуйте в Інтернеті!

Як це працює

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

г | Довжина (кількість цифр).
 Д | Дублікат (натисніть дві копії довжини до стеку).
  Ñ ​​| Отримайте дільники (верхньої частини стека).
   Σ} | Сортувати за ключовою функцією.
-------------------------------------------------- ------------
    ôDδαà | Основна функція №1.
    ô | Розділіть (вхід) на шматки такого розміру.
     Д | Дублікат.
      δα | Зовнішній продукт абсолютної різниці.
        à | Отримайте максимум.
    ôàsß- | Основна функція №2 (альтернатива).
    ô | Розділіть (вхід) на шматки такого розміру.
     à | Максимум.
      s | Поміняйте два верхні елементи.
       ß | Мінімум.
        - | Відняти.
-------------------------------------------------- ------------
          θ ÷ | Розділіть довжину на максимальний елемент за допомогою спеціального сортування.

05AB1E просто неймовірно складний для цього завдання.


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

Тестові справи


1
Ви спробували eval замість RegExp?
edc65

@ edc65 Я про це забуваю. Дякую!
Арнольд




Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.