Perbedaan MaxMin Divisor Pairs (DMDP)

18

Mari kita bicara tentang pembagi ...

Meninggalkan kotak yang sempurna (untuk sesaat), semua bilangan bulat positif dapat dinyatakan sebagai produk dari 2 pembagi mereka. Contoh cepat untuk 126: Berikut adalah semua pembagi dari126
masukkan deskripsi gambar di sini

Seperti yang Anda lihat, semua pembagi dapat dipasangkan. Inilah yang akan kita sebut Pasangan Pembagi :
[1, 126], [2, 63], [3, 42], [6, 21], [7, 18], [9, 14]

Untuk tantangan ini, kita hanya perlu pasangan terakhir dari daftar ini (yang merupakan pasangan tengah dari gambar):.
[9,14]Kita akan menyebut pasangan ini MaxMin Divisor Pair .
The Perbedaan MAXMIN Divisor Pair (DMDP) adalah perbedaan dari dua elemen dari pasangan yang [9,14]=5
Satu contoh lagi untuk 544. Pembagi adalah:

[1, 2, 4, 8, 16, 17, 32 , 34, 68, 136, 272, 544]

dan DMDP (544) = 15 karena32-17=15

Bagaimana dengan kotak yang sempurna ? Semua kotak sempurna memiliki DMDP = 0
Mari kita ambil contoh 64dengan pembagi

{1, 2, 4, 8 , 16, 32, 64}

Seperti yang dapat Anda lihat dalam hal ini, MaxMin Divisor Pair adalah [8,8]yang telah DMDP=0
hampir kita selesaikan.

Tantangan

Diberikan bilangan bulat n>0, keluaran berapa bilangan bulat kurang dari atau sama dengan 10000 , memiliki DMDP kurang dari n

Uji Kasus

input -> output

1->100 (those are all the perfect squares)
5->492  
13->1201
369->6175  
777->7264  
2000->8478  
5000->9440  
9000->9888  
10000->10000   
20000->10000

Ini adalah Jawaban terpendek dalam byte menang .


sumber
Bukankah lebih masuk akal untuk memiliki 10000input kedua, variabel,?
Jonathan Allan
1
Ya, saya memikirkan hal itu tetapi tidak akan menambah tantangan. Dengan cara ini saya pikir lebih mudah bagi semua orang untuk memahami tantangan.
1
Terkait
Peter Taylor

Jawaban:

5

JavaScript (ES7), 60 byte

f=(n,i=1e4,j=i**.5|0)=>i?i%j?f(n,i,j-1):(i/j-j<n)+f(n,i-1):0

Mungkin melebihi batas rekursi Anda, jadi Anda mungkin lebih suka versi berulang untuk 70 byte:

n=>[...Array(1e4)].map(g=(j=++i**.5|0)=>i%j?g(j-1):k+=i/j-j<n,i=k=0)|k
Neil
sumber
4

Jelly , 13 byte

Terima kasih 1 byte untuk Jonathan Allan.

ȷ4RÆDạU$Ṃ€<⁸S

Cobalah online!

Biarawati Bocor
sumber
ÆDạ"Ṛ$Ṃmenghemat satu byte lebih ÆDạ:@¥⁸Ṃ(saya punya ạ"ṚṂ... ȷ4RÆDÇ€<⁸Suntuk 15 - terlalu mirip - EDIT: hmm atau tidak, tidak :terlibat ... bagaimana menurut Anda?)
Jonathan Allan
@JonathanAllan Saya pikir Anda harus memposting 13-byter ini
Leaky Nun
Oh wow. nah Anda pergi untuk itu, saya menyelamatkan Anda satu byte yang menyelamatkan 2 lainnya!
Jonathan Allan
Bisakah Anda menambahkan penjelasan?
Kevin Cruijssen
4

Java 8, 151 111 110 101 byte

n->{int r=0,x=10000,i;for(;x-->0;r-=i-n>>-1)for(i=x;i-->1;)if(x>=i*i&x%i<1){i=x/i-i;break;}return r;}

-10 byte berkat @Nevay .

Penjelasan:

Coba di sini.

