整数と隣接因子の割合を近似する


11

1が要因としてカウントされない場合、

  • 40には2つの隣接する要素(4と5)があります
  • 1092には2つの隣接因子(13および14)があります
  • 350には2つの隣接する因子がありません(その因子2、5、7、10、14、25、35、50、70、および175のうち、2つは連続していません)

このプロパティを持つ正の整数の割合は、6(2×3)、12(3×4)、20(4×5)、30、56、…のいずれかで割り切れる割合です。これらの最初のnで割り切れる割合のみを計算すると、nが増加するにつれてより正確になる近似が得られます。

たとえば、n = 1の場合、2×3 = 6で割り切れる整数の割合、つまり1/6を求めます。以下のために、N = 2の近似がまだ1/6になるように、3×4 = 12で割り切れるすべての整数は、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は(代わりに1-インデックスの、このシーケンスに例えば0-インデックスまたは2-インデックス)の任意のオフセットで。

10進出力の場合、プログラムは指定されたすべてのテストケースで少なくとも5桁の精度である必要があります。

得点はで、最短のコードが勝ちます。

触発され、正の整数のどんな割合1によって異なる2つの要因がありますか?マーティ・コーエン -具体的には、によるダンの答え。


1
小数の答えはどれくらい正確でなければなりませんか?自然な戦略は、ある巨大な範囲で有効な除数を持つ整数を数え、範囲の長さで割ることです。
xnor

@xnorポストでそれを取り上げました。
ドアノブ

回答:


6

ゼリー 14 13  10 バイト

-1ゼロと1のリストの平均を取るというアウトゴルファーのエリックのアイデアを使用します。
-3-3インデックスを使用して(質問で許可されています)-これを指摘してくれたDennisに感謝します。

Ḋ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/... の代わりに...
エリックアウトゴルファー

@EriktheOutgolferええ、よく見るとよく似た方法です!P13まで下げるのに使用できますか?
ジョナサンアラン

代わりにẸ€?私Pは、と同じ׃1$だと思うので、動作しません。(そして、それは14とにかくだろう...)代わりの場合はæl/、多分(P あるすべての後のk * LCM)。
エリックアウトゴルファー

代わりに@EriktheOutgolferæl/
ジョナサンアラン

ええ、私はそれができると思います、そして、結果は理論的にはæl/私が推測するのと同じくらい正確です。EDITを(夜フクロウのゴルフは...問題を持っています):ええ、私はにTIO以上の引数を削減する必要がありますが4...:P
エリックOutgolfer

3

05AB1E、15 バイト

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

@JonathanAllanのJelly応答のポートなので、非常に遅いです。

オンラインそれを試してみてくださいまたは最初の3つのテストケースを検証します

説明:

Ì                 # 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バイト

@Shaggy +そこからさらに2バイトのおかげで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]

オンラインでお試しください!



これは、理論上は82バイトで機能するはずです。
シャギー

@Shaggy私はそのような答えに対するコンセンサスが何であるかを本当に知りません。それは仕事をしながら理論的には、それは、任意の入力のために、実際には機能しません。(私は個人的に答え、この種のを嫌う。「あなたのコードが与えられた制限値に少なくとも仕事アップする必要があり、」私は私のような答えを得るだろうというのが私自身の課題であると思われるときのような、私は通常のルールが含まれる理由です「のみ機能しますfor n = 1 on TIO " ...または現在のケースではまったく機能しません。)
Arnauld

個人的に、私は無限の時間と記憶のコンセンサスの大ファンです;​​)
シャギー

ああ、私も好きです。:)私の唯一の留保は、少なくとも2、3の個別の入力に対して任意の回答をテストすることが可能であるべきだと思うことです。
アーナルド


2

、26バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。絶望的に非効率(O(n!²))であるためn=4、TIOでしか機能しません。説明:

FN⊞υ×⁺²ι⁺³ι

隣接因子のn最初のn積を入力して計算します。

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

これらすべての要因の積を取り、それを使用して、これらの要因の少なくとも1つを持つ数値の割合を計算します。

30バイトの低速バージョンはO(n!)のみであるため、最大n=6でTIOを実行できます。

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。

46バイトの高速バージョンはO(lcm(1..n + 2))のみであるためn=10、TIO まで実行できます。

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。

45バイトの高速バージョンはO(2ⁿ)のみであるため、最大n=13TIOを実行できます。

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。

54バイトの最速バージョンはより効率的なLCMを使用するため、最大n=18でTIOを実行できます。

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。


2

Wolfram言語(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であると仮定する#と)より効率的です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.