MaxMin 제수 쌍 (DMDP)의 차이점


18

제수에 대해 이야기합시다 ...

완전한 정사각형 (순간)을 제외하고 모든 양의 정수는 2의 제수 의 으로 표현할 수 있습니다 . 빠른 예 126: 여기에 모든 제수가 있습니다.126
여기에 이미지 설명을 입력하십시오

보시다시피 모든 제수는 쌍을 이룰 수 있습니다. 다음은 Divisor Pairs입니다 .
[1, 126], [2, 63], [3, 42], [6, 21], [7, 18], [9, 14]

이 문제를 해결하려면 이 목록마지막 쌍 ( 그림 의 중앙 쌍) 만 필요
[9,14]합니다 .. 이 쌍을 MaxMin Divisor Pair라고 합니다. MaxMin 제수 쌍의 차이 (DMDP)는 인 한 쌍의 두 요소의 차이 에 대한 또 하나의 예 . 제수는 다음과 같습니다.
[9,14]=5
544

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

DMDP (544)는 15 = 때문에을32-17=15

무엇에 대한 완벽한 사각형 ? 모든 제곱은 DMDP = 0
입니다. 예를 들어 64, 제수 를 예로 들어 봅시다

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

이 경우에서 볼 수 있듯이 MaxMin 제수 쌍 입니다 [8,8]가지고있는 DMDP=0
우리가 거의 완료 ..

도전

정수 감안할 때 n>0, 출력 또는 동등보다 작 얼마나 많은 정수 10000 , 이하 DMDP이 n

테스트 사례

입력-> 출력

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

이것은 입니다. 바이트 단위의 가장 빠른 답변 wins .


10000변수를 두 번째로 입력 하는 것이 더 합리적이지 않습니까?
Jonathan Allan

1
예, 나는 그것에 대해 생각했지만 도전에 아무것도 추가하지 않을 것입니다. 이런 식으로 모든 사람이 도전을 이해하는 것이 더 쉽다고 생각합니다.

답변:


5

자바 스크립트 (ES7), 60 바이트

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

아마도 재귀 제한을 초과하므로 70 바이트의 반복 버전을 선호 할 수 있습니다.

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

4

젤리 , 13 바이트

Jonathan Allan 덕분에 1 바이트.

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

온라인으로 사용해보십시오!


ÆDạ"Ṛ$Ṃ이상 당신에게 바이트를 저장 ÆDạ:@¥⁸Ṃ(내가했다 ạ"ṚṂ... ȷ4RÆDÇ€<⁸S: 흠하거나, 전혀 없었다 EDIT 15 - - 너무 유사 :당신은 어떻게 생각하십니까 ... 관련?)
조나단 앨런에게


오 와우. nah 당신은 그것을 위해 가고, 나는 당신에게 또 다른 2를 저장하는 1 바이트를 저장했습니다!
Jonathan Allan

설명을 추가해 주시겠습니까?
Kevin Cruijssen

4

자바 (8) 151 111 110 101 바이트

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 덕분에 -10 바이트 .

설명:

여기에서 시도하십시오.

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
for(i=1,i+=Math.sqrt(x);--i>0;)if(...1 바이트를 저장 하는 데 사용할 수 있습니다 .
Nevay

직접 시도해 볼 시간이 없지만 내부 루프를 x에서 시작하고 현재 최소값에 대한 추가 변수를 갖는 것이 더 짧습니까?
JollyJoker

1
101 바이트 :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 다시 한 번 감사드립니다. x>=i*i을 사용하는 대안 으로 기억해야 Math.sqrt합니다. 내 코드에서 두 번째로 골프를 쳤기 때문입니다.
Kevin Cruijssen

2

R 73 77 바이트

4 바이트에 대한 @Guiseppe에게 감사드립니다.

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

온라인으로 사용해보십시오!

DMDP를 계산하기 위해 벡터화 기능을 잃어 버렸으며 이제이 기능에 대해 분산을 사용하고 있습니다. 입력 값보다 작은 항목에 대한 진실이 결과에 합산됩니다.


아, DMDP가 그 요인 목록의 최소 차이라는 것을 알지 못했습니다! 아주 좋아요 sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())조금 더 짧은 것 같아요
주세페

2

Mathematica, 64 바이트

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

Wolfram Sandbox에서 사용해보십시오

용법

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}

설명

Divisors~Array~1*^4

에서 제수의 목록 생성 1에를 10000. (제수 목록은 자동으로 정렬됩니다)

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

다음 a과 같은 요소의 발생 횟수를 계산하십시오 .

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

(input) + (left one of the middle element(s)) > (right one of the middle element(s)) 중간 요소가 하나만 있으면 left = right입니다.


2

05AB1E , 19 18 17 16 15 12 바이트

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

온라인으로 사용해보십시오!

설명

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 바이트

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

코드가 TIO에서 시간 초과됩니다. 다음은 오프라인 컴파일러로 실행되는 예입니다.

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


1

