动作相当顺畅


18

在算术中,n光滑数(其中n是给定的质数)在数学上被定义为不具有大于n的素数的正整数。例如,42是7平滑的,因为它的所有素数都小于或等于7,但是44不是7平滑的,因为它也有11作为素数。

将一个非常平滑的数字定义为没有素数大于其平方根的数字。因此,相当平滑的数字列表可以表述为:

  • (已编辑!) 1是一个非常平滑的数字,因为它完全没有任何主要因素。(请注意,在此问题的原始版本中,错误地从列表中排除了1,因此,如果从输出中排除它,则不会被标记为错误。)
  • 在4(= 2 2)和8之间,相当平滑的数字是2平滑的,这意味着它们以2为唯一素数。
  • 在9(= 3 2)和24之间,相当平滑的数字是3平滑的,并且在素数分解中可以有2s和3s。
  • 在25(= 5 2)和48之间,相当平滑的数字是5平滑的,并且在素数分解中可以有2s,3s和5s。
  • 依此类推,每次到达下一个质数的平方时就升级标准。

相当平滑的数字列表是固定的,并且从以下开始:1、4、8、9、12、16、18、24、25,...

您的挑战是编写代码,以输出所有非常平滑的数字,包括10,000(= 100 2)。列表中的每个数字与下一个数字之间至少必须有一个分隔符(无论哪种分隔符,空格,逗号,换行符等等),但是使用什么字符完全无关紧要。

像往常一样,最低字节数会获胜-显然,仅输出列表不会对您有太大帮助。祝好运!


9
为什么1不太流畅?
丹尼斯

我们可以按相反的顺序输出列表吗?
Leaky Nun

5
OEIS A048098(包括其他服务1
Leaky Nun

1
@Mego“没有比4还小的平滑数字。” 很清楚 不一定很明显,但绝对清楚。
viraptor'Aug 15'16

1
@viraptor被投票为不清楚,不是因为没有指出1不是平滑的,而是因为您的定义和排除语句相互矛盾。
Leaky Nun

Answers:


1

其实11个位元组

4╤R`;yM²≤`░

在线尝试!

不包括1。

说明:

4╤R`;yM²≤`░
4╤R          range(10**4)
   `;yM²≤`░  filter: take values where
    ;yM²       the square of the largest prime factor
        ≤      is less than or equal to the value

7

果冻,12 字节

Æf>½S
³²ḊÇÐḟ

在线尝试!

怎么运行的

³²ḊÇÐḟ  Main link. No arguments.

³       Yield 100.
 ²      Square it to yield 10,000.
  Ḋ     Dequeue; yield [2, ..., 10,000].
   ÇÐḟ  Filter-false; keep elements for which the helper link returns 0.

Æf>½S   Helper link. Argument: n

Æf      Compute the prime factorization of n.
  >½    Compare the prime factors with the square root of n.
    S   Sum; add the resulting Booleans.

7

Brachylog21 19字节

感谢Fatalize提供1个字节,为另外1个字节提供了灵感。

100^:4reP$ph^<=P@w\

在线尝试!

大约需要6秒钟。

100^:4reP$ph^<=P@w\
100                      100
   ^                     squared
    :4                   [10000,4]
      r                  [4,10000]
       eP                P is an integer in that interval (choice point),
        P$ph^<=P         P, prime factorized (from biggest to smallest),
                         take the first element, squared, is less than
                         or equal to P
               P@w       Write P with a newline,
                  \      Backtrack to the last choice point and make
                         a different choice until there is no more
                         choice and the program halts.

以前的21字节解决方案

100^:4reP'($pe^>P)@w\

在线尝试!

大约需要6秒钟。

100^:4reP'($pe^>P)@w\
100                      100
   ^                     squared
    :4                   [10000,4]
      r                  [4,10000]
       eP                P is an integer in that interval (choice point),
        P'(      )       The following about P cannot be proved:
           $pe               one of its prime factor
              ^              squared
               >P            is greater than P
                  @w     Write P with a newline,
                    \    Backtrack to the last choice point and make
                         a different choice until there is no more
                         choice and the program halts.

100^:4reP$pot^<=P@w\少了一个字节,但不够优雅。
致命

@Fatalize谢谢,我打了另一个字节
Leaky Nun

4

Haskell,53个字节

r=[1..10^4]
[n|n<-r,product[x|x<-r,x*x<=n]^n`mod`n<1]

我没有时间去高尔夫球现在这个样子,但我想说明的测试方法,如果n是相当顺利:乘从数字1sqrt(n)(即计算阶乘),提高了产品的高功率,并检查结果是的倍数n

更改为r=[2..10^4]if 1不应输出。


并不是说它是任何高尔夫球手,但是我很确定该立方体就足够了(8需要)。
尼尔

2

Pyth16 15字节

1字节感谢Jakube。

tf!f>*YYTPTS^T4

在线尝试!

tf!f>*YYTPTS^T4
             T   10
            ^T4  10000
           S^T4  [1,2,3,...,10000]
 f               filter for elements as T for
                 which the following is truthy: 
         PT          prime factorization of T
   f                 filter for factor as Y:
     *YY                 Y*Y
    >   T                greater than T ?
  !                  logical negation
t                remove the first one (1)

Pyth当然具有平方函数吗?那么您可以*dd 用该功能替换吗?
科纳·奥布莱恩

@ ConorO'Brien不,Pyth没有平方函数。
Leaky Nun

这似乎是一种监督的
康纳尔奥布莱恩

2

05AB1E,16 14 13字节

4°L¦vyf¤yt›_—

说明

4°L¦v             # for each y in range 2..10000
      yf¤         # largest prime factor of y
         yt       # square root of y
           ›_     # less than or equal
             —    # if true then print y with newline

在线尝试


是10000的缩写。–
Adnan

@Adnan谢谢!忘了那个。
Emigna '16

2

Matlab,58 57 56 52 48字节

for k=1:1e4
if factor(k).^2<=k
disp‌​(k)
end
end

对于每个数字,它检查所有平方的因子是否不大于数字本身。如果是,则显示该数字。

感谢@Luis Mendo打高尔夫球


另一种方法(50字节):

n=1:10^4;for k=n
z(k)=max(factor(k))^2>k;end
n(~z)

对于每个数字,计算其最大素因平方的平方是否小于数字本身。然后将其用于索引。


1
您可以将以前的方法缩短一些:for k=4:1e4,if factor(k).^2<=k,disp(k);end;end
Luis Mendo

1

SQF252 227 220

标准脚本格式:

#define Q(A,B) for #A from 2 to B do{
Q(i,10000)if([i]call{params["j"];u=sqrt j;a=true;Q(k,u)a=a and((j%k!=0)or(j/k<u)or!([j/k]call{params["x"];q=true;Q(z,sqrt x)q=q and(x%z!=0)};q}))};a})then{systemChat format["%1",i]}}

