Perkirakan proporsi bilangan bulat dengan faktor tetangga

11

Jika 1 tidak dihitung sebagai faktor, maka

  • 40 memiliki dua faktor tetangga (4 dan 5)
  • 1092 memiliki dua faktor tetangga (13 dan 14)
  • 350 tidak memiliki dua faktor tetangga (dari faktor 2, 5, 7, 10, 14, 25, 35, 50, 70, dan 175, tidak ada yang berurutan)

Proporsi bilangan bulat positif yang memiliki properti ini adalah proporsi yang dapat dibagi oleh 6 (2 × 3), 12 (3 × 4), 20 (4 × 5), 30, 56,…. Jika kita hanya menghitung proporsi yang dapat dibagi dengan n pertama , kita mendapatkan perkiraan yang menjadi lebih akurat dengan meningkatnya n .

Misalnya, untuk n = 1 , kami menemukan proporsi bilangan bulat yang dapat dibagi dengan 2 × 3 = 6, yaitu 1/6. Untuk n = 2 , semua bilangan bulat dapat dibagi 3 × 4 = 12 juga dapat dibagi 6, sehingga perkiraannya masih 1/6. Untuk n = 3 , proporsi bilangan bulat yang dapat dibagi 6 atau 20 adalah 1/5, dan seterusnya.

Berikut adalah beberapa nilai pertama:

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

Untuk nilai n antara nilai yang disediakan, output harus sama dengan output untuk nilai di atas (misalnya n = 5 → 1/5).

Program Anda harus mengambil n dan menghasilkan fraksi atau jawaban desimal. Anda dapat mengambil n pada offset apa pun (mis. Pengindeksan 0 atau pengindeksan 2 ke dalam urutan ini, alih-alih pengindeksan 1).

Untuk output desimal, program Anda harus akurat setidaknya 5 digit untuk semua kasus uji yang diberikan.

Skor adalah , dengan kode menang tercepat.

Terinspirasi oleh Berapa proporsi bilangan bulat positif memiliki dua faktor yang berbeda dengan 1? oleh marty cohen - khususnya, oleh jawaban Dan .

Gagang pintu
sumber
1
Seberapa akurat jawaban desimal harus? Strategi alami tampaknya menghitung bilangan bulat dengan pembagi yang valid dalam beberapa rentang yang sangat besar dan membaginya dengan panjang rentang, yang menjadi lebih baik sebagai perkiraan ketika rentang menjadi lebih besar.
xnor
@ xnor Sekarang saya sudah membahasnya di pos.
Gagang Pintu

Jawaban:

6

Jelly ,  14 13  10 byte

-1 menggunakan ide Erik the Outgolfer untuk mengambil rata-rata dari daftar nol dan satu.
-3 dengan menggunakan 3-pengindeksan (sebagaimana diizinkan dalam pertanyaan) - terima kasih kepada Dennis untuk menunjukkan ini.

ḊPƝḍⱮ!Ẹ€Æm

Tautan monadik yang menerima bilangan bulat n+2,, yang menghasilkan float.

[2,(n+2)!]

(Dimulai sebagai +2µḊPƝḍⱮ!§T,$Ẉ, mengambil ndan menghasilkan [numerator, denominator], tidak direduksi)

Bagaimana?

Ḋ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
sumber
Hm ... Saya menduga apa yang membuat ini lebih pendek dari saya adalah penggunaan !bukannya æl/... Ah, sukacita aturan berubah saat tidur.
Erik the Outgolfer
@EriktheOutgolfer ya, metode yang sangat mirip ketika saya melihat lebih dekat! dapat Anda gunakan Puntuk turun ke 13?
Jonathan Allan
Bukan Ẹ€? Saya takut Psama ׃1$, jadi tidak akan berhasil. (Dan itu akan menjadi 14 toh ...) Jika bukan æl/, mungkin ( P adalah LCM * k setelah semua).
Erik the Outgolfer
@EriktheOutgolfer bukanæl/
Jonathan Allan
Ya, saya pikir saya bisa melakukan itu, dan hasilnya secara teoritis akan setepat dengan yang æl/saya kira. (Golf malam-burung hantu memang memiliki masalah ...) EDIT: Ya, meskipun saya harus mengurangi argumen atas TIO menjadi 4...: P
Erik the Outgolfer
3

