Seja o mais mau possível

16

Introdução

Este é um acompanhamento desse desafio em que você assume o papel de gêmeo maligno dessa pessoa. Sendo mau, você não deseja maximizar sua parte, mas seja o mais injusto possível e não tornará isso muito óbvio, por isso surgiu o seguinte esquema:

Você dirá aos outros que deseja ser o mais justo possível, como seu irmão, e assim dividirá o número inteiro em partes de igual comprimento. Portanto, para cada número inteiro, você terá a quantidade certa de pessoas, de modo que a diferença entre a maior e a menor peça seja máxima.

Por exemplo, se você receber o número inteiro, 6567poderá deixá-lo como está, divida-o em duas partes 65,67ou quatro 6,5,6,7. Isso fornece as seguintes diferenças máximas:

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

Como você só quer ser mau, você não prefere 67mais, 7e assim você produzirá um 2ou outro 4.


Outro (caso menos especial); dado o número inteiro, 121131você pode dividi-lo assim:

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

Desta vez, existe apenas uma solução - ou seja 3-, já que com três pessoas a diferença é máxima.

Desafio

Dado um número inteiro, determine qualquer maneira possível de ser maximamente maligna e relate o número de pessoas necessárias para conseguir isso.

Regras

  • A entrada será sempre ≥ 1
  • A entrada pode ser um número inteiro, lista de dígitos ou sequência
  • Você não precisa lidar com entradas inválidas

Casos de teste

Você só precisa relatar o número resultante de pessoas necessárias, as partições possíveis são apenas para ilustração:

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
ბიმო
fonte
1
Gostaria de saber se alguém irá enviar uma solução na linguagem de programação do mal? : D
SK19

Respostas:

5

Geléia ,  16  14 bytes

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

Um link monádico que obtém uma lista de números inteiros (os dígitos) e retorna um número inteiro.

Experimente online! ou veja uma suíte de testes

Quão?

Ṁ_Ṃ - 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
fonte
Sim, eu sei que você não conhece Pyth! +1 porque as mentes de geléia pensam da mesma forma! Muito ruim ŒṖe ./são ambos mais
Mr. Xcoder
4

Pitão , 20 bytes

leoeSaM^N2vcRQ*M{yPl

Experimente aqui!

Eu não uso mais partições, porque acaba sendo mais !!! Acabei me dividindo em sublistas de comprimento iguais aos divisores do comprimento.

Mr. Xcoder
fonte
4

05AB1E , 12 bytes

gDÑΣôDδαà}θ÷

Experimente online!

05AB1E , 12 bytes

gDÑΣôàsß-}θ÷

Experimente online!

Como funciona

gDÑΣôDδαà} θ ÷ | Programa completo.

g Comprimento (contagem de dígitos).
 D Duplicar (empurre duas cópias do comprimento para a pilha).
  Ñ Obtenha os divisores (da parte superior da pilha).
   |} | Classifique por uma função de tecla.
-------------------------------------------------- ------------
    ôDδαà | Função de tecla # 1.
    ô Divida (a entrada) em pedaços desse tamanho.
     D Duplicado.
      δα Produto externo de diferença absoluta.
        à Obtenha o máximo.
    ôàsß- | Função de tecla # 2 (alternativa).
    ô Divida (a entrada) em pedaços desse tamanho.
     à Máximo.
      s Troque os dois principais elementos.
       ß Mínimo.
        - | Subtrair.
-------------------------------------------------- ------------
          θ ÷ Divida o comprimento pelo elemento máximo usando a classificação personalizada.

05AB1E é incrivelmente conciso para este desafio.

Mr. Xcoder
fonte
4

JavaScript (ES6), 118 115 bytes

Guardado 3 bytes graças a @ edc65

Recebe a entrada como uma sequência.

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

Casos de teste

Arnauld
fonte
1
Você tentou eval em vez de RegExp?
Edc65
@ edc65 Eu continuo esquecendo disso. Obrigado!
Arnauld
1

Python 2 , 138 132 bytes

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)))

Experimente online!

ovs
fonte
1

Haskell , 114 bytes

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

Experimente online!

Laikoni
fonte