Sayı, Divisors Sürümü Hesaplama


11

Matematik üzerine bu sorudan esinlenerek .

Bir sayının asal çarpanlarına ayırması için n , P (n) = 2 a x 3 b x 5 c x ... olarak gösterilsin .
( X çarpma sembolü olarak kullanılır.)
Sonra n'nin bölenlerinin sayısı D (n) = (a + 1) x (b + 1) x (c + 1) olarak temsil edilebilir .
Bu nedenle, kolaylıkla bölenler sayısı söyleyebiliriz 2n olan D (2n) = (a + 2) x (B + 1) x (c + 1) ... ,
bir bölenler sayısı 3N olan D (3n ) = (a + 1) x (B + 2) x (c + 1) ... ,
vb.

Meydan okuma:

Belirli bölen girişleri verildiğinde, n'yi hesaplamak için bu özellikleri kullanan bir program veya işlev yazın .

Giriş:

Bir dizi tamsayı olarak, aşağıdaki tanımların hepsini kullanarak onlara w, x, y, z diyelim :

  • tüm girişler 1'den büyük - w, x, y, z > 1
  • x ve z farklıdır -x<>z
  • x ve z asaldır - P(x)=x, D(x)=2ve P(z)=z,D(z)=2
  • w arasında bölenler sayısıdır xn -D(xn)=w
  • Y ve bölenler sayısıdır zn -D(zn)=y

Bağlantılı soruda verilen sorun için bir girdi örneği olabilir (28, 2, 30, 3). Bu, D(2n)=28ve D(3n)=30ile birlikte anlamına gelir n=864.

Çıktı:

Yukarıdaki tanımları ve giriş kısıtlamalarını karşılayan tek bir tamsayı ( n) . Tanımlara birden fazla sayı sığarsa, en küçük çıktıyı alın. Böyle bir tamsayı mümkün değilse, bir falsey değeri verin.

Örnekler:

(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

Kurallar:

  • Standart kod golf kuralları ve kaçamak kısıtlamaları geçerlidir.
  • Standart giriş / çıkış kuralları geçerlidir.
  • Giriş numaraları herhangi bir sırada olabilir - lütfen cevabınızda hangi sırayı kullandığınızı belirtin.
  • Giriş numaraları herhangi bir uygun biçimde olabilir: boşlukla ayrılmış, bir dizi, ayrı bir işlev veya komut satırı bağımsız değişkenleri, vb. - seçiminiz.
  • Benzer şekilde, STDOUT çıktısı, çevredeki beyaz alan, sondaki satır başı, vb. İsteğe bağlıdır.
  • Girdi ayrıştırma ve çıktı biçimlendirmesi bu zorluğun ilginç özellikleri değildir.
  • Aklı başında karmaşıklığın ve tamsayı taşmalarının yararına, n numaralı zorluğun kısıtlamaları olacaktır 1 < n < 100000- yani, bu aralığın dışındaki olası cevaplar hakkında endişelenmenize gerek yoktur.

İlişkili


Yani, en küçük çözüm 100.000'den büyükse, bir çözüm veya sıfır döndürmeyi seçebilir miyim?
Dennis

@Dennis Kodunuzu kısaltırsa, kesinlikle. Her ikisi de kabul edilebilir.
AdmBorkBork

Yanıtlar:


3

Jöle , 17 16 bayt

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

Bu, 100.000'e kadar olası tüm değerleri deneyen kaba bir güç çözümüdür. Çevrimiçi deneyin!

Rakip olmayan sürüm

Jelly'in son sürümü, yukarıdaki kodu 15 bayta kadar golf oynamaya izin veren bir hata düzeltmesine sahiptir .

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

Çevrimiçi deneyin!

Nasıl çalışır

×€ȷ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.

Tebrikler, varsayılan olarak kazanırsınız! : D
AdmBorkBork
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.