05AB1E , 15 byte

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

Port dari @JonathanAllan jawaban Jelly , jadi juga sangat lambat.

Cobalah secara online atau verifikasi tiga uji kasus pertama .

Penjelasan:

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

JavaScript (ES6),  94 92  90 byte

Disimpan 2 byte berkat @Shaggy + 2 byte lagi dari sana

Mengembalikan pendekatan desimal.

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

Cobalah online!


JavaScript (ES6), 131 byte

[nkamumerSebuahtHair,denHaimsayanSebuahtHair]

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]

Cobalah online!

Arnauld
sumber
1
-2 bytes
Shaggy
Ini seharusnya bekerja, secara teori untuk 82 byte.
Shaggy
@ Shaggy Saya tidak begitu tahu apa konsensus untuk jawaban seperti itu. Meskipun bekerja dalam teori , itu tidak bekerja dalam praktik untuk input apa pun. (Saya pribadi tidak menyukai jawaban semacam ini. Inilah sebabnya saya biasanya memasukkan aturan seperti "kode Anda setidaknya harus bekerja hingga batas tertentu" dalam tantangan saya sendiri ketika saya menduga bahwa saya akan mendapatkan jawaban seperti "hanya bekerja untuk n = 1 di TIO " ... atau tidak berfungsi sama sekali dalam kasus ini.)
Arnauld
Secara pribadi, saya penggemar berat waktu & memori konsensus;)
Shaggy
Oh, aku juga menyukainya. :) Reservasi saya satu-satunya adalah saya pikir mungkin untuk menguji jawaban apa pun untuk setidaknya beberapa input berbeda.
Arnauld
3

Jelly , 12 byte

Ḋב$ḍẸ¥ⱮP$Æm

Cobalah online!

-2 Berkat saran Jonathan Allan untuk mengganti LCM dengan produk (yaitu LCM dikalikan dengan integer).

Dennis memperhatikan bahwa saya dapat melakukan 2 indeks juga.

Erik the Outgolfer
sumber
2

Arang , 26 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sangat tidak efisien (O (n! ²)) sehingga hanya berfungsi hingga n=4pada TIO. Penjelasan:

FN⊞υ×⁺²ι⁺³ι

Input ndan hitung nproduk pertama dari faktor tetangga.

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

Ambil produk dari semua faktor itu dan gunakan itu untuk menghitung proporsi angka yang memiliki setidaknya satu dari faktor-faktor itu.

30 byte versi yang lebih lambat hanya O (n!) Sehingga dapat dilakukan hingga n=6pada TIO:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode.

Versi 46 byte yang lebih cepat hanya O (lcm (1..n + 2)) sehingga dapat bekerja hingga n=10di TIO:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode.

Versi 45-byte lebih cepat hanya O (2ⁿ) sehingga dapat dilakukan hingga n=13pada TIO:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode.

Versi 54-byte tercepat menggunakan LCM yang lebih efisien sehingga dapat dilakukan hingga n=18pada TIO:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode.

Neil
sumber
2

Bahasa Wolfram (Mathematica) , 69 68 61 52 byte

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

Cobalah online!

3-diindeks. Pada awalnya saya akan menggunakan LCM@@tetapi menyadari bahwa #!akan lebih pendek ... tapi sekarang banyak memori untuk Range[#!]...

Berhasil menurunkan kondisi dengan 2 byte, yang bagus.


Solusi numerik yang lebih lama (56 byte):

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

Cobalah online!

2 diindeks. Lebih efisien ketika #!>5^8( #>9, dengan asumsi #bilangan bulat).

attinat
sumber
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

Cobalah online!

Mengembalikan perkiraan desimal ke +5 digit; menggunakan naif brute pendekatan kekuatan xnor menyarankan dalam komentar pada pertanyaan.

Chas Brown
sumber