Menjadi seburuk mungkin


16

pengantar

Ini adalah tindak lanjut dari tantangan ini di mana Anda berperan sebagai kembaran jahat orang itu. Menjadi jahat Anda tidak ingin memaksimalkan bagian Anda, tetapi bersikap tidak seadil mungkin dan Anda tidak akan membuatnya terlalu jelas, itu sebabnya Anda menemukan skema berikut:

Anda akan memberi tahu yang lain bahwa Anda ingin seadil mungkin seperti saudara Anda dan dengan demikian Anda akan membagi bilangan bulat menjadi potongan-potongan dengan panjang yang sama. Jadi untuk setiap bilangan bulat Anda akan menemukan jumlah orang yang tepat sehingga perbedaan antara bagian terbesar dan terkecil adalah maksimal.

Misalnya, jika Anda diberi bilangan bulat, 6567Anda dapat membiarkannya apa adanya, membaginya menjadi dua bagian 65,67atau empat 6,5,6,7. Ini memberi Anda perbedaan maksimal berikut:

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

Karena Anda hanya ingin menjadi jahat Anda tidak memilih 67lebih 7dan dengan demikian Anda akan menampilkan baik 2atau 4.


Lain (kasus kurang istimewa); diberi bilangan bulat 121131Anda dapat membaginya seperti ini:

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

Kali ini hanya ada satu solusi - yaitu 3- karena dengan tiga orang perbedaannya maksimal.

Tantangan

Diberikan bilangan bulat menentukan cara apa pun yang memungkinkan untuk menjadi jahat secara maksimal dan melaporkan jumlah orang yang diperlukan untuk mencapai hal ini.

Aturan

  • Masukan akan selalu ≥ 1
  • Input dapat berupa bilangan bulat, daftar angka atau string
  • Anda tidak harus menangani input yang tidak valid

testcases

Anda hanya perlu melaporkan jumlah orang yang diperlukan, partisi yang mungkin hanya untuk ilustrasi:

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
Saya ingin tahu apakah seseorang akan mengajukan solusi jahat dalam bahasa pemrograman? : D
SK19

Jawaban:


5

Jelly ,  16  14 byte

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

Tautan monadik yang mengambil daftar bilangan bulat (digit) dan mengembalikan bilangan bulat.

Cobalah online! atau lihat test-suite

Bagaimana?

Ṁ_Ṃ - 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

Yup, aku tahu kamu tidak tahu Pyth! +1 karena pikiran Jelly berpikir sama! Sayang sekali ŒṖdan ./keduanya lebih lama
Tn. Xcoder

4

Pyth , 20 byte

leoeSaM^N2vcRQ*M{yPl

Coba di sini!

Saya tidak lagi menggunakan partisi, karena ternyata lebih panjang !!! Saya akhirnya membelah menjadi daftar panjang yang sama dengan pembagi panjang.


4

05AB1E , 12 byte

gDÑΣôDδαà}θ÷

Cobalah online!

05AB1E , 12 byte

gDÑΣôàsß-}θ÷

Cobalah online!

Bagaimana itu bekerja

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

g | Panjang (hitungan digit).
 D | Duplikat (dorong dua salinan panjangnya ke tumpukan).
  Ñ ​​| Dapatkan pembagi (dari atas tumpukan).
   Σ} | Urutkan berdasarkan fungsi tombol.
-------------------------------------------------- ------------
    ôDδαà | Fungsi tombol # 1.
    ô | Membagi (input) menjadi potongan-potongan ukuran itu.
     D | Duplikat.
      δα | Produk luar dari perbedaan absolut.
        à | Dapatkan yang maksimal.
    ôàsß- | Fungsi kunci # 2 (alternatif).
    ô | Membagi (input) menjadi potongan-potongan ukuran itu.
     à | Maksimum.
      s | Tukar dua elemen teratas.
       ß | Minimum.
        - | Mengurangi.
-------------------------------------------------- ------------
          θ ÷ | Bagi panjang dengan elemen maksimum menggunakan penyortiran khusus.

05AB1E sangat singkat untuk tantangan ini.


4

JavaScript (ES6), 118 115 byte

Disimpan 3 byte berkat @ edc65

Mengambil input sebagai string.

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

Uji kasus


1
Apakah Anda mencoba eval daripada RegExp?
edc65

@ edc65 Saya selalu lupa tentang itu. Terima kasih!
Arnauld

1

Python 2 , 138 132 byte

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

Cobalah online!




Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.