迭代除数扭曲


13

定义

mn为正整数。我们说m是一个除数扭曲n,如果存在整数1 < a ≤ b,使得n = a*bm = (a - 1)*(b + 1) + 1。如果m可以从获得n通过施加零个或多个除数的曲折,然后m是一个后代n。请注意,每个数字都是其自己的后代。

例如,考虑n = 16。自以来,我们可以选择a = 2和。然后b = 82*8 = 16

(a - 1)*(b + 1) + 1 = 1*9 + 1 = 10

这表明10是的除数扭曲16。与a = 2b = 5,然后我们看到7是的除数扭曲10。因此7是的后代16

任务

给定一个正整数nn以递增顺序计算的后代,不能重复。

规则

不允许使用内置运算来计算数字的除数。

完整的程序和函数都将被接受,并且只要它是经过排序且无重复的,就可以返回集合数据类型(如某种类型的集合)。最低字节数获胜,并且不允许出现标准漏洞。

测试用例

1 ->  [1]
2 ->  [2] (any prime number returns just itself)
4 ->  [4]
16 -> [7, 10, 16]
28 -> [7, 10, 16, 25, 28]
51 -> [37, 51]
60 -> [7, 10, 11, 13, 15, 16, 17, 18, 23, 25, 28, 29, 30, 32, 43, 46, 49, 53, 55, 56, 60]

@Zgarb如果允许零除数扭曲的链,那么每个数字怎么都不是其他任何数字的后代?
rorlork 2015年

3
@rcrmn对我来说,零操作链意味着身份操作。因此,允许零除数扭曲表示每个数字都是其自身的后代。
Zgarb 2015年

@Zgarb好的,因此应该更改定义以表示这一点,因为据我所知,如果不是这样,则任何数字都被视为其他所有数字的后代。我不知道为什么需要反射性。你愿意解释吗?
rorlork 2015年

@rcrmn我稍微更改了措词,现在更清楚了吗?
Zgarb 2015年

@Zgarb对不起,但不是,这不是一个运算,您正在定义数字之间的关系。如果<为自然数定义关系,则每获得n个数字,每个数字都小于它,但不小于它本身。我认为这应该类似。这样,我认为只有4个将成为它自己的后代(尽管不确定)。
rorlork 2015年

Answers:


9

Python 2,109 98 85 82字节

f=lambda n:sorted(set(sum(map(f,{n-x+n/x for x in range(2,n)if(n<x*x)>n%x}),[n])))

由于(a-1)*(b+1)+1 == a*b-(b-a)b >= a,后代始终小于或等于原始数字。因此,我们可以从初始数字开始,并继续生成严格较小的后代,直到没有后代为止。

条件(n<x*x)>n%x检查其中一项n<x*x和两项n%x == 0

(感谢@xnor从基本情况中减去了3个字节)

Pyth,32个字节

LS{s+]]bmydm+-bk/bkf><b*TT%bTr2b

上面内容的直接翻译,除了Pyth试图对s空列表求和()时似乎会窒息。

这定义了一个y可以通过y<number>在末尾追加来调用的函数,如下所示(在线尝试):

LS{s+]]bmydm+-bk/bkf><b*TT%bTr2by60

CJam,47个 45字节

{{:X_,2>{__*X>X@%>},{_X\/\-X+}%{F}%~}:F~]_&$}

也使用相同的方法,进行了一些修改。我想尝试CJam进行比较,但不幸的是,我在CJam的工作要比在Pyth / Python的工作差很多,因此可能还有很多改进的余地。

上面是一个块(基本上是CJam的未命名函数的版本),它接受一个int并返回一个列表。您可以像这样测试它(在线尝试):

{{:X_,2>{__*X>X@%>},{_X\/\-X+}%{F}%~}:F~]_&$}:G; 60 Gp

我不是Python专家,但是有没有您需要set()在那里的原因?您不能只返回已排序的列表吗?
Alex A.

@Alex set()是删除重复:)
SP3000

哦好的。整齐。干得好!
Alex A.

