Mümkün olduğunca kötü olun


16

Giriş

Bu, o kişinin kötü ikizinin rolünü üstlendiğiniz bu zorluğun bir devamıdır. Kötülük olarak, payınızı en üst düzeye çıkarmak istemezsiniz, ancak mümkün olduğunca haksız olun ve bunu çok açık hale getirmeyeceksiniz, bu yüzden aşağıdaki şemayı buldunuz:

Diğerlerine kardeşiniz gibi olabildiğince adil olmak istediğinizi söyleyeceksiniz ve böylece tamsayıyı eşit uzunlukta parçalara ayıracaksınız. Böylece her tamsayı için en büyük ve en küçük parça arasındaki farkın maksimum olacağı şekilde doğru miktarda insan bulursunuz.

Örneğin 6567, olduğu gibi bırakabileceğiniz bir tam sayı verilirse, iki parçaya 65,67veya dörde bölün 6,5,6,7. Bu size aşağıdaki maksimum farkları verir:

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

Yalnızca kötü olmasını istediğim için tercih yok 67üzerinde 7ve böylece çıkış ya olacak 2ya 4.


Başka (daha az özel durum); tamsayı göz önüne alındığında şu 121131şekilde bölebilirsiniz:

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

Bu kez sadece bir çözüm var - yani 3- üç kişiyle fark maksimum.

Meydan okuma

Bir tamsayı belirlemek Verilen herhangi maksimum kötü olarak olası bir yol ve rapor insan sayısını bunu başarmak için gerekli.

kurallar

  • Giriş her zaman ≥ 1 olacaktır
  • Giriş bir tamsayı, rakam listesi veya dize olabilir
  • Geçersiz girdileri işlemek zorunda değilsiniz

testcases

Sadece gerekli sayıda insanı bildirmeniz gerekir, olası bölümler sadece örnekleme amaçlıdır:

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
Birinin programlama dilinde kötü bir çözüm sunup sunmayacağını merak ediyorum. : D
SK19

Yanıtlar:


5

Jöle ,  16  14 bayt

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

Tamsayıların (rakamların) listesini alan ve bir tamsayı döndüren monadik bir bağlantı.

Çevrimiçi deneyin! veya bir test takımına bakın

Nası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

Evet, Pyth bilmediğini biliyorum! +1 çünkü Jelly zihinleri benzer düşünür! Çok kötü ŒṖve ./her ikisi de daha uzun
Bay Xcoder

4

Pyth , 20 bayt

leoeSaM^N2vcRQ*M{yPl

Burada deneyin!

Artık bölüm kullanmıyorum, çünkü daha uzun olduğu ortaya çıktı !!! Uzunluğun bölenlerine eşit uzunlukta alt listelere ayrıldım.


4

05AB1E , 12 bayt

gDÑΣôDδαà}θ÷

Çevrimiçi deneyin!

05AB1E , 12 bayt

gDÑΣôàsß-}θ÷

Çevrimiçi deneyin!

Nasıl çalışır

gDÑΣôDδαà} θ ÷ | Tam program.

g | Uzunluk (basamak sayısı).
 D | Çoğalt (uzunluğun iki kopyasını desteye itin).
  Ñ ​​| (Yığının üstünden) bölücüler alın.
   Σ} | Bir tuş işlevine göre sıralayın.
-------------------------------------------------- ------------
    ôDδαà | Tuş işlevi # 1.
    ô | (Girdi) bu boyuttaki parçalara bölün.
     D | Çiftleme.
      |α | Mutlak farkın dış ürünü.
        à | Maksimum değeri alın.
    ôàsß- | Tuş işlevi # 2 (alternatif).
    ô | (Girdi) bu boyuttaki parçalara bölün.
     à | Maksimum.
      s | En iyi iki öğeyi değiştirin.
       ß | Asgari.
        - | Çıkarın.
-------------------------------------------------- ------------
          θ ÷ | Özel sıralamayı kullanarak uzunluğu maksimum öğeye bölün.

05AB1E bu meydan okuma için inanılmaz derecede aldatıcı.


4

JavaScript (ES6), 118 115 bayt

@ Edc65 sayesinde 3 bayt kaydedildi

Girişi dize olarak alır.

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

Test senaryoları


1
RegExp yerine eval denediniz mi?
edc65

@ edc65 Bunu unutmaya devam ediyorum. Teşekkür ederim!
Arnauld

1

Python 2 , 138131 bayt

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

Çevrimiçi deneyin!




Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.