除数富数和穷数


18

介绍

在奇异的整数世界中,除数就像资产,他们习惯称除数比其反转多的数字为“有钱”,而称除数比其反转数少的数字为“差”。

例如,号码2401有五个除数:1,7,49,343,2401,而其逆转,1042,只有四个:1,2,521,1042
因此,2401被称为富人数量,而1042数。

给定此定义,我们可以创建以下两个整数,分别包含有数字和无数字:

(here we list the first 25 elements of the sequences)

 Index | Poor | Rich
-------|------|-------
     1 |   19 |   10
     2 |   21 |   12
     3 |   23 |   14
     4 |   25 |   16
     5 |   27 |   18
     6 |   29 |   20
     7 |   41 |   28
     8 |   43 |   30
     9 |   45 |   32
    10 |   46 |   34
    11 |   47 |   35
    12 |   48 |   36
    13 |   49 |   38
    14 |   53 |   40
    15 |   57 |   50
    16 |   59 |   52
    17 |   61 |   54
    18 |   63 |   56
    19 |   65 |   60
    20 |   67 |   64
    21 |   69 |   68
    22 |   81 |   70
    23 |   82 |   72
    24 |   83 |   74
    25 |   86 |   75
   ... |  ... |  ...

注意事项:

  • 表示数字的 “反转”是指其数字反转,即以10为底的数字反转。这意味着,与一个或多个零结尾号码将有一个“短的”反转:例如逆转19000091因此91
  • 我们有意排除除数与逆数相同的整数,即属于OEIS:A062895的整数

挑战

考虑到上面定义的两个序列,您的任务是编写一个程序或函数,给定一个整数n(可以选择0或1索引),该程序或函数将返回第n个穷数和第n个富数。

输入值

  • 整数(>= 0如果是0索引或>= 11索引)

输出量

  • 2个整数,一个用于较差序列,一个用于富序列,只要您保持一致即可

例子 :

INPUT          |   OUTPUT
----------------------------------
n (1-indexed)  |   poor    rich
----------------------------------
1              |   19      10
18             |   63      56
44             |   213     112
95             |   298     208
4542           |   16803   10282
11866          |   36923   25272
17128          |   48453   36466
22867          |   61431   51794
35842          |   99998   81888

通用规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能简短的答案。
  • 标准规则适用于具有默认I / O规则的答案,因此允许您使用STDIN / STDOUT,具有适当参数的函数/方法以及返回类型的完整程序。你的来电。
  • 默认漏洞是禁止的。
  • 如果可能的话,请添加一个带有测试代码的链接(即TIO)。
  • 另外,强烈建议为您的答案添加说明。

2
猜想:第个穷数始终大于第n个富数。如果有人可以证明这一点,那么可能会减少很多答案的字节数。nn
罗宾·赖德

@RobinRyder:我怀疑这是真的,但是证明这是一个完全不同的故事:)
digEmAll

@RobinRyder考虑到由于前导零,多个数字可以映射到相同的反向数字(例如51、510、5100都映射到15)。对于每一个数字,会有更丰富的相应反转的数字与尾随零的无限数量(具有额外的因子10 100 1000,等),而仅较差反转数的有限数量。我认为这并不能完全证明这一点(也许在穷途末路有一个幸运数字的穷人链),但它至少表明富人的数量比穷人多得多。n10,100,1000
乔·金

2
@JoKing“……富人比穷人多得多”。可能想澄清这一说法;如所写,它可以解释为说,富数集比穷数集具有更大的基数。但是当然,这两个集合都是无穷大的(两个序列都没有终止):足以证明有无数个素数的第一个数字是a 2。对于这一点,见推论1.4在下面的文章的最后,用n等于19, 199, 1999, ...m-hikari.com/ijcms-password/ijcms-password13-16-2006/...
mathmandan

Answers:


9

05AB1E,16个字节

∞.¡ÂÑgsÑg.S}¦ζsè

在线尝试!


0索引[有钱,有钱]:

∞                # Push infinite list.
 .¡        }     # Split into three lists by...
   ÂÑgsÑg.S      # 1 if rich, 0 if nothing, -1 if poor.
            ¦ζ   # Remove list of nothings, and zip rich/poor together.
              sè # Grab nth element.