Mathematica, 119115 바이트

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

나는 마침내이 일을하고 지난 30 분 동안 노력 해왔다. ._.

예제 실행

no description for you!


Cases입니다 4짧은 바이트 : Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&. 이 팁을 참조하십시오 .
ngenisis

1
@ngenisis는 실제로 Count보다 짧습니다 Cases. Count[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+‌​(1+Length@Divisors@#‌​)/2]]&/@Range@10000)‌​,n_/;n<#]&
JungHwan Min

또한, 10^4또는 1*^4보다 짧은 10000, 그리고 /@Range@에 equaivalent입니다 ~Array~.
JungHwan Min

1

Mathematica, 78 바이트

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

Cases입니다 4짧은 바이트 : Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&. 이 팁을 참조하십시오 .
ngenisis

1
@ngenisis Count는 더 짧습니다 :Count[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^‌​4}],s_/;s<#]&
JungHwan Min

1

껍질 , 19 바이트

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

시간이 초과되어 TIO 링크가 없습니다. 이 버전 은 10000 대신 100을 사용하고 몇 초 안에 완료됩니다.

설명

Husk에는 제수가 아직 내장되어 있지 않거나 과학적 표기법을 지원하지 않습니다.

#ȯ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 바이트

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

그것을 테스트


설명

정수의 암시 적 입력 U .

L²õ

õ1에서 100 ( L)의 제곱 으로 정수 배열 ( )을 생성하십시오 .

Èâ          Ã

X의 제수 ( â)의 배열을 생성하는 함수 ( 현재 요소가있는 곳 ) 를 통해 각각 전달하십시오 X.

®    Ã

Z현재 요소가있는 해당 제수 배열을 맵핑 하십시오.

aX/Z

의 절대 차이 ( a)를 ZX나눕니다 Z.

d<U

d결과 배열 의 요소 ( )가 U? 보다 작 습니까?

è

진실 요소를 세고 결과를 내재적으로 출력합니다.



1

TI-BASIC, 46 바이트

TI-BASIC은 토큰 화 된 언어입니다. 또한 2 행의 E는 2ND +,을 눌러 작은 자본 E입니다.

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

결과는 D로, Ans는 프로그램 실행 직후에 나타납니다. 그것이 표시된다면, 2 바이트를 더 추가하면 (줄 바꿈 및 Ans) 충분합니다.


0

파이썬 2 , 134 바이트

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

온라인으로 사용해보십시오!

어 ... 훨씬 더 잘해야합니다 .


125 바이트 (-9 바이트) 현재의 접근 방식을 사용하지만, 교체 len(filter(lambda n:n<i,...))sum(n<i for n in ....)
씨 Xcoder

Mr.Xcoder의 의견에 따라 114 바이트 .
ovs

ovs의 의견에 따라 113 바이트 .
Mr. Xcoder



0

VB.NET (.NET 4.5) 116 115 바이트

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

설명:

필요한 기능 n 파라미터로하고, 그 결과를 반환한다.

제곱근에서 시작하여 균등하게 나누는 가장 가까운 정수를 찾습니다 ( MaxMin Divisor Pair ). 그런 다음 더 큰 쌍 ( i/s)을 가져 와서 차이를 찾아 입력과 비교합니다.


사용 된 골프 전략 :

  • Dim 값이 비싸므로 더 적은 변수를 선언하는 것이 좋습니다.
  • 제곱근부터 검색을 시작하지만 정수만보고 싶습니다. 선언함으로써s일체형으로 하면 바닥에 던져집니다.
  • VB는 ^지수로 사용 합니다. 따라서 100005 자이지만 10^44 자입니다.
  • VB는 함수 정의 (내 경우에는 A)와 동일한 이름과 유형으로 자동 변수를 만듭니다. 함수의 끝에서가 없으면 return함수 변수의 값이 대신 반환됩니다. 따라서 별도의 변수를 선언하지 않고 return 문을 사용하지 않고 문자를 저장합니다.
  • VB는 타이핑 / 캐스팅을 매우 용서합니다. 정수 리터럴을 할당했기 때문에 i가정 Integer됩니다. A가정 Object하지만 정수를 추가하자마자처럼 작동합니다 Integer.
  • if차이가 만족 스러운지 확인하는 대신 부울을 정수로 캐스트하여 결과에 직접 추가하십시오. 그러나, VB는 사용 -1을 위해True 하므로 올바른 부호를 얻으려면 빼십시오.
  • 기술적으로, 우리는되고 싶지 Mod않습니다 0. VB.NET에서 음수의 계수를 취하면 음의 결과가 나타납니다. 내가 돌려 바이트를 저장할 수 있도록하지만, 모든 것이 긍정적 <>으로 >.
  • 확인할 가장 큰 숫자는 10000입니다. 그 제곱근은 100입니다. 따라서 Byte짧은 이름을 가진 유형을 사용하여 선언에 바이트를 저장하여 저장하면됩니다.

온라인으로 사용해보십시오!


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.