가능한 한 악해


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

이번에는 단 하나의 솔루션이 있습니다. 즉 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 | 복제합니다 (길이의 사본 두 개를 스택에 밀어 넣습니다).
  Ñ ​​| 제수를 가져옵니다 (스택 상단).
   Σ} | 키 기능별로 정렬하십시오.
-------------------------------------------------- ------------
    ôDδαà | 주요 기능 # 1.
    ô | (입력)을 해당 크기의 덩어리로 나눕니다.
     D | 복제.
      δα | 절대 차이의 외부 곱.
        à | 최대 값을 얻으십시오.
    ôàsß- | 키 기능 # 2 (대체).
    ô | (입력)을 해당 크기의 덩어리로 나눕니다.
     à | 최고.
      s | 상단 두 요소를 교체하십시오.
       ß | 최저한의.
        -| 덜다.
-------------------------------------------------- ------------
          θ ÷ | 사용자 정의 정렬을 사용하여 길이를 최대 요소로 나눕니다.

05AB1E는이 도전에 대해 엄청나게 간결합니다.


4

자바 스크립트 (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 나는 그 것을 잊고있다. 감사합니다!
Arnauld




당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.