也许有人可以解释为什么这个版本似乎没有终止,但是当我在TIO上单击“取消执行”时,它以正确的答案结束,或者如果您等待60秒,您将获得正确的答案。对于“正确”终止的版本,您可以使用:T+nL.¡ÂÑgsÑg.S}¦ζsè+3个字节


对于无限列表,分割方式似乎效果不佳。
Emigna

@Emigna个人而言,我什至不知道无限列表是怎么可能的。
魔术章鱼缸

懒惰的评估。不要计算您不需要的数字。因此∞n5è只会计算前6个数字。我认为,当这些类型的循环/分组/拆分构造发挥作用时,惰性评估失败,它会尝试在返回之前计算所有项目。
Emigna

1
我仍然认为应该有一个1字节的内置€g..我经常使用它。使用(现在等于字节)替代方法会在这里保存一个字节‚рgÆ.±。不错的答案!大用法
凯文·克鲁伊森

@KevinCruijssen另外2个字节是δg大声笑。
魔术章鱼缸

6

的JavaScript(ES6), 121个115 113  111字节

输入为1索引。输出为[poor, rich]

x=>[(s=h=(n,i=x)=>i?h(++n,i-=(g=(n,k=n)=>k&&!(n%k)*~-s+g(n,k-1))(n)>g([...n+''].reverse().join``)):n)``,h(s=2)]

在线尝试!

已评论

辅助功能

g = (n,                   // g is a helper function taking n and returning either the
        k = n) =>         // number of divisors or its opposite; starting with k = n
  k &&                    // if k is not equal to 0:
    !(n % k)              //   add either 1 or -1 to the result if k is a divisor of n
    * ~-s                 //   use -1 if s = 0, or 1 if s = 2
    + g(n, k - 1)         //   add the result of a recursive call with k - 1

主要

x => [                    // x = input
  ( s =                   // initialize s to a non-numeric value (coerced to 0)
    h = (n,               // h is a recursive function taking n
            i = x) =>     // and using i as a counter, initialized to x
      i ?                 // if i is not equal to 0:
        h(                //   do a recursive call ...
          ++n,            //     ... with n + 1
          i -=            //     subtract 1 from i if:
            g(n)          //       the number of divisors of n (multiplied by ~-s within g)
            >             //       is greater than
            g(            //       the number of divisors of the reversal of n obtained ...
              [...n + ''] //         ... by splitting the digits
              .reverse()  //             reversing them
              .join``     //             and joining back
            )             //       (also multiplied by ~-s within g)
        )                 //   end of recursive call
      :                   // else:
        n                 //   we have reached the requested term: return n
  )``,                    // first call to h for the poor one, with n = s = 0 (coerced)
  h(s = 2)                // second call to h for the rich one, with n = s = 2
]                         // (it's OK to start with any n in [0..9] because these values
                          // are neither poor nor rich and ignored anyway)

4

果冻,22字节

ṚḌ;⁸Æd
Ç>/$Ɠ©#żÇ</$®#Ṫ

在线尝试!

一个完整的程序,在stdin上使用1索引的ñ并按该顺序返回第n个可怜和有钱整数的列表。

说明

ṚḌ;⁸Æd | Helper link: take an integer and return the count of divisors fof its reverse and the original number in that order

Ṛ      | Reverse
 Ḍ     | Convert back from decimal digits to integer
  ;⁸   | Concatenate to left argument
    Æd | Count divisors


Ç>/$Ɠ©#żÇ</$®#Ṫ | Main link

    Ɠ©          | Read and evaluate a line from stdin and copy to register
   $  #         | Find this many integers that meet the following criteria, starting at 0 and counting up
Ç               | Helper link
 >/             | Reduce using greater than (i.e. poor numbers)
       ż        | zip with
           $®#  | Find the same number of integers meeting the following criteria
        Ç       | Helper link
         </     | Reduce using less than (i.e. rich numbers)
              Ṫ | Finally take the last pair of poor and rich numbers

4

Wolfram语言(Mathematica),152字节

