Tamsayıların komşu faktörlerle yaklaşık oranı


11

1 bir faktör olarak sayılmazsa,

  • 40'ın iki komşu faktörü vardır (4 ve 5)
  • 1092'nin iki komşu faktörü vardır (13 ve 14)
  • 350'nin iki komşu faktörü yoktur (2, 5, 7, 10, 14, 25, 35, 50, 70 ve 175 faktörlerinden - ikisi birbirini izlemez)

Bu özelliğe sahip pozitif tamsayıların oranı, 6 (2 × 3), 12 (3 × 4), 20 (4 × 5), 30, 56,… 'den herhangi birine bölünebilir orandır. Sadece ilk nispeti bölünebilir hesaplayabilirseniz n bunlardan, biz daha doğru olur bir yakın sonucu elde n artar.

Örneğin, n = 1 için , tamsayıların oranının 2 × 3 = 6'ya bölünebilir olduğunu görüyoruz, bu 1/6. İçin n = 2 , 3 x 4 = 12 6 ile de bölünebilir ile tahminler, 1/6, bu yüzden, tam sayı, bölünebilir. İçin n = 3 6 veya 20 1/5 ve benzeri ile, tamsayılar oranı bölünebilecek.

İşte ilk birkaç değer:

1  1/6                0.16666666666666666
3  1/5                0.20000000000000000
6  22/105             0.20952380952380953
9  491/2310           0.21255411255411255
12 2153/10010         0.21508491508491510
15 36887/170170       0.21676558735382265
21 65563/301070       0.21776663234463747
24 853883/3913910     0.21816623274423785
27 24796879/113503390 0.21846817967287144

Değerleri için n verilen değerler arasındaki, çıkış (örneğin, yukarıda değeri çıkış olarak aynı olması gerekir , n = 5 → 1/5).

Programınız n almalı ve kesir veya ondalık cevap vermelidir . Eğer alabilir n herhangi bir sapma (örneğin, 0-indeksleme ya da bu dizinin içine 2-endeksleme, yerine 1-indeksleme) de.

Ondalık çıktı için, programınız verilen tüm test senaryoları için en az 5 rakama kadar doğru olmalıdır.

Puanlama , en kısa kod kazanma ile.

Esinlenen Pozitif tamsayıların hangi oranının 1 ile farklı iki faktörü vardır? şehit cohen tarafından - özellikle Dan'ın cevabıyla .


1
Ondalık bir yanıtın ne kadar doğru olması gerekir? Doğal bir strateji, büyük bir aralıkta geçerli bir bölen ile tam sayıları saymak ve aralığın uzunluğuna bölmek gibi görünüyor, bu da aralık büyüdükçe yaklaşık olarak daha iyi hale geliyor.
xnor

@xnor Şimdi yazıda bunu ele aldım.
Kapı tokmağı

Yanıtlar:


6

Jöle ,  14 13  10 bayt

-1 Outgolfer Erik'i kullanarak sıfırlar ve birler listesinin ortalamasını alma fikrini kullanın.
-3 (endekslemede izin verildiği gibi) kullanarak 3-endeksleme kullanarak - bunu belirttiği için Dennis'e teşekkürler.

ḊPƝḍⱮ!Ẹ€Æm

Bir tamsayı kabul eden, n+2şamandıra veren monadik bir Bağlantı .

[2,(n+2)!]

( Alma ve +2µḊPƝḍⱮ!§T,$Ẉalma , indirgenmemiş olarak başladı)n[numerator, denominator]

Nasıl?

ḊPƝḍⱮ!Ẹ€Æm - Link: integer, x=n+2
Ḋ          - dequeue (implicit range of) x  - i.e. [2,3,4,...,n+2]
  Ɲ        - apply to neighbours:
 P         -   product                             [2×3,3×4,...,(n+1)×(n+2)]
     !     - factorial of x                        x!
    Ɱ      - map across (implicit range of) x! with:
   ḍ       -   divides?                            [[2×3ḍ1,3×4ḍ1,...,(n+1)×(n+2)ḍ1],[2×3ḍ2,3×4ḍ2,...,(n+1)×(n+2)ḍ2],...,[2×3ḍ(x!),3×4ḍ(x!),...,(n+1)×(n+2)ḍ(x!)]]
       €   - for each:
      Ẹ    -   any?  (1 if divisible by any of the neighbour products else 0)
        Æm - mean

