MaxMin除数对(DMDP)的差异


18

让我们谈谈除数...

撇开完美的平方(片刻),所有正整数都可以表示为其2除数的乘积。快速示例126:这是的所有除数126
在此处输入图片说明

如您所见,所有除数可以配对。这就是我们所说的除数对
[1, 126], [2, 63], [3, 42], [6, 21], [7, 18], [9, 14]

对于此挑战,我们只需要此列表最后一对(即图片的中心对
[9,14]:。我们将其称为MaxMin Divisor Pair
最大最小除数对的差分 (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}

正如你在这种情况下,看到了最大最小除数对[8,8]具有DMDP=0
我们几乎完成..

挑战

给定一个整数n>0,输出小于或等于多少个整数 10000DMDP小于 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第二个变量作为输入是否更有意义?
乔纳森·艾伦

1
是的,我曾考虑过这一点,但这并没有增加任何挑战。通过这种方式,我认为每个人都更容易理解挑战。

Answers:


5

JavaScript(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个字节

1字节感谢Jonathan Allan。

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

在线尝试!


ÆDạ"Ṛ$Ṃ为您节省了一个字节ÆDạ:@¥⁸Ṃ(我有ạ"ṚṂ…… ȷ4RÆDÇ€<⁸S15岁-太相似了-编辑:嗯,还是不:涉及,您觉得呢?)
乔纳森·艾伦

@JonathanAllan我认为你应该发布 这个13人
Leaky Nun

哇哦 不,你去了,我为您节省了一个字节,另存了2个字节!
乔纳森·艾伦,

你能补充一个解释吗?
凯文·克鲁伊森

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;}

-10个字节,感谢@Nevay

说明:

在这里尝试。

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个字节。
涅瓦

没有时间自己尝试,但是让内部循环从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,因为这是您第二次在我的代码中使用它。
凯文·克鲁伊森

2

R,73 77字节

感谢@Guiseppe提供了4个字节

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

在线尝试!

已经失去了向量化功能来计算DMDP的功能,现在正在对该功能使用sapply。小于输入项的真相将被求和。


啊,我没有注意到DMDP是该因子列表的最小差异!非常好。我认为sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())要短一些
Giuseppe

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

05AB1E19 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,119 115字节

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

终于使这件事工作了,过去半个小时我一直在努力。._。

运行示例

没有适合您的描述!


Cases4字节短:Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&。看到这个技巧
ngenisis

1
@ngenisis实际上Count比还要短CasesCount[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+‌​(1+Length@Divisors@#‌​)/2]]&/@Range@10000)‌​,n_/;n<#]&
JungHwan Min

同样,10^41*^4比短于10000,并/@Range@等于~Array~
JungHwan Min

1

Mathematica,78个字节

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

Cases4字节短:Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&。看到这个技巧
ngenisis '17

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链接,因为它超时。 此版本使用100代替10000,并在几秒钟内完成。

说明

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

Japt25 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是一个小写字母E,可通过按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

结果将显示在D中,程序执行后立即显示Ans。如果要显示它,再增加两个字节(换行符和Ans)就足够了。




0

PHP,94 + 1字节

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

与管道一起运行-nR在线尝试


0

VB.NET(.NET 4.5)116115字节

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 ^用作指数。所以虽然10000是5个字符,但10^4只有4 个字符。
  • VB创建一个自动变量,其名称和类型与函数定义相同(在我的情况下为A)。在函数末尾,如果没有return,则将返回函数变量的值。因此,我通过不声明单独的变量并且不使用return语句来保存字符。
  • VB具有非常宽容的打字/广播功能。i假定Integer是因为我分配了整数文字。A是假定的,Object但是一旦我添加一个整数,它的行为就类似于Integer
  • 而不是if检查差异是否令人满意,而是通过将布尔值转换为整数直接将其添加到结果中。但是,VB使用-1for True,因此减去以得到正确的符号。
  • 从技术上讲,我们不想Mod成为0。在VB.NET中采用负数的模数将得到负数的结果。但是,一切都是肯定的,因此我可以通过将<>变为来节省一个字节>
  • 要检查的最大数字是10000。该数字的平方根是100。因此,我只需要Byte存储一个数字,即可使用较短的命名类型将字节保存在声明中。

在线尝试!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.