(a=b=k=1;m=n={};p=AppendTo;While[a<=#||b<=#,#==#2&@@(s=0~DivisorSigma~#&/@{k,IntegerReverse@k++})||If[#<#2&@@s,m~p~k;a++,n~p~k;b++]];{m[[#]],n[[#]]}-1)&

在线尝试!

如果猜想为真,则此140字节的解决方案也适用

(a=k=1;m=n={};p=AppendTo;While[a<=#,#==#2&@@(s=0~DivisorSigma~#&/@{k,IntegerReverse@k++})||If[#<#2&@@s,m~p~k;a++,n~p~k]];{m[[#]],n[[#]]}-1)&   

在线尝试!

这里是差对丰富的情节

在此处输入图片说明


它们真正接近的那个点是什么?
乔·金

1
@JoKing我相信是a(27635)= {70003, 65892}
J42161217

1
大!顺便说一句,这可能是能够在TIO上达到n = 35842的少数解决方案之一(也许是唯一的一种):
digEmAll

3

Perl 6,81个字节

{(*>*,* <*).map(->&c {grep
{[[&c]] map {grep $_%%*,1..$_},$_,.flip},1..*})»[$_]}

在线尝试!

  • * > *是一个匿名函数,如果第一个参数大于第二个参数,则返回true。同样适用于* < *。前者将选择属于富序列的数字,后者将选择属于劣序列的数字。
  • (* > *, * < *).map(-> &c { ... }) 产生一对无限序列,每个无限序列都基于比较器功能之一:富序列和差序列。
  • »[$_]使用$_顶层函数的参数索引到这两个序列中,返回一个由两个元素组成的列表,其中包含$_富序列的$_第th个成员和差序列的第th个成员。
  • grep $_ %% *, 1..$_产生的除数的列表$_
  • map { grep $_ %% *, 1..$_ }, $_, .flip产生的除数的二元素列表,其数字$_的除数$_反转(“翻转”)。
  • [[&c]]用比较器功能&c(大于或小于)减少该两个元素的列表,产生一个布尔值,指示该数字是否属于不良序列的富序列。

1..$_可以^$_。您也可以将移到[$_]地图功能内部。78字节
Jo King

3

Python 2中142个 141字节

f=lambda i,n=1,a=[[],[]]:zip(*a)[i:]or f(i,n+1,[a[j]+[n]*(cmp(*[sum(x%y<1for y in range(1,x))for x in int(`n`[::-1]),n])==1|-j)for j in 0,1])

在线尝试!



非递归替代方案(与其他Python答案非常相似)

Python 2 143字节

i=input()
a=[[],[]];n=1
while~i+len(zip(*a)):([[]]+a)[cmp(*[sum(x%i<1for i in range(1,x))for x in int(`n`[::-1]),n])]+=n,;n+=1
print zip(*a)[i]

在线尝试!


3

Python 2中158个 153字节

-2个字节,感谢shooqie

n=input()
p=[];r=[];c=1
while min(len(p),len(r))<=n:[[],r,p][cmp(*[sum(x%-~i<1for i in range(x))for x in c,int(str(c)[::-1])])]+=[c];c+=1
print p[n],r[n]

在线尝试!

输入为0索引。输出为poor rich


+=[c]代替.append(c)工作吗?
shooqie

@shooqie 它会
阴险

2

红宝石,128字节

输入为零索引。输出为[poor,rich]。

->n,*a{b=[];i=0;d=->z{(1..z).count{|e|z%e<1}};(x=d[i+=1];y=d[i.digits.join.to_i];[[],b,a][x<=>y]<<i)until a[n]&b[n];[a[n],b[n]]}

说明

->n,*a{                             # Anonymous function, initialize poor array
       b=[];i=0;                    # Initialize rich array and counter variable
    d=->z{(1..z).count{|e|z%e<1}};  # Helper function to count number of factors
    (                               # Start block for while loop
     x=d[i+=1];                     # Get factors for next number
     y=d[i.digits.join.to_i];       # Factors for its reverse
                                    # (digits returns the ones digit first, so no reversing)
     [[],b,a][x<=>y]                # Fetch the appropriate array based on
                                    #  which number has more factors
                    <<i             # Insert the current number to that array
    )until a[n]&b[n];               # End loop, terminate when a[n] and b[n] are defined
    [a[n],b[n]]                     # Array with both poor and rich number (implicit return)
}                                   # End function

在线尝试!


2

Perl 6,76个字节

{classify({+(.&h <=>h .flip)},^($_*3+99)){-1,1}[*;$_]}
my&h={grep $_%%*,^$_}

在线尝试!

我没有看到Sean的Perl 6答案,但这以不同的方式起作用。请注意,我已将上限硬编码为n*3+99,这可能并非严格正确。不过,我可以代替*3使用³,如果更准确的没有额外的字节,这将使该方案效率很低。




2

APL(Dyalog Unicode),34个字节

{⍵⌷⍉1↓⊢⌸{×-/{≢∪⍵∨⍳⍵}¨⍵,⍎⌽⍕⍵}¨⍳1e3}

在线尝试!

感谢Adám和ngn帮助我打高尔夫球。

TIO对于较大的索引(需要⍳1e5⍳1e6)超时,但给定足够的时间和内存,该函数将正确终止。


2

R152 137字节

-12字节归因于Giuseppe -3字节归因于digEmAll

n=scan()
F=i=!1:2
`?`=sum
while(?n>i)if(n==?(i[s]=i[s<-sign((?!(r=?rev((T=T+1)%/%(e=10^(0:log10(T)))%%10)*e)%%1:r)-?!T%%1:T)]+1))F[s]=T
F

在线尝试!

T是当前正在尝试的整数;向量中存储了最新的穷人和富人数F

我能找到的最简单的逆整数方法是使用模数运算将其转换为以10为底的数字,然后以10的倒数幂转换回去,但是我希望在这一方面和其他方面不被关注。

说明(以前的类似版本):

n=scan() # input
i=0*1:3  # number of poor, middle class, and rich numbers so far
S=sum
while(S(n>i)){ # continue as long as at least one of the classes has less than n numbers
  if((i[s]=i[
    s<-2+sign(S(!(           # s will be 1 for poor, 2 for middle class, 3 for rich
      r=S((T<-T+1)%/%10^(0:( # reverse integer T with modular arithmetic
        b=log10(T)%/%1       # b is number of digits
        ))%%10*10^(b:0)) 
      )%%1:r)-               # compute number of divisors of r
      S(!T%%1:T))            # computer number of divisors of T
    ]+1)<=n){                # check we haven't already found n of that class
    F[s]=T
  }
}
F[-2] # print nth poor and rich numbers

146个字节 ; 不知道digEmAll的回应是什么
Giuseppe

@Giuseppe谢谢!我喜欢使用nchar
罗宾·赖德

142字节 ; 之前我对运算符的优先级遇到麻烦,但感到困惑。
朱塞佩


2
@digEmAll 138个字节回头log10
朱塞佩

1

JavaScript(Node.js)190 180字节

输出为[poor, rich]

n=>{let p,r,f=h=i=0;while(f<n){k=d(i),e=d(+(i+"").split``.reverse().join``);if(k<e){p=i;f++}if(k>e&&h<n){r=i;h++}i++}return[p,r]}
d=n=>{c=0;for(j=1;j<=n;j++)if(n%j==0)c++;return c}

在线尝试!

说明

d(n) 功能

该帮助程序查找数字具有的因子数。

d=n=>{              // Equivalent to `function d(n) {
  c=0;              // Counter
  for(j=1;j<=n;j++) // Check every integer from 1 to n
    if(n%j==0)c++;  // If the number is a factor, add 1 to the counter
  return c
};

主功能

n=>{ 
  let p,r,f=h=i=0; // p -> the poor number, r -> the rich number, f -> the number of poor numbers found, h -> the number of rich numbers found, i -> the current number being checked
  while(f<n){ // While it's found less than n poor numbers (assumes that it will always find the rich number first)
    k=d(i),        // k -> number of factors of i
    e=d(+((i+"").split``.reverse().join``)); // e -> number of factors of reversed i
    if(k<e){p=i;f++}  // If it hasn't found enough poor numbers and i is poor, save it and count it
    if(k>e&&h<n){r=i;h++}  // If it hasn't found enough rich numbers and i is rich, save it and count it
    i++
  };
  return[p,r]
}

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.