Hımm ... Bunu benimkinden daha kısa yapan şeyin !bunun yerine kullanmak olduğunu sanıyorum æl/... Ah, uyurken değişen kuralların sevinci.
Outgolfer Erik

@EriktheOutgolfer evet, daha yakından baktığımda çok benzer yöntemler! P13'e inmek için kullanabilir misin ?
Jonathan Allan

Bunun yerine Ẹ€? Korkarım Pki aynıdır ׃1$, bu yüzden işe yaramaz. (Ve bu ... Neyse 14 olurdu) ise yerine æl/, belki ( P bir LCM * k sonuçta).
Outgolfer Erik

@EriktheOutgolfer yerineæl/
Jonathan Allan

Evet, sanırım bunu yapabilirim ve sonuç teorik olarak æl/sanırım benim kadar kesin olur . EDIT (Gece-baykuş golf ... sorunları var): Evet çok TIO tartışması bir azaltmak gerekecek rağmen 4...: P
Erik Outgolfer

3

05AB1E , 15 bayt

Ì©!Lε®LüP¦Öà}ÅA

Bağlantı noktası @JonathanAllan'ın Jelly yanıtı , bu yüzden de son derece yavaş.

Çevrimiçi deneyin veya ilk üç test vakasını doğrulayın .

Açıklama:

Ì                 # Add 2 to the (implicit) input
                  #  i.e. 3 → 5
 ©                # Store this in the register (without popping)
  !               # Take the factorial of it
                  #  i.e. 5 → 120
   L              # Create a list in the range [1, (input+2)!]
                  #   i.e. 120 → [1,2,3,...,118,119,120]
    ε       }     #  Map over each value in this list
     ®            #  Push the input+2 from the register
      L           #  Create a list in the range [1, input+2]
                  #   i.e. 5 → [1,2,3,4,5]
       ü          #  Take each pair
                  #    i.e. [1,2,3,4,5] → [[1,2],[2,3],[3,4],[4,5]]
        P         #   And take the product of that pair
                  #    i.e. [[1,2],[2,3],[3,4],[4,5]] → [2,6,12,20]
         ¦        #  Then remove the first value from this product-pair list
                  #   i.e. [2,6,12,20] → [6,12,20]
          Ö       #  Check for each product-pair if it divides the current map-value
                  #  (1 if truthy; 0 if falsey)
                  #   i.e. [1,2,3,...,118,119,120] and [6,12,20]
                  #    → [[0,0,0],[0,0,0],[0,0,0],...,[0,0,0],[0,0,0],[1,1,1]]
           à      #  And check if it's truthy for any by taking the maximum
                  #   i.e. [[0,0,0],[0,0,0],[0,0,0],...,[0,0,0],[0,0,0],[1,1,1]]
                  #    → [0,0,0,...,0,0,1]
             ÅA   # After the map, take the mean (and output implicitly)
                  #  i.e. [0,0,0,...,0,0,1] → 0.2

3

JavaScript (ES6),  94 92  90 bayt

@Shaggy sayesinde 2 bayt kaydedildi + oradan 2 bayt daha

Ondalık bir yaklaşım döndürür.

n=>(x=2,g=a=>n--?g([...a,x*++x]):[...Array(1e6)].map((_,k)=>n+=a.some(d=>k%d<1))&&n/1e6)``

Çevrimiçi deneyin!


JavaScript (ES6), 131 bayt

[numerbirtÖr,denÖmbennbirtÖr]