你也许可以[n]+sum(...,[])那样做sum(...,[n])吗?
xnor 2015年

@xnor啊,可以。我从来没有用过任何东西,只是[]作为汇总列表的基本案例,所以我完全忘记了!
Sp3000

6

Java中,148个 146 104字节

高尔夫球版:

import java.util.*;Set s=new TreeSet();void f(int n){s.add(n);for(int a=1;++a*a<n;)if(n%a<1)f(n+a-n/a);}

长版:

import java.util.*;
Set s = new TreeSet();
void f(int n) {
    s.add(n);
    for (int a = 1; ++a*a < n;)
        if (n%a < 1)
            f(n + a - n/a);
}

因此,我将使用此程序在PPCG上首次亮相,该程序使用TreeSet类似于Geobits程序的(自动对数字进行排序)和递归,但以不同的方式,检查n的倍数,然后在下一个功能。我想说这对初学者来说是一个相当不错的成绩(尤其是Java,对于这种事情,它似乎不是最理想的语言,而Geobits的帮助则是如此)。


欢迎来到PPCG!您可以通过更改保存一对夫妇a*bn上线9
Geobits

感谢您的欢迎和建议!是的,我要花一些时间才能发现这些小东西。每个字节都很重要!再次感谢!
TNT 2015年

您还可以节省两个通过将c=n+a-badd()。或者,您可以c完全摆脱掉它们,而只n+a-b在两个地方都使用相同的两个字节。
Geobits 2015年

说到这一点,我认为我不需要使用add两次。等等...
TNT

但是整体上并不需要第二个循环。如果您有一个a清楚知道的鸿沟n,那么您就不应该循环查找b,而仅仅是n/a。到那时它开始越来越接近我了;)
Geobits

4

Java中,157 121

这是一个递归函数,可获取的每个后代n。它返回TreeSet,默认情况下排序。

import java.util.*;Set t(int n){Set o=new TreeSet();for(int i=1;++i*i<n;)o.addAll(n%i<1?t(n+i-n/i):o);o.add(n);return o;}

有一些换行符:

import java.util.*;
Set t(int n){
    Set o=new TreeSet();
    for(int i=1;++i*i<n;)
        o.addAll(n%i<1?t(n+i-n/i):o);
    o.add(n);
    return o;
}

2

八度,107 96

function r=d(n)r=[n];a=find(!mod(n,2:sqrt(n-1)))+1;for(m=(a+n-n./a))r=unique([d(m) r]);end;end

精美印刷:

function r=d(n)
  r=[n];                          # include N in our list
  a=find(!mod(n,2:sqrt(n-1)))+1;  # gets a list of factors of a, up to (not including) sqrt(N)
  for(m=(a+n-n./a))               # each element of m is a twist
    r=unique([d(m) r]);           # recurse, sort, and find unique values
  end;
end

1
据我了解,Octave可以使用end而不是endfor和来结束块endfunction。这样可以节省11个字节。
Alex A.

嘿,你说得对!这不是我学习语言的方式,也从未意识到它可以实现。在我打完多次高尔夫球之后,为什么您是第一个指出这一点的人?
dcsohl 2015年

我之所以知道这一点,是因为我最近在另一个人的高尔夫球场上看到了它之后才抬起头来。我从未使用过Octave,而且自使用Matlab已有好几年了。我的猜测是,PPCG上并没有那么多活跃的Octave用户,但我可能是错的。
Alex A.

好,谢谢你指出这一点。
dcsohl 2015年

很高兴能为您提供帮助。不错的解决方案。
Alex A.

1

Haskell,102 100字节

import Data.List
d[]=[]
d(h:t)=h:d(t++[a*b-b+a|b<-[2..h],a<-[2..b],a*b==h])
p n=sort$nub$take n$d[n]

用法:p 16输出[7,10,16]

该函数d递归地计算所有后代,但不检查重复项,因此许多重复项出现多次,例如,d [4]返回4s 的无限列表。函数从该列表中p获取第一个n元素,删除重复项并对列表进行排序。Voilà。


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.