Sự khác biệt của các cặp chia MaxMin (DMDP)


18

Hãy nói về ước số ...

Rời khỏi các ô vuông hoàn hảo (trong một khoảnh khắc), tất cả các số nguyên dương có thể được biểu diễn dưới dạng tích của 2 ước của chúng. Ví dụ nhanh cho 126: Dưới đây là tất cả các ước của126
nhập mô tả hình ảnh ở đây

Như bạn có thể thấy tất cả các ước số có thể được ghép nối. Dưới đây là những gì chúng ta sẽ gọi là Cặp chia :
[1, 126], [2, 63], [3, 42], [6, 21], [7, 18], [9, 14]

Đối với thử thách này, chúng tôi sẽ chỉ cần cặp cuối cùng của danh sách này (là cặp trung tâm của hình ảnh) :.
[9,14]Chúng tôi sẽ gọi cặp này là Cặp phân chia MaxMin .
Sự khác biệt của cặp số chia MaxMin (DMDP) là sự khác biệt của hai yếu tố của cặp đó là [9,14]=5
một ví dụ nữa cho 544. Các ước số là:

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

DMDP (544) = 1532-17=15

Những hình vuông hoàn hảo thì sao? Tất cả các hình vuông hoàn hảo có DMDP = 0
Hãy lấy ví dụ 64với ước số

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

Như bạn có thể thấy trong trường hợp này MaxMin Divisor Pair[8,8]trong đó có DMDP=0
chúng ta đang gần hoàn tất ..

Các thách thức

Cho một số nguyên n>0, xuất ra có bao nhiêu số nguyên nhỏ hơn hoặc bằng 10000 , có DMDP nhỏ hơn n

Các trường hợp thử nghiệm

đầu vào -> đầu ra

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

Đây là Câu trả lời ngắn gọn nhất trong byte thắng .


Sẽ không có ý nghĩa hơn khi có 10000đầu vào thứ hai, biến, đầu vào?
Jonathan Allan

1
Vâng, tôi đã nghĩ về điều đó nhưng nó sẽ không thêm bất cứ điều gì vào thử thách. Theo cách này tôi nghĩ mọi người sẽ dễ dàng hiểu được thử thách hơn.

Câu trả lời:


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

Có thể vượt quá giới hạn đệ quy của bạn, vì vậy bạn có thể thích phiên bản lặp cho 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

4

Thạch , 13 byte

1 byte nhờ Jonathan Allan.

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

Hãy thử trực tuyến!


ÆDạ"Ṛ$Ṃtiết kiệm cho bạn một byte hơn ÆDạ:@¥⁸Ṃ(tôi đã ạ"ṚṂ... ȷ4RÆDÇ€<⁸Strong 15 - quá giống nhau - EDIT: hmm hoặc là nó, không :liên quan ... bạn nghĩ gì?)
Jonathan Allan


Tuyệt vời. nah bạn đi cho nó, tôi đã tiết kiệm cho bạn một byte mà tiết kiệm thêm 2!
Jonathan Allan

Bạn có thể thêm một lời giải thích?
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 nhờ @Nevay .

Giải trình:

Hãy thử nó ở đây.

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

1
Bạn có thể sử dụng for(i=1,i+=Math.sqrt(x);--i>0;)if(...để lưu 1 byte.
Nevay

Đừng có thời gian để tự mình thử, nhưng nó sẽ ngắn hơn khi vòng lặp bên trong bắt đầu từ x và có thêm một biến cho mức tối thiểu hiện tại?
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 Cảm ơn một lần nữa, thực sự cần phải nhớ x>=i*ithay thế cho việc sử dụng Math.sqrt, vì đây là lần thứ hai bạn chơi golf trong mã của tôi.
Kevin Cruijssen

2

R , 73 77 byte

Cảm ơn @Guiseppe cho 4 byte

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

Hãy thử trực tuyến!

Đã mất chức năng vectorize để tính DMDP và hiện đang sử dụng một cách khéo léo qua chức năng. Các sự thật cho các mục nhỏ hơn đầu vào được tính tổng cho kết quả.


À, tôi không nhận thấy DMDP là khác biệt tối thiểu của danh sách nhân tố đó! Rất đẹp. Tôi nghĩ sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())là ngắn hơn một chút
Giuseppe

2

Toán học, 64 byte

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

Dùng thử trên Wolfram Sandbox

Sử dụng

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}

Giải trình

Divisors~Array~1*^4

Tạo danh sách các ước, từ 1đến 10000. (danh sách các ước số được sắp xếp tự động)

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

Đếm số lần xuất hiện của các phần tử a, sao cho ...

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

(input) + (left one of the middle element(s)) > (right one of the middle element(s)) Nếu chỉ có một yếu tố ở giữa, trái = phải.


2

05AB1E , 19 18 17 16 15 12 byte

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

Hãy thử trực tuyến!

Giải trình

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

1

MATL , 20 byte

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

Mã hết thời gian trong TIO. Dưới đây là một ví dụ chạy với trình biên dịch ngoại tuyến:

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


1

Toán học, 119 115 byte

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

tôi Cuối cùng đã làm điều này hoạt động và tôi đã cố gắng trong nửa giờ qua. ._.