调用时,将预处理器包括在编译链中:

  • execVM "FILENAME.sqf"
  • call compile preprocessFile "FILENAME.sqf"

这将写入系统聊天日志,这是SQF必须执行的最接近的操作


1

C,113字节

#include<stdio.h>
main(a){for(;++a<10001;){int n=2,c=a;for(;n*n<=a;n++)while(c%n<1)c/=n;if(c<2)printf("%d ",a);}}

伊迪恩!


1

Pyke,13 12 11字节

T4^S#DP#X<!

在这里尝试!

(链接仅上升到10 ^ 3,因为10 ^ 4超时)

T4^S        -  one_range(10^4)
    #DP#X<! - filter_true(V, ^): (as i)
      P     -   factors(i)
       #X<! -  filter_true(V, ^):
        X   -   ^ ** 2
         <! -    not (i < ^)

1

J,20个字节

(#~{:@q:<:%:)2+i.1e4

结果:

   (#~{:@q:<:%:)2+i.1e4
4 8 9 12 16 18 24 25 27 30 32 36 40 45 48 49 50 54 56 60 63 64 70 72 75 80...

在这里在线尝试。



0

R,97个字节

b=F;for(j in 1:1e4){for(i in which(!j%%1:j)[-1])if(which(!i%%1:i)[2]==i)b=i<=j^0.5;if(b)print(j)}

不打高尔夫球

b <- F                               #Initializes
for (j in 1:1e4){                    #Loop across integers 1..10^4
    a <- which(!j%%1:j)[-1]          #Finds all factors
    for (i in a)                     #Loop across factors
         b <- which(!i%%1:i)[2]==i   #Tests primeness
         if(b) c <- i<=j^0.5         #If prime, tests smoothness
    if(c) print(j)                   #If biggest prime factor gives smooth
}                                    #result, Prints the number.

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.