n->{               // Method with integer as parameter and return-type
  int r=0,         //  Result-integer
      x=10000,     //  Index-integer starting at 10,000
      i;           //  Another index-integer for the inner loop
  for(;x-->0;      //  Loop (1) from 10,000 down to 0
      r-=i-n>>-1)  //   If the MaxMin-Divisor Pair's difference is lower than the input,
                   //    add 1 to the result (after every iteration)
    for(i=x,       //   Set `i` to `x`
        i-->1;)    //   Inner loop (2) from `i` downwards to 1
      if(x>=i*i    //    If the current square-root of `x` is smaller than or equal to `i`,
         &x%i<1){  //    and if the current `x` is divisible by `i`:
        i=x/i-i;   //     Calculate the MaxMin-Division difference
        break;}    //     And leave the inner loop (2)
                   //   End of inner loop (2) (implicit / single-line body)
                   //  End of loop (1) (implicit / single-line body)
  return r;        //  Return the result
}                  // End of method
Kevin Cruijssen
sumber
1
Anda dapat menggunakannya for(i=1,i+=Math.sqrt(x);--i>0;)if(...untuk menghemat 1 byte.
Nevay
Tidak punya waktu untuk mencobanya sendiri, tetapi apakah lebih pendek untuk memulai loop dalam dari x dan memiliki variabel tambahan untuk minimum saat ini?
JollyJoker
1
101 byte:n->{int r=0,x=10000,i;for(;x-->0;r-=i-n>>-1)for(i=x;i-->1;)if(x>=i*i&x%i<1){i=x/i-i;break;}return r;}
Nevay
@Nevay Terima kasih lagi, benar-benar perlu diingat x>=i*isebagai alternatif untuk digunakan Math.sqrt, karena ini adalah kedua kalinya Anda bermain golf dalam kode saya.
Kevin Cruijssen
2

R , 73 77 byte

Terima kasih kepada @Guiseppe untuk 4 byte

sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())

Cobalah online!

Telah kehilangan fungsi vectorize untuk menghitung DMDP dan sekarang menggunakan sapply atas fungsi tersebut. Kebenaran untuk item yang kurang dari input dijumlahkan untuk hasilnya.

MickyT
sumber
Ah, saya tidak melihat DMDP adalah perbedaan minimal dari daftar faktor itu! Sangat bagus. Saya pikir sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())sedikit lebih pendek
Giuseppe
2

Mathematica, 64 byte

