Hitung Nomornya, Edisi Pembagi

11

Terinspirasi oleh pertanyaan ini tentang Matematika.

Biarkan faktorisasi prima dari angka, n , direpresentasikan sebagai P (n) = 2 a x 3 b x 5 c x ... .
(Menggunakan x sebagai simbol perkalian.)
Kemudian jumlah pembagi dari n dapat direpresentasikan sebagai D (n) = (a + 1) x (b + 1) x (c + 1) ... .
Dengan demikian, kita dapat dengan mudah mengatakan bahwa jumlah pembagi 2n adalah D (2n) = (a + 2) x (b + 1) x (c + 1) ... ,
jumlah pembagi 3n adalah D (3n) ) = (a + 1) x (b + 2) x (c + 1) ... ,
dan seterusnya.

Tantangan:

Tulis program atau fungsi yang menggunakan properti ini untuk menghitung n , diberi input pembagi tertentu.

Memasukkan:

Seperangkat bilangan bulat, sebut saja w, x, y, z , dengan semua definisi berikut:

  • semua input lebih besar dari 1 - w, x, y, z > 1
  • x dan z berbeda -x<>z
  • x dan z adalah prime - P(x)=x, D(x)=2dan P(z)=z,D(z)=2
  • w adalah jumlah pembagi xn -D(xn)=w
  • y adalah jumlah pembagi dari zn -D(zn)=y

Untuk masalah yang diberikan dalam pertanyaan terkait, contoh input bisa (28, 2, 30, 3). Ini diterjemahkan menjadi D(2n)=28dan D(3n)=30, dengan n=864.

Keluaran:

Bilangan bulat tunggal, n , yang memenuhi definisi dan batasan input di atas. Jika beberapa angka sesuai dengan definisi, hasilkan yang terkecil. Jika tidak ada bilangan bulat seperti itu yang mungkin, output nilai falsey .

Contoh:

(w, x, y, z) => output

(28, 2, 30, 3) => 864
(4, 2, 4, 5) => 3
(12, 5, 12, 23) => 12
(14, 3, 20, 7) => 0 (or some other falsey value)
(45, 13, 60, 11) => 1872
(45, 29, 60, 53) => 4176

Aturan:

  • Aturan standar kode golf dan pembatasan lubang berlaku.
  • Aturan input / output standar berlaku.
  • Nomor input dapat dalam urutan apa pun - harap tentukan dalam jawaban Anda urutan mana yang Anda gunakan.
  • Nomor input dapat dalam format apa saja yang sesuai: dipisahkan oleh ruang, array, fungsi terpisah, atau argumen baris perintah, dll. - pilihan Anda.
  • Demikian pula, jika output ke STDOUT, spasi putih di sekitar, trailing newline, dll. Semuanya opsional.
  • Input parsing dan format output bukan fitur menarik dari tantangan ini.
  • Untuk kepentingan kompleksitas waras dan bilangan bulat bilangan bulat, jumlah tantangan n akan memiliki batasan sedemikian rupa 1 < n < 100000- yaitu, Anda tidak perlu khawatir tentang kemungkinan jawaban di luar kisaran ini.

Terkait

AdmBorkBork
sumber
Jadi, jika solusi terkecil lebih besar dari 100.000, saya dapat memilih untuk mengembalikan solusi atau nol?
Dennis
@ Dennis Jika itu membuat kode Anda lebih pendek, pasti. Entah bisa diterima.
AdmBorkBork

Jawaban:

3

Jelly , 17 16 byte

×€ȷ5R¤ÆDL€€Z=Ḅi3

Ini adalah solusi brute force yang mencoba semua nilai yang mungkin hingga 100.000. Cobalah online!

Versi yang tidak bersaing

Versi terbaru Jelly memiliki perbaikan bug yang memungkinkan untuk menurunkan kode di atas menjadi 15 byte .

ȷ5R×€³ÆDL€€=Ḅi3

Cobalah online!

Bagaimana itu bekerja

×€ȷ5R¤ÆDL€€Z=Ḅi3  Main link. Left input: x,z. Right input: w,y

     ¤            Combine the two atoms to the left into a niladic chain.
  ȷ5              Yield 100,000 (1e5).
    R             Apply range. Yields [1, ..., 100,000].
x€                Multiply each r in the range by x and z.
                  This yields [[x, ..., 100,000x], [z, ..., 100,000z]].
      ÆD          Compute the divisors of each resulting integer.
        L€€       Apply length to each list of divisors.
                  This counts the divisors of each integer in the 2D array.
           Z      Zip; group the divisors of kx and kz in pairs.
            =     Compare each [divisors(kx), divisors(kz)] with [w, y].
                  This yields a pair of Booleans.
             Ḅ    Convert each Boolean pair from binary to integer.
              i3  Find the first index of 3. Yields 0 for not found.
Dennis
sumber
Selamat, Anda menang secara default! : D
AdmBorkBork