f=(n,a=[],p=x=1)=>n?f(n-1,[...a,q=++x*-~x],p*q/(g=(a,b)=>a?g(b%a,a):b)(p,q)):[...Array(p)].map((_,k)=>n+=a.some(d=>-~k%d<1))&&[n,p]

Çevrimiçi deneyin!



Bu , teorik olarak 82 bayt için çalışmalıdır .
Shaggy

@Shaggy Böyle cevaplar için fikir birliğinin ne olduğunu gerçekten bilmiyorum. Teoride çalışmasına rağmen, herhangi bir girdi için pratikte çalışmaz. (Ben şahsen bu tür cevapları beğenmedim. Bu yüzden, "sadece çalışır" TIO'da n = 1 için " ... veya mevcut durumda hiç çalışmıyor.)
Arnauld

Şahsen ben sonsuz zaman ve hafıza konsensüsünün büyük bir hayranıyım;)
Shaggy

Ah ben de beğendim. :) Benim tek rezervasyon en az birkaç farklı girişler için herhangi bir cevap test etmek mümkün olduğunu düşünüyorum olduğunu.
Arnauld


2

Kömür , 26 bayt

FN⊞υ×⁺²ι⁺³ιI∕LΦΠυ¬⌊Eυ﹪ιλΠυ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Umutsuzca verimsiz (O (n! ²)) bu yüzden sadece n=4TIO'da çalışır . Açıklama:

FN⊞υ×⁺²ι⁺³ι

Komşu faktörlerin nilk nürünlerini girin ve hesaplayın .

I∕LΦΠυ¬⌊Eυ﹪ιλΠυ

Tüm bu faktörlerin ürününü alın ve bu faktörlerden en az birine sahip sayıların oranını hesaplamak için kullanın.

30 bayt daha az yavaş sürüm yalnızca O (n!) n=6'Dır, bu nedenle TIO'da şunları yapabilirsiniz :

F⊕N⊞υ⁺²ιI∕LΦΠυΣEυ∧μ¬﹪ι×λ§υ⊖μΠυ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur.

46 bayt daha hızlı sürüm yalnızca O (lcm (1..n + 2)) olduğundan TIO'da yapabilirsiniz n=10:

FN⊞υ×⁺²ι⁺³ι≔⁰η≔⁰ζW∨¬η⌈Eυ﹪ηκ«≦⊕η≧⁺⌈Eυ¬﹪ηκζ»I∕ζη

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur.

45 bayt daha hızlı sürüm yalnızca O (2ⁿ) 'dir, bu nedenle TIO'da şunları yapabilirsiniz n=13:

⊞υ±¹FEN×⁺²ι⁺³ιF⮌υ⊞υ±÷×ικ⌈Φ⊕ι∧λ¬∨﹪ιλ﹪κλIΣ∕¹✂υ¹

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur.

54 baytlık en hızlı sürüm daha verimli LCM kullanır, bu nedenle TIO'ya kadar yapabilirsiniz n=18:

⊞υ±¹FEN×⁺²ι⁺³ιFEυ⟦κι⟧«W⊟κ⊞⊞Oκλ﹪§κ±²λ⊞υ±÷Π…κ²⊟κ»IΣ∕¹✂υ¹

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur.


2

Wolfram Dili (Mathematica) , 69 68 61 52 bayt

Count[Range[#!],b_/;Or@@(# #-#&@Range[3,#]∣b)]/#!&

Çevrimiçi deneyin!

3-endekslendi. İlk başta kullanacaktım LCM@@ama #!bunun daha kısa olacağını fark ettim ... ama şimdi bunun için çok fazla bellek Range[#!]...

Güzel 2 bytes tarafından koşulu aşağı golf başardı.


Eski sayısal çözüm (56 bayt):

N@Count[Range[5^8],b_/;Or@@Array[(# #-#)∣b&,#,3]]/5^8&

Çevrimiçi deneyin!

2-endekslendi. #!>5^8( #>9, #Bir tamsayı olduğu varsayıldığında ) daha verimlidir .


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.