Bądź tak zły, jak to możliwe

16

Wprowadzenie

Jest to kontynuacja tego wyzwania, w którym wcielasz się w rolę złego bliźniaka tej osoby. Będąc złym, nie chcesz maksymalizować swojego udziału, ale raczej bądź tak niesprawiedliwy, jak to tylko możliwe i nie sprawisz, że stanie się to zbyt oczywiste, dlatego wymyśliłeś następujący schemat:

Powiesz innym, że chcesz być tak sprawiedliwy, jak to możliwe, jak twoje rodzeństwo, a tym samym podzielisz liczbę całkowitą na kawałki o równej długości. Tak więc dla każdej liczby całkowitej znajdziesz odpowiednią liczbę osób, tak aby różnica między największym i najmniejszym kawałkiem była maksymalna.

Na przykład, jeśli masz liczbę całkowitą, 6567którą możesz pozostawić bez zmian, podziel ją na dwie części 65,67lub cztery 6,5,6,7. Daje to następujące maksymalne różnice:

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

Od kiedy tylko chcę być zła, że nie preferują 67nad 7iw ten sposób wyświetli albo 2albo 4.


Kolejny (mniej szczególny przypadek); biorąc pod uwagę liczbę całkowitą, 121131możesz ją podzielić w następujący sposób:

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

Tym razem jest tylko jedno rozwiązanie - mianowicie 3- ponieważ u trzech osób różnica jest maksymalna.

Wyzwanie

Biorąc pod uwagę liczbę całkowitą, określ jakikolwiek możliwy sposób bycia maksymalnie złym i zgłoś liczbę osób potrzebnych do osiągnięcia tego.

Zasady

  • Wejście zawsze będzie wynosić ≥ 1
  • Dane wejściowe mogą być liczbą całkowitą, listą cyfr lub łańcuchem
  • Nie musisz obsługiwać nieprawidłowych danych wejściowych

Przypadki testowe

Musisz tylko zgłosić wynikową liczbę potrzebnych osób, możliwe partycje są tylko dla ilustracji:

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
ბიმო
źródło
1
Zastanawiam się, czy ktoś przedłoży rozwiązanie w języku programowania zło? : D
SK19,

Odpowiedzi:

5

Galaretka ,  16  14 bajtów

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

Monadyczny link pobierający listę liczb całkowitych (cyfr) i zwracający liczbę całkowitą.

Wypróbuj online! lub zobacz zestaw testowy

W jaki sposób?

Ṁ_Ṃ - 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
Jonathan Allan
źródło
Tak, wiem, że nie znasz Pytha! +1, ponieważ galaretowe umysły myślą podobnie! Szkoda ŒṖi ./oba są dłuższe
Pan Xcoder
4

Pyth , 20 bajtów

leoeSaM^N2vcRQ*M{yPl

Wypróbuj tutaj!

Nie używam już partycji, bo okazuje się, że są dłuższe !!! Skończyło się na podzieleniu na podlisty o długości równej dzielnikom długości.

Pan Xcoder
źródło
4

05AB1E , 12 bajtów

gDÑΣôDδαà}θ÷

Wypróbuj online!

05AB1E , 12 bajtów

gDÑΣôàsß-}θ÷

Wypróbuj online!

Jak to działa

gDÑΣôDδαà} θ ÷ | Pełny program

g | Długość (liczba cyfr).
 D | Duplikuj (wepchnij dwie kopie długości na stos).
  Ñ ​​| Zdobądź dzielniki (z góry stosu).
   Σ} | Sortuj według funkcji klucza.
-------------------------------------------------- ------------
    ôDδαà | Kluczowa funkcja # 1.
    ô | Podziel (dane wejściowe) na kawałki tego rozmiaru.
     D | Duplikować.
      δα | Zewnętrzny produkt absolutnej różnicy.
        à | Uzyskaj maksimum.
    ôàsß- | Kluczowa funkcja # 2 (alternatywna).
    ô | Podziel (dane wejściowe) na kawałki tego rozmiaru.
     à | Maksymalny.
      s | Zamień dwa górne elementy.
       ß | Minimum.
        - | Odejmować.
-------------------------------------------------- ------------
          θ ÷ | Podziel długość przez maksymalny element za pomocą niestandardowego sortowania.

05AB1E jest po prostu niesamowicie zwięzły do ​​tego wyzwania.

Pan Xcoder
źródło
4

JavaScript (ES6), 118 115 bajtów

Zaoszczędzono 3 bajty dzięki @ edc65

Pobiera dane wejściowe jako ciąg.

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

Przypadki testowe

Arnauld
źródło
1
Czy próbowałeś eval zamiast RegExp?
edc65
@ edc65 Ciągle o tym zapominam. Dziękuję Ci!
Arnauld,
1

Python 2 , 138 132 bajtów

n=input()
l=len(n)
print len(max([[int(n[l/i*j:][:l/i])for j in range(i)]for i in range(1,l+1)if l%i<1],key=lambda a:max(a)-min(a)))

Wypróbuj online!

ovs
źródło
1

Haskell , 114 bajtów

f n|l<-length n=snd$maximum[(a-b,div l i)|i<-[1..l],mod l i<1,a<-i%n,b<-i%n]
i%[]=[]
i%n=read(take i n):i%drop i n

Wypróbuj online!

Laikoni
źródło