Przybliż przybliżony odsetek liczb całkowitych z sąsiednimi czynnikami

11

Jeśli 1 nie jest liczony jako czynnik, to

  • 40 ma dwa sąsiednie czynniki (4 i 5)
  • 1092 ma dwa sąsiednie czynniki (13 i 14)
  • 350 nie ma dwóch sąsiednich czynników (spośród czynników 2, 5, 7, 10, 14, 25, 35, 50, 70 i 175, nie ma dwóch kolejnych)

Proporcja liczb całkowitych dodatnich posiadających tę właściwość jest proporcją podzielną przez dowolną z 6 (2 × 3), 12 (3 × 4), 20 (4 × 5), 30, 56,… Jeśli obliczymy tylko proporcję podzielną przez pierwsze n z nich, otrzymamy przybliżenie, które staje się dokładniejsze wraz ze wzrostem n .

Na przykład dla n = 1 znajdujemy proporcję liczb całkowitych podzielną przez 2 × 3 = 6, czyli 1/6. Dla n = 2 wszystkie liczby całkowite podzielne przez 3 × 4 = 12 są również podzielne przez 6, więc przybliżenie wynosi nadal 1/6. Dla n = 3 proporcja liczb całkowitych podzielnych przez 6 lub 20 wynosi 1/5 i tak dalej.

Oto kilka pierwszych wartości:

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

Dla wartości n pomiędzy podanymi wartościami, wynik powinien być taki sam jak wynik dla powyższej wartości (np. N = 5 → 1/5).

Twój program powinien pobrać n i udzielić odpowiedzi ułamkowej lub dziesiętnej. Możesz wziąć n z dowolnym przesunięciem (np. Indeksowanie 0 lub indeksowanie 2 do tej sekwencji, zamiast indeksowania 1).

Aby uzyskać wynik dziesiętny, program musi mieć dokładność co najmniej 5 cyfr dla wszystkich podanych przypadków testowych.

Punktacja to kodowego, w którym wygrywa się najkrótszy kod.

Zainspirowany przez Jaki odsetek dodatnich liczb całkowitych ma dwa czynniki, które różnią się o 1? autor: Marty Cohen, a konkretnie odpowiedź Dana .

Klamka
źródło
1
Jak dokładna musi być odpowiedź dziesiętna? Naturalną strategią wydaje się być liczenie liczb całkowitych z prawidłowym dzielnikiem w pewnym ogromnym zakresie i dzielenie przez długość zakresu, który staje się lepszy w przybliżeniu, gdy zasięg staje się większy.
xnor
@ xnor Odniosłem się do tego w poście.
Klamka

Odpowiedzi:

6

Galaretka ,  14 13  10 bajtów

-1 wykorzystując pomysł Erika the Outgolfer, aby przyjąć średnią z zer i jedynek.
-3 za pomocą 3-indeksowania (jak dozwolone w pytaniu) - dzięki Dennisowi za zwrócenie na to uwagi.

ḊPƝḍⱮ!Ẹ€Æm

Monadyczny link akceptujący liczbę całkowitą n+2, co daje liczbę zmiennoprzecinkową.

[2),(n+2))!]

(Zaczęło się jako +2µḊPƝḍⱮ!§T,$Ẉprzyjmowanie ni ustępowanie [numerator, denominator], nieredukowane)

W jaki sposób?

Ḋ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
Jonathan Allan
źródło
Hm ... Podejrzewam, że tym, co czyni to krótszym od mojego, jest użycie !zamiast æl/... Ach, radości z zasad zmieniających się podczas snu.
Erik the Outgolfer,
@EriktheOutgolfer tak, bardzo podobne metody, gdy przyjrzę się bliżej! czy możesz użyć, Paby dostać się do 13 lat?
Jonathan Allan,
Zamiast Ẹ€? Obawiam się, że Pto samo ׃1$, więc to nie zadziała. (I tak by to było 14 ...) Jeśli zamiast æl/, może ( P to w końcu LCM * k).
Erik the Outgolfer,
@EriktheOutgolfer zamiastæl/
Jonathan Allan
Tak, myślę, że mogę to zrobić, a wynik teoretycznie byłby tak precyzyjny, jak æl/przypuszczam. (Gra w golfa nocnego ma problemy ...) EDYCJA: Tak, chociaż będę musiał spierać się o TIO do 4...: P
Erik the Outgolfer
3