Chạy ví dụ

không có mô tả cho bạn!


Cases4byte ngắn hơn : Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&. Xem mẹo này .
ngenisis

1
@ngenisis thực sự Countthậm chí còn ngắn hơn Cases. Count[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+‌​(1+Length@Divisors@#‌​)/2]]&/@Range@10000)‌​,n_/;n<#]&
JungHwan Min

Ngoài ra, 10^4hoặc 1*^4ngắn hơn 10000, và /@Range@tương đương với ~Array~.
JungHwan Min

1

Toán học, 78 byte

(s=#;Tr[1^Select[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],#<s&]])&

Cases4byte ngắn hơn : Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&. Xem mẹo này .
ngenisis

1
@ngenisis Countthậm chí còn ngắn hơn:Count[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^‌​4}],s_/;s<#]&
JungHwan Min

1

Husk , 19 byte

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

Không có liên kết TIO, vì nó hết thời gian. Phiên bản này sử dụng 100 thay cho 10000 và kết thúc sau vài giây.

Giải trình

Husk chưa có ước số tích hợp hoặc hỗ trợ cho ký hiệu khoa học.

#ȯ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?

1

Japt , 25 19 17 byte

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

Kiểm tra nó


Giải trình

Đầu vào ngầm định của số nguyên U.

L²õ

Tạo một mảng các số nguyên ( õ) từ 1 đến 100 ( L) bình phương.

Èâ          Ã

XTruyền cho nhau thông qua một hàm (trong đó là phần tử hiện tại) tạo ra một mảng các ước số ( â) của X.

®    Ã

Ánh xạ qua mảng ước số đó, đâu Zlà phần tử hiện tại.

aX/Z

Lấy sự khác biệt tuyệt đối ( a) của ZXchia cho Z.

d<U

Có bất kỳ phần tử ( d) nào trong mảng kết quả nhỏ hơn Ukhông?

è

Đếm các yếu tố trung thực và ngầm đưa ra kết quả.



1

TI-BASIC, 46 byte

Lưu ý rằng TI-BASIC là ngôn ngữ được mã hóa. Ngoài ra, E trong dòng 2 là một vốn nhỏ E, được tìm thấy bằng cách nhấn 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

Kết quả sẽ ở D và Ans ngay sau khi thực hiện chương trình. Nếu nó được hiển thị, thêm hai byte (dòng mới và Ans) sẽ đủ.


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

Hãy thử trực tuyến!

Thật ... cần phải làm tốt hơn nhiều .


125 byte (-9 byte) bằng cách sử dụng phương pháp hiện tại của bạn, nhưng thay thế len(filter(lambda n:n<i,...))bằngsum(n<i for n in ....)
Ông Xcoder

114 byte dựa trên nhận xét của Mr.Xcoder.
lò nướng

113 byte dựa trên bình luận của ovs.
Ông Xcoder


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;

Chạy như ống với -nRhoặc thử trực tuyến .


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

Giải trình:

Một hàm lấy ntham số và trả về kết quả.

Bắt đầu từ căn bậc hai và tìm số nguyên gần nhất chia đều (sẽ nhỏ hơn MaxMin Divisor Pair). Sau đó, lớn hơn của cặp ( i/s), tìm sự khác biệt và so sánh với đầu vào.


Chiến lược chơi gôn được sử dụng:

  • Dim là đắt tiền, vì vậy càng ít biến tôi khai báo càng tốt.
  • Tôi bắt đầu tìm kiếm ở căn bậc hai, nhưng chỉ muốn nhìn vào số nguyên. Bằng cách khai báos là một loại tích phân, nó sẽ chuyển sang sàn cho tôi.
  • VB sử dụng ^như số mũ. Vì vậy, trong khi 10000là 5 ký tự, 10^4chỉ có 4.
  • VB tạo một biến tự động có cùng tên và loại với định nghĩa hàm (trong trường hợp của tôi A). Khi kết thúc hàm, nếu không có return, giá trị của biến hàm sẽ được trả về. Vì vậy, tôi lưu các ký tự bằng cách không khai báo một biến riêng và không sử dụng câu lệnh return.
  • VB có gõ / đúc rất tha thứ. iđược giả sử Integerbởi vì tôi đã gán một số nguyên. Ađược giả sử Objectnhưng ngay khi tôi thêm một số nguyên, nó hoạt động như mộtInteger .
  • Thay vì ifkiểm tra sự khác biệt đó là thỏa đáng, hãy thêm nó trực tiếp vào kết quả bằng cách chuyển boolean thành một số nguyên. Tuy nhiên, VB sử dụng -1choTrue , nên trừ để có được dấu chính xác.
  • Về mặt kỹ thuật, chúng tôi muốn Modkhông được 0. Lấy mô-đun của một số âm trong VB.NET sẽ cho kết quả âm. Nhưng, mọi thứ đều tích cực để tôi có thể lưu một byte bằng cách chuyển <>vào >.
  • Số lượng lớn nhất để kiểm tra là 10000. Căn bậc hai của số đó là 100. Vì vậy, tôi chỉ cần Bytelưu trữ số đó, lưu byte trong khai báo bằng cách sử dụng loại có tên ngắn hơn.

Hãy thử trực tuyến!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.