可能な限り悪である


16

前書き

これは、あなたがその人の邪悪な双子の役割を担っているこの挑戦のフォローアップです。悪であるため、シェアを最大化するのではなく、可能な限り不公平になり、それをあまりにも明白にしないため、次のスキームを思いつきました。

兄弟のようにできるだけ公平になりたいことを他の人に伝え、整数を等しい長さの断片に分割します。したがって、整数ごとに、適切な人数の人々を見つけて、最大のピースと最小のピースの差が最大になるようにします。

たとえば、整数6567を指定した場合、そのままにして、2つ65,67または4 つに分割できます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ため、あなたは出力のどちらかでしょう24


別の(あまり特別なケースではない); 整数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

今回は1つの解決策しかありません。つまり3、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

うん、あなたはPythを知らないことを知っています!ゼリーの心が同じように考えるので+1!あまりにも悪いŒṖ./の両方の長い
氏Xcoder


4

05AB1E、12バイト

gDÑΣôDδαà}θ÷

オンラインでお試しください!

05AB1E、12バイト

gDÑΣôàsß-}θ÷

オンラインでお試しください!

使い方

gDÑΣôDδαà}θ÷| 完全なプログラム。

g | 長さ(桁数)。
 D | 複製(長さの2つのコピーをスタックにプッシュ)。
  Ñ| (スタックの最上部の)除数を取得します。
   Σ} | キー機能で並べ替えます。
-------------------------------------------------- ------------
    ôDδαà| キー機能#1。
    ô| (入力)をそのサイズのチャンクに分割します。
     D | 複製。
      δα| 絶対差の外積。
        à| 最大値を取得します。
    ôàsß-| キー機能#2(代替)。
    ô| (入力)をそのサイズのチャンクに分割します。
     à| 最大。
      s | 上の2つの要素を入れ替えます。
       ß| 最小。
        -| 引く。
-------------------------------------------------- ------------
          θ÷| カスタムソートを使用して、長さを最大要素で割ります。

05AB1Eは、この課題に対して非常に簡潔です。


4

JavaScript(ES6)、118 115バイト

@ edc65のおかげで3バイト節約

入力を文字列として受け取ります。

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
RegExpの代わりにevalを試しましたか?
edc65

@ edc65そのことを忘れ続けています。ありがとうございました!
アーナルド




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.