05AB1E , 15 bajtów

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

Port odpowiedzi galaretki @JonathanAllan , więc także bardzo wolno.

Wypróbuj online lub sprawdź trzy pierwsze przypadki testowe .

Wyjaśnienie:

Ì                 # 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
Kevin Cruijssen
źródło
3

JavaScript (ES6),  94 92  90 bajtów

Zaoszczędzono 2 bajty dzięki @Shaggy + 2 kolejnych bajtów

Zwraca przybliżenie dziesiętne.

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

Wypróbuj online!


JavaScript (ES6), 131 bajtów

[nummirzator,reminomjanzator]

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]

Wypróbuj online!

Arnauld
źródło
1
-2 bajty
Kudłaty
To powinno działać w teorii do 82 bajtów.
Kudłaty
@Shaggy Naprawdę nie wiem, jaki jest konsensus w przypadku takich odpowiedzi. Chociaż działa teoretycznie , nie działa w praktyce przy żadnym wkładzie. (Osobiście nie lubię tego rodzaju odpowiedzi. Dlatego zwykle w swoich wyzwaniach uwzględniam zasadę, taką jak „Twój kod powinien przynajmniej działać do określonego limitu”, gdy podejrzewam, że otrzymam odpowiedzi takie jak „działa tylko dla n = 1 w TIO „ ... lub w ogóle nie działa w niniejszej sprawie.)
Arnauld
Osobiście jestem wielkim fanem nieskończonego konsensusu czasu i pamięci;)
Kudłaty
Och, ja też to lubię. :) Moim jedynym zastrzeżeniem jest to, że myślę, że powinna istnieć możliwość przetestowania dowolnej odpowiedzi dla co najmniej kilku różnych danych wejściowych.
Arnauld
3

Galaretka , 12 bajtów

Ḋב$ḍẸ¥ⱮP$Æm

Wypróbuj online!

-2 dzięki sugestii Jonathana Allana , aby zastąpić LCM produktem (tj. LCM pomnożonym przez liczbę całkowitą).

Dennis zauważył, że mogę również indeksować 2.

Erik the Outgolfer
źródło
2

Węgiel drzewny , 26 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Beznadziejnie nieefektywny (O (n! ²)), więc działa tylko n=4na TIO. Wyjaśnienie:

FN⊞υ×⁺²ι⁺³ι

Wprowadź ni oblicz pierwsze nprodukty czynników sąsiednich.

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

Weź iloczyn wszystkich tych czynników i użyj go do obliczenia proporcji liczb mających co najmniej jeden z tych czynników.

30-bajtowa, wolniejsza wersja to tylko O ​​(n!), Więc możesz zrobić to n=6na TIO:

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

Wypróbuj online!Link jest do pełnej wersji kodu.

46-bajtowa szybsza wersja to tylko O ​​(lcm (1..n + 2)), więc można to zrobić n=10na TIO:

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

Wypróbuj online! Link jest do pełnej wersji kodu.

45-bajtowa szybsza wersja to tylko O ​​(2ⁿ), więc możesz zrobić to n=13na TIO:

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

Wypróbuj online! Link jest do pełnej wersji kodu.

54-bajtowa najszybsza wersja wykorzystuje bardziej wydajny LCM, więc może zrobić to n=18na TIO:

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

Wypróbuj online! Link jest do pełnej wersji kodu.

Neil
źródło
2

Wolfram Language (Mathematica) , 69 68 61 52 bajtów

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

Wypróbuj online!

3-indeksowane. Na początku miałem zamiar użyć, LCM@@ale zdałem sobie sprawę, że #!będzie krótszy ... ale teraz jest dużo pamięciRange[#!] ...

Udało się zagrać w golfa o 2 bajty, co było miłe.


Starsze rozwiązanie numeryczne (56 bajtów):

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

Wypróbuj online!

2-indeksowane. Bardziej wydajna, gdy #!>5^8( #>9przy założeniu, że #jest liczbą całkowitą).

attinat
źródło
1

Python 2 , 78 bajtów

lambda n:sum(any(-~i%(j*-~j)<1for j in range(2,n+2))for i in range(10**7))/1e7

Wypróbuj online!

Zwraca przybliżoną liczbę dziesiętną do +5 cyfr; stosuje naiwne podejście brutalnej siły, które xnor sugeruje w komentarzach do pytania.

Chas Brown
źródło