Приблизительная доля целых чисел с соседними факторами

11

Если 1 не считается фактором, то

  • 40 имеет два соседних фактора (4 и 5)
  • 1092 имеет два соседних фактора (13 и 14)
  • 350 не имеет двух соседних факторов (из его факторов 2, 5, 7, 10, 14, 25, 35, 50, 70 и 175 нет двух последовательных)

Доля положительных целых чисел, обладающих этим свойством, представляет собой долю, кратную любому из 6 (2 × 3), 12 (3 × 4), 20 (4 × 5), 30, 56,…. Если мы рассчитаем только долю, делимую на первые n из них, мы получим приближение, которое становится более точным при увеличении n .

Например, для n = 1 мы находим долю целых чисел, делимых на 2 × 3 = 6, что составляет 1/6. При n = 2 все целые числа, кратные 3 × 4 = 12, также делятся на 6, поэтому аппроксимация все еще равна 1/6. Для n = 3 доля целых чисел, делимых на 6 или 20, составляет 1/5 и т. Д.

Вот первые несколько значений:

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

Для значений n между предоставленными значениями выходные данные должны совпадать с выходными данными для вышеуказанного значения (например, n = 5 → 1/5).

Ваша программа должна взять n и вывести либо дробный, либо десятичный ответ. Вы можете взять n с любым смещением (например, 0-индексация или 2-индексация в этой последовательности вместо 1-индексации).

Для десятичного вывода ваша программа должна содержать не менее 5 цифр для всех приведенных тестовых случаев.

Скоринг - это с самой короткой победой.

Вдохновленный Какая доля натуральных чисел имеет два фактора, которые отличаются на 1? по Marty Cohen - в частности, от Dan ответа «s.

Дверная ручка
источник
1
Насколько точным должен быть десятичный ответ? Кажется, что естественной стратегией является подсчет целых чисел с действительным делителем в некотором огромном диапазоне и деление на длину диапазона, которая становится лучше в приближении по мере увеличения диапазона.
xnor
@xnor Я уже говорил об этом в посте.
дверная ручка

Ответы:

6

Желе ,  14 13  10 байт

-1 используя идею Эрика Outgolfer, чтобы взять среднее значение из списка нулей и единиц.
-3 с помощью 3-индексирования (как разрешено в вопросе) - спасибо Деннису за указание на это.

ḊPƝḍⱮ!Ẹ€Æm

Монадическая ссылка, принимающая целое число n+2, которое дает число с плавающей точкой.

[2,(n+2)!]

(Начинается как +2µḊPƝḍⱮ!§T,$Ẉ, принимая nи уступая [numerator, denominator], не сводится)

Как?

Ḋ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
Джонатан Аллан
источник
Хм ... Я подозреваю, что делает это короче, чем мое, это использование !вместо æl/... Ах, радости изменения правил во время сна.
Эрик Outgolfer
@EriktheOutgolfer да, очень похожие методы, когда я смотрю ближе! Вы можете использовать, Pчтобы получить до 13?
Джонатан Аллан
А не Ẹ€? Боюсь, Pэто то же самое ׃1$, что не получится. (И это все равно будет 14 ...) Если вместо æl/, может быть ( P это LCM * k в конце концов).
Эрик Outgolfer
@EriktheOutgolfer вместоæl/
Джонатан Аллан
Да, я думаю, что смогу сделать это, и результат теоретически будет таким же точным, как и æl/я думаю. (У ночной совы есть проблемы ...) РЕДАКТИРОВАТЬ: Да, хотя мне придется сократить спор по поводу TIO до 4...: P
Эрик Outgolfer
3

05AB1E , 15 байтов

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

Порт @JonathanAllan 's Jelly ответа , поэтому тоже очень медленно.

Попробуйте онлайн или проверьте первые три контрольных примера .

Объяснение:

Ì                 # 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 байт

Сохранено 2 байта благодаря @Shaggy + еще 2 байта оттуда

Возвращает десятичное приближение.

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

Попробуйте онлайн!


JavaScript (ES6), 131 байт

[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]

Попробуйте онлайн!

Arnauld
источник
1
-2 байт
Shaggy
Это должно работать, теоретически для 82 байтов.
Лохматый
@ Шэгги Я действительно не знаю, что такое консенсус для таких ответов. Хотя он работает теоретически , он не работает на практике для любого входа. (Мне лично не нравятся такие ответы. Вот почему я обычно включаю правило, например, «ваш код должен работать по крайней мере до определенного предела» в моих собственных задачах, когда я подозреваю, что получу такие ответы, как «только работает»). для n = 1 на TIO " ... или не работает вообще в данном случае.)
Арно
Лично я большой поклонник бесконечного консенсуса по времени и памяти;)
Shaggy
О, мне это тоже нравится. :) Моя единственная оговорка в том, что я думаю, что должна быть возможность проверить любой ответ, по крайней мере, для пары различных входных данных.
Арно
2

Древесный уголь , 26 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Безнадежно неэффективно (O (n! ²)), поэтому работает только до n=4TIO. Объяснение:

FN⊞υ×⁺²ι⁺³ι

Введите nи рассчитайте первые nпроизведения соседних факторов.

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

Возьмите произведение всех этих факторов и используйте его для расчета доли чисел, имеющих хотя бы один из этих факторов.

30-байтовая менее медленная версия - только O (n!), Так что можно использовать до n=6TIO:

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

Попробуйте онлайн! Ссылка на подробную версию кода.

46-байтная более быстрая версия - только O (lcm (1..n + 2)), поэтому можно использовать до n=10TIO:

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

Попробуйте онлайн! Ссылка на подробную версию кода.

45-байтная более быстрая версия - только O (2ⁿ), поэтому можно использовать до n=13TIO:

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

Попробуйте онлайн! Ссылка на подробную версию кода.

Самая быстрая версия с 54 байтами использует более эффективный LCM, поэтому может работать до n=18TIO:

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

Попробуйте онлайн! Ссылка на подробную версию кода.

Нил
источник
2

Wolfram Language (Mathematica) , 69 68 61 52 байта

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

Попробуйте онлайн!

3-индексироваться. Сначала я собирался использовать, LCM@@но понял, что #!будет короче ... но теперь это много памяти для Range[#!]...

Удалось поиграть в гольф на 2 байта, что было приятно.


Старое численное решение (56 байт):

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

Попробуйте онлайн!

2-индексироваться. Более эффективно, когда #!>5^8( при #>9условии, что #это целое число).

attinat
источник
1

Python 2 , 78 байт

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

Попробуйте онлайн!

Возвращает приблизительное десятичное число до +5 цифр; использует наивный подход грубой силы, который предлагает xnor в комментариях к вопросу.

Час Браун
источник