Aproximada a proporção de números inteiros com fatores vizinhos

11

Se 1 não é contado como um fator, então

  • 40 tem dois fatores vizinhos (4 e 5)
  • 1092 tem dois fatores vizinhos (13 e 14)
  • 350 não possui dois fatores vizinhos (dos fatores 2, 5, 7, 10, 14, 25, 35, 50, 70 e 175, dois não são consecutivos)

A proporção de números inteiros positivos que possuem essa propriedade é a proporção divisível por qualquer um dos 6 (2 × 3), 12 (3 × 4), 20 (4 × 5), 30, 56,…. Se calcularmos apenas a proporção divisível pelo primeiro n destes, obteremos uma aproximação que será mais precisa à medida que n aumenta.

Por exemplo, para n = 1 , encontramos a proporção de números inteiros divisíveis por 2 × 3 = 6, que é 1/6. Para n = 2 , todos os números inteiros divisíveis por 3 × 4 = 12 também são divisíveis por 6, portanto a aproximação ainda é 1/6. Para n = 3 , a proporção de números inteiros divisíveis por 6 ou 20 é 1/5 e assim por diante.

Aqui estão os primeiros valores:

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

Para valores de n entre os valores fornecidos, a saída deve ser igual à saída do valor acima (por exemplo, n = 5 → 1/5).

Seu programa deve receber n e gerar uma resposta em fração ou decimal. Você pode aceitar n em qualquer deslocamento (por exemplo, indexação 0 ou 2) nessa sequência, em vez de 1).

Para saída decimal, seu programa deve ter precisão de pelo menos 5 dígitos para todos os casos de teste fornecidos.

A pontuação é , com o menor ganho de código.

Inspirado em Que proporção de números inteiros positivos tem dois fatores que diferem por 1? por marty cohen - especificamente, pela resposta de Dan .

Maçaneta da porta
fonte
1
Qual a precisão de uma resposta decimal? Uma estratégia natural parece ser contar os números inteiros com um divisor válido em um intervalo enorme e dividir pelo comprimento do intervalo, que melhora como uma aproximação à medida que o intervalo aumenta.
Xnor
@ xnor Eu já falei disso no post.
Maçaneta

Respostas:

6

Geléia ,  14 13  10 bytes

-1 usando a idéia de Erik the Outgolfer para obter a média de uma lista de zeros e uns.
-3 usando a indexação 3 (conforme permitido na pergunta) - obrigado a Dennis por apontar isso.

ḊPƝḍⱮ!Ẹ€Æm

Um link monádico que aceita um número inteiro n+2, que gera uma flutuação.

[2,(n+2)!]

(Começou como +2µḊPƝḍⱮ!§T,$Ẉ, tendo ne cedendo [numerator, denominator], não reduzido)

Quão?

Ḋ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
fonte
Hum ... suspeito que o que torna isso mais curto que o meu seja o uso de, em !vez de æl/... Ah, as alegrias das regras mudam enquanto dorme.
Erik the Outgolfer
@EriktheOutgolfer sim, métodos muito semelhantes quando olho mais de perto! você pode usar Ppara descer para 13?
Jonathan Allan
Em vez de Ẹ€? Receio que Pseja o mesmo ׃1$, então não funcionará. (E isso seria 14 de qualquer maneira ...) Se, em vez de æl/, talvez ( afinal P é LCM * k).
Erik the Outgolfer
@EriktheOutgolfer em vez deæl/
Jonathan Allan
Sim, acho que posso fazer isso, e o resultado seria teoricamente tão preciso quanto æl/eu acho. (O golfe noturno tem problemas ...) EDIT: Sim, embora eu tenha que reduzir a discussão sobre o TIO para 4...: P
Erik, o Outgolfer,
3

05AB1E , 15 bytes

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

Porto da resposta de @JonathanAllan Jelly , também extremamente lento.

Experimente online ou verifique os três primeiros casos de teste .

Explicação:

Ì                 # 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
fonte
3

JavaScript (ES6),  94 92  90 bytes

Economizou 2 bytes graças a @Shaggy e mais 2 bytes a partir daí

Retorna uma aproximação decimal.

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

Experimente online!


JavaScript (ES6), 131 bytes

[numerator,denominator]

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]

Experimente online!

Arnauld
fonte
1
-2 bytes
Shaggy
Isso deve funcionar, em teoria, para 82 bytes.
Shaggy
@ Shaggy Eu realmente não sei qual é o consenso para respostas como essa. Embora funcione na teoria , não funciona na prática para nenhuma entrada. (Pessoalmente, não gosto desse tipo de resposta. É por isso que geralmente incluo uma regra como "seu código deve pelo menos atingir um determinado limite" em meus próprios desafios, quando suspeito que receberei respostas como "só funciona". para n = 1 no TIO " ... ou não funciona no presente caso.)"
Arnauld
Pessoalmente, eu sou um grande fã do tempo e memória infinita consenso;)
Shaggy
Ah, eu também gosto. :) Minha única reserva é que acho que deve ser possível testar qualquer resposta para pelo menos algumas entradas distintas.
Arnauld
3

Gelatina , 12 bytes

Ḋב$ḍẸ¥ⱮP$Æm

Experimente online!

-2 graças à sugestão de Jonathan Allan de substituir o LCM pelo produto (ou seja, o LCM multiplicado por um número inteiro).

Dennis percebeu que eu também posso indexar 2.

Erik, o Outgolfer
fonte
2

Carvão , 26 bytes

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

Experimente online! Link é a versão detalhada do código. Desesperadamente ineficiente (O (n! ²)), portanto, só funciona n=4no TIO. Explicação:

FN⊞υ×⁺²ι⁺³ι

Insira ne calcule os primeiros nprodutos dos fatores vizinhos.

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

Pegue o produto de todos esses fatores e use-o para calcular a proporção de números que possuem pelo menos um desses fatores.

A versão menos lenta de 30 bytes é apenas O (n!); Portanto, pode fazer até n=6no TIO:

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

Experimente online! Link é a versão detalhada do código.

A versão mais rápida de 46 bytes é apenas O (lcm (1..n + 2)), portanto, pode fazer até n=10no TIO:

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

Experimente online! Link é a versão detalhada do código.

A versão mais rápida de 45 bytes é apenas O (2ⁿ), portanto, pode fazer até n=13no TIO:

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

Experimente online! Link é a versão detalhada do código.

A versão mais rápida de 54 bytes usa LCM mais eficiente e pode fazer o mesmo n=18no TIO:

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

Experimente online! Link é a versão detalhada do código.

Neil
fonte
2

Wolfram Language (Mathematica) , 69 68 61 52 bytes

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

Experimente online!

Indexado em 3. No começo eu ia usar, LCM@@mas percebi que #!seria mais curto ... mas agora há muita memória para Range[#!]...

Conseguiu reduzir a condição em 2 bytes, o que foi legal.


Solução numérica mais antiga (56 bytes):

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

Experimente online!

2-indexado. Mais eficiente quando #!>5^8( #>9, supondo que #seja um número inteiro).

attinat
fonte
1

Python 2 , 78 bytes

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

Experimente online!

Retorna o decimal aproximado para +5 dígitos; usa a abordagem de força bruta ingênua que xnor sugere nos comentários sobre a questão.

Chas Brown
fonte