Approssimazione della proporzione di numeri interi con fattori vicini


11

Se 1 non viene conteggiato come fattore, allora

  • 40 ha due fattori vicini (4 e 5)
  • 1092 ha due fattori vicini (13 e 14)
  • 350 non ha due fattori vicini (tra i suoi fattori 2, 5, 7, 10, 14, 25, 35, 50, 70 e 175, nessuno è consecutivo)

La proporzione di numeri interi positivi che hanno questa proprietà è la proporzione divisibile per 6 (2 × 3), 12 (3 × 4), 20 (4 × 5), 30, 56,…. Se calcoliamo solo la proporzione divisibile per la prima n di queste, otteniamo un'approssimazione che diventa più accurata all'aumentare di n .

Ad esempio, per n = 1 , troviamo la proporzione di numeri interi divisibili per 2 × 3 = 6, che è 1/6. Per n = 2 , tutti gli interi divisibili per 3 × 4 = 12 sono anche divisibili per 6, quindi l'approssimazione è ancora 1/6. Per n = 3 , la proporzione di numeri interi divisibili per 6 o 20 è 1/5 e così via.

Ecco i primi valori:

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

Per valori di n tra i valori forniti, l'output deve essere uguale all'output per il valore sopra (ad es. N = 5 → 1/5).

Il tuo programma dovrebbe prendere n e produrre una frazione o una risposta decimale. Puoi prendere n in qualsiasi offset (es. 0-indicizzazione o 2-indicizzazione in questa sequenza, invece di 1-indicizzazione).

Per l'output decimale, il programma deve avere una precisione di almeno 5 cifre per tutti i casi di test forniti.

Il punteggio è , con il codice più breve vincente.

Ispirato da Quale percentuale di numeri interi positivi ha due fattori che differiscono di 1? di marty cohen - in particolare, dalla risposta di Dan .


1
Quanto deve essere precisa una risposta decimale? Una strategia naturale sembra essere quella di contare gli interi con un divisore valido in un intervallo enorme e dividere per la lunghezza dell'intervallo, che migliora come approssimazione man mano che l'intervallo aumenta.
xnor

@xnor Ora l'ho affrontato nel post.
Maniglia della porta

Risposte:


6

Gelatina ,  14 13  10 byte

-1 usando l'idea di Erik the Outgolfer per prendere la media di un elenco di zeri e di quelli.
-3 usando l'indicizzazione 3 (come consentito nella domanda) - grazie a Dennis per averlo sottolineato.

ḊPƝḍⱮ!Ẹ€Æm

Un collegamento monadico che accetta un numero intero n+2, che produce un float.

[2,(n+2)!]

(Iniziato come +2µḊPƝḍⱮ!§T,$Ẉ, prendendo ne cedendo [numerator, denominator], non ridotto)

Come?

Ḋ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

Hm ... sospetto che ciò che rende questo più breve del mio sia l'uso !invece di æl/... Ah, le gioie delle regole cambiano mentre dormono.
Erik the Outgolfer,

@EriktheOutgolfer sì, metodi molto simili quando guardo più da vicino! puoi usare Pper arrivare fino a 13?
Jonathan Allan,

Invece di Ẹ€? Temo Psia lo stesso ׃1$, quindi non funzionerà. (E sarebbe comunque 14 ...) Se invece di æl/, forse ( dopo tutto P è LCM * k).
Erik the Outgolfer,

@EriktheOutgolfer invece diæl/
Jonathan Allan il

Sì, penso di poterlo fare, e il risultato sarebbe teoricamente preciso come æl/immagino. (Il golf dei nottambuli ha dei problemi ...) MODIFICA: Sì, anche se dovrò ridurre la discussione su TIO a 4...: P
Erik the Outgolfer,

3

05AB1E , 15 byte

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

La risposta di Jelly di Port of @JonathanAllan , quindi anche estremamente lenta.

Provalo online o verifica i primi tre casi di test .

Spiegazione:

Ì                 # 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 byte

Salvato 2 byte grazie a @Shaggy + 2 byte in più da lì

Restituisce un'approssimazione decimale.

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

Provalo online!


JavaScript (ES6), 131 byte

[numerun'tor,denomionun'tor]

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]

Provalo online!



Questo dovrebbe funzionare, in teoria per 82 byte.
Shaggy,

@Shaggy Non so davvero quale sia il consenso per risposte del genere. Mentre funziona in teoria , non funziona in pratica per qualsiasi input. (Personalmente non mi piace questo tipo di risposte. Questo è il motivo per cui di solito includo una regola come "il tuo codice dovrebbe almeno funzionare fino a un determinato limite" nelle mie sfide quando sospetto che otterrò risposte come "funziona solo per n = 1 su TIO " ... o non funziona affatto nella fattispecie.)
Arnauld

Personalmente, sono un grande fan del consenso infinito su memoria e tempo;)
Shaggy,

Oh anche a me piace. :) La mia unica riserva è che penso che dovrebbe essere possibile testare qualsiasi risposta per almeno un paio di input distinti.
Arnauld,


2

Carbone , 26 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Disperatamente inefficiente (O (n! ²)), quindi funziona solo n=4su TIO. Spiegazione:

FN⊞υ×⁺²ι⁺³ι

Inserire ne calcolare i primi nprodotti di fattori vicini.

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

Prendi il prodotto di tutti questi fattori e usalo per calcolare la proporzione di numeri che hanno almeno uno di quei fattori.

La versione meno lenta di 30 byte è solo O (n!), Quindi può fare fino a n=6TIO:

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

Provalo online! Il collegamento è alla versione dettagliata del codice.

La versione più veloce di 46 byte è solo O (mcm (1..n + 2)) quindi può fare fino a n=10TIO:

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

Provalo online! Il collegamento è alla versione dettagliata del codice.

La versione più veloce di 45 byte è solo O (2ⁿ), quindi può fare fino a n=13TIO:

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

Provalo online! Il collegamento è alla versione dettagliata del codice.

La versione più veloce a 54 byte utilizza LCM più efficiente, quindi può fare fino a n=18TIO:

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

Provalo online! Il collegamento è alla versione dettagliata del codice.


2

Wolfram Language (Mathematica) , 69 68 61 52 byte

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

Provalo online!

3-indicizzati. All'inizio stavo per usare LCM@@ma mi sono reso conto che #!sarebbe stato più corto ... ma ora ha un sacco di memoria per Range[#!]...

Gestito a golf giù la condizione di 2 byte, il che era bello.


Vecchia soluzione numerica (56 byte):

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

Provalo online!

2-indicizzati. Più efficiente quando #!>5^8( #>9, assumendo che #sia un numero intero).


1

Python 2 , 78 byte

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

Provalo online!

Restituisce il decimale approssimativo a +5 cifre; usa l'approccio ingenuo della forza bruta che xnor suggerisce nei commenti sulla domanda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.