Count[Divisors~Array~1*^4,a_/;#+a[[i=⌈Tr[1^a]/2⌉]]>a[[-i]]]&

Cobalah di Wolfram Sandbox

Pemakaian

f = Count[Divisors~Array~1*^4,a_/;#+a[[i=⌈Tr[1^a]/2⌉]]>a[[-i]]]&

 

f[1]
100
f /@ {1, 5, 13, 369, 777, 2000, 5000, 9000, 10000, 20000}
{100, 492, 1201, 6175, 7264, 8478, 9440, 9888, 10000, 10000}

Penjelasan

Divisors~Array~1*^4

Buat daftar pembagi, dari 1hingga 10000. (daftar pembagi diurutkan secara otomatis)

Count[ ..., a_/; ... ]

Hitung kemunculan elemen a, sehingga ...

#+a[[i=⌈Tr[1^a]/2⌉]]>a[[-i]]]

(input) + (left one of the middle element(s)) > (right one of the middle element(s)) Jika hanya ada satu elemen tengah, kiri = kanan.

JungHwan Min
sumber
2

05AB1E , 19 18 17 16 15 12 byte

4°ƒNÑÂα{нI‹O

Cobalah online!

Penjelasan

4°ƒ            # for N in [0 ... 10**4] do:
   NÑ          # push divisors of N 
     Â         # bifurcate
      α        # element-wise absolute difference
       {       # sort
        н      # pop the head (smallest difference)
         I‹    # is it smaller than the input?
           O   # sum the stack
Emigna
sumber
1

MATL , 20 byte

1e4:"@Z\2Y"dJ2/)G<vs

Kode habis waktu dalam TIO. Berikut ini contoh dijalankan dengan kompiler offline:

>> matl 1e4:"@Z\2Y"dJ2/)G<vs
> 13
1201
Luis Mendo
sumber
1

R , 91 byte

function(n)sum(sapply(1:1e4,function(x,d=(1:x)[x%%1:x<1])diff(d[median(seq(d))+.5*0:1]))<n)

Mengambil pendekatan berbeda (lebih buruk) untuk menghitung DMDP daripada solusi MickyT dengan menggunakan pengindeksan array dandiff untuk menghitungnya. Sayang.

Cobalah online!

Giuseppe
sumber
1

Mathematica, 119 115 byte

(n=#;Tr[1^Select[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),#<n&]])&

Akhirnya saya berhasil dan saya telah mencoba selama setengah jam terakhir. ._.

Contoh dijalankan

tidak ada deskripsi untuk Anda!

benar-benar manusiawi
sumber
Casesadalah 4byte pendek: Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&. Lihat tip ini .
ngenisis
1
@ngenisis sebenarnya Countlebih pendek dari Cases. Count[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+‌​(1+Length@Divisors@#‌​)/2]]&/@Range@10000)‌​,n_/;n<#]&
JungHwan Min
Juga, 10^4atau 1*^4lebih pendek dari 10000, dan /@Range@sama dengan ~Array~.
JungHwan Min
1

Mathematica, 78 byte

(s=#;Tr[1^Select[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],#<s&]])&
J42161217
sumber
Casesadalah 4byte pendek: Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&. Lihat tip ini .
ngenisis
1
@ngenisis Countbahkan lebih pendek:Count[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^‌​4}],s_/;s<#]&
JungHwan Min
1

Sekam , 19 byte

#ȯV<⁰Sz≠↔§f`¦ḣḣ□100

Tidak ada tautan TIO, karena sudah habis masa berlakunya. Versi ini menggunakan 100 di tempat 10.000 dan selesai dalam beberapa detik.

Penjelasan

Husk belum memiliki pembagi bawaan atau dukungan untuk notasi ilmiah.

#ȯV<⁰Sz≠↔§f`¦ḣḣ□100  Input is n (accessed with ⁰).
               □100  Square of 100: 10000
              ḣ      Inclusive range from 1.
#                    Count number of elements for which
 ȯ                   this composition of 3 functions gives truthy result:
                       Argument k, say k = 12.
         §f`¦ḣ         Divisors of k:
             ḣ           Range: [1,2,3,..,12]
         §f              Filter by
           `¦            divides k: [1,2,3,4,6,12]
     Sz≠↔              Absolute differences of divisor pairs:
        ↔                Reverse: [12,6,4,3,2,1]
     Sz                  Zip with divisor list
       ≠                 using absolute difference: [11,4,1,1,4,11]
  V<⁰                  Is any of these less than n?
Zgarb
sumber
1

Japt , 25 19 17 byte

L²õÈâ ®aX/ZÃd<UÃè

Menguji


Penjelasan

Input bilangan bulat implisit U.

L²õ

Buat array bilangan bulat ( õ) dari 1 hingga 100 ( L) kuadrat.

Èâ          Ã

Lewati setiap fungsi (di mana Xelemen saat ini) yang menghasilkan array dari pembagi ( â) dari X.

®    Ã

Memetakan di atas array pembagi, di mana Zelemen saat ini.

aX/Z

Dapatkan perbedaan absolut ( a) dari Zdan Xdibagi dengan Z.

d<U

Apakah ada elemen ( d) di array yang dihasilkan kurang dari U?

è

Hitung elemen kebenaran dan secara implisit mengeluarkan hasilnya.

Shaggy
sumber
1

Ruby, 62 byte

->n{(1..1e4).count{|x|(1..x).any?{|i|1>x%i&&x/i<=i&&i-x/i<n}}}

Cobalah online.

Cristian Lupascu
sumber
1

TI-BASIC, 46 byte

Perhatikan bahwa TI-BASIC adalah bahasa tokenized. Juga, E pada baris 2 adalah modal kecil E, ditemukan dengan menekan 2ND +,.

Input A
DelVar DFor(B,1,E4
For(C,1,√(B
If not(fPart(B/C
B/C-C<A
End
D+Ans→D
End

Hasilnya akan di D, dan Ans segera setelah eksekusi program. Jika ingin ditampilkan, menambahkan dua byte lagi (baris baru dan Ans) sudah cukup.

Josiah Winslow
sumber
0

Python 2 , 134 byte

lambda i:len(filter(lambda n:n<i,[reduce(lambda x,y:y-x,[[x,n/x]for x in range(1,int(n**.5+1))if n%x<1][-1])for n in range(1,10001)]))

Cobalah online!

Eugh ... perlu melakukan yang lebih baik.

benar-benar manusiawi
sumber
125 byte (-9 byte) menggunakan pendekatan Anda saat ini, tetapi menggantinya len(filter(lambda n:n<i,...))dengansum(n<i for n in ....)
Tn. Xcoder
114 byte berdasarkan komentar Mr.Xcoder.
Ovs
113 byte berdasarkan komentar ovs.
Tn. Xcoder
0

Python 2 , 83 byte

Sedikit di sisi lambat, menggunakan 5 detik per test case

lambda x:sum(x>min(abs(y/t-t)for t in range(1,y+1)if y%t<1)for y in range(1,10001))

Cobalah online!

Halvard Hummel
sumber
0

PHP, 94 +1 byte

for(;$n++<1e4;$c+=$d<$argn)if(($i=$n**.5)>~~$i){while($n%++$i);for($d=1;$n%--$i;)$d++;}echo$c;

Jalankan sebagai pipa dengan -nRatau coba online .

Titus
sumber
0

VB.NET (.NET 4.5) 116 115 byte

Function A(n)
For i=1To 10^4
Dim s As Byte=Math.Sqrt(i)
While i Mod s>0
s-=1
End While
A-=i/s-s<n
Next
End Function

Penjelasan:

Sebuah fungsi yang dibutuhkan n sebagai parameter, dan mengembalikan hasilnya.

Mulai dari akar kuadrat, dan mencari bilangan bulat terdekat yang membagi secara merata (akan menjadi lebih kecil dari MaxMin Divisor Pair). Kemudian dapatkan yang lebih besar dari pasangan ( i/s), temukan perbedaannya, dan bandingkan dengan input.


Strategi bermain golf yang digunakan:

  • Dim itu mahal, jadi semakin sedikit variabel yang saya nyatakan lebih baik.
  • Saya mulai mencari di akar kuadrat, tetapi hanya ingin melihat bilangan bulat. Dengan mendeklarasikan ssebagai tipe integral, itu dilemparkan ke lantai untuk saya.
  • VB digunakan ^sebagai eksponen. Jadi sementara 100005 karakter, 10^4hanya 4.
  • VB membuat variabel otomatis dengan nama dan tipe yang sama dengan definisi fungsi (dalam kasus saya A). Di akhir fungsi, jika tidak adareturn , nilai variabel fungsi akan dikembalikan sebagai gantinya. Jadi saya menyimpan karakter dengan tidak mendeklarasikan variabel yang terpisah dan tidak menggunakan pernyataan pengembalian.
  • VB memiliki pengetikan / casting yang sangat pemaaf. idiasumsikan Integerkarena saya menetapkan literal integer. Adiasumsikan Objecttetapi segera setelah saya menambahkan bilangan bulat, itu berperilaku seperti Integer.
  • Daripada ifmemeriksa apakah perbedaannya memuaskan, tambahkan langsung ke hasil dengan melemparkan boolean ke integer. Namun, VB menggunakan -1untuk True, jadi kurangi untuk mendapatkan tanda yang benar.
  • Secara teknis, kami Modtidak ingin 0. Mengambil modulus dari angka negatif di VB.NET akan memberikan hasil negatif. Tapi, semuanya positif jadi saya bisa menyimpan byte dengan mengubahnya <>menjadi >.
  • Angka terbesar untuk diperiksa adalah 10.000. Akar kuadrat dari itu adalah 100. Jadi saya hanya perlu Bytemenyimpannya, menghemat byte dalam deklarasi dengan menggunakan jenis yang lebih pendek.

Cobalah online!

Brian J
sumber