Приблизна частка цілих чисел із сусідніми множниками


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, використовуючи ідею Еріка Атгольфера, щоб взяти середнє значення у списку нулів та одиниць.
-3, використовуючи 3-індексацію (як це дозволено у запитанні) - завдяки Деннісу за те, що вказав на це.

ḊPƝḍⱮ!Ẹ€Æm

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

[2,(н+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/... Ах, радощі правил змінюються під час сну.
Ерік Аутгольфер

@EriktheOutgolfer Так, дуже схожі методи, коли я дивлюся ближче! ви можете використовувати, Pщоб перейти до 13?
Джонатан Аллан

Замість Ẹ€? Боюсь, Pце те саме ׃1$, що не спрацює. (А це все одно було б 14). Якщо замість цього æl/, можливо ( P це LCM * k зрештою).
Ерік Аутгольфер

@EriktheOutgolfer замістьæl/
Джонатан Аллан

Так, я думаю, що я можу це зробити, і результат теоретично був би таким же точним, як і æl/я думаю. (У гольфу на нічній сові є проблеми ...) EDIT: Так, хоча мені доведеться зводити аргументи через TIO до 4...: P
Ерік Аутгольфер

3

05AB1E , 15 байт

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

Порт відповіді Желятана Аллана , тому також надзвичайно повільний.

Спробуйте в Інтернеті або перевірте перші три тестові справи .

Пояснення:

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

[нумеrатоr,геномiнато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]

Спробуйте в Інтернеті!



Це теоретично повинно працювати 82 байти.
Кудлатий

@Shaggy Я насправді не знаю, що таке консенсус для таких відповідей. Хоча це працює в теорії , він не працює на практиці для будь-якого вкладу. (Мені особисто не подобається подібний тип відповідей. Ось чому я зазвичай включаю таке правило, як "ваш код повинен принаймні працювати до заданого ліміту" в мої власні виклики, коли я підозрюю, що я отримаю відповіді на зразок "працює лише для n = 1 у TIO " ... або взагалі не працює в цьому випадку.)
Арнольд

Особисто я великий фанат нескінченного консенсусу часу та пам’яті;)
Shaggy

Ой мені це теж подобається. :) Єдине моє застереження - це те, що я вважаю, що слід перевірити будь-яку відповідь принаймні на пару різних даних.
Арнольд


2

Вугілля деревне , 26 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Безнадійно неефективна (O (n! ²)), тому працює лише n=4над TIO. Пояснення:

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 so), так що можна зробити n=13TIO:

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

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

У 54-байтній найшвидшій версії використовується більш ефективний LCM, так що можна зробити n=18з TIO:

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

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


2

Мова Вольфрама (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якщо припустити, що #це ціле число).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.