在不使用任何保留字的情况下打印前128个素数


13

显而易见的解决方案是将它们仅打印为字符串,但是是否可以编写较短的代码?

要求:

  1. 不应处理任何输入,而输出应采用2 3 5 7 11 13 ...etc 的形式。
  2. 完全不使用该语言中的保留字
  3. 该语言至少应允许结构化的编程,并具有保留字(否则,第2点将是没有意义的)。

首先,我只考虑了C / C ++,但是在扩展问题的同时仍然试图防止作弊


1
对于我来说不幸的是,Tcl没有保留字。
Johannes Kuhn

Answers:


14

C,60个字符

“无关键字”限制在这里无关紧要。我很确定,如果可能的话,不会通过添加关键字来改善它。

n=2;main(m){n<720&&main(m<2?printf("%d ",n),n:n%m?m-1:n++);}

替代版本:
输出不是很好,但是我喜欢这种printf滥用。

n=2;main(m){n<720&&main(m<2?printf("%*d",n,n):n%m?m-1:n++);}

两种解决方案中的技巧都是将两个循环(通过递归实现)合并为一个。
n是下一个潜在素数,m下一个潜在除数。
在每个递归调用中,我们要么递增n(同时设置m为其先前的值),要么递减m


7

Python,108个字符

Python并非针对此挑战而设计。想要print吗?那是保留的。好吧,我们如何使用stdout?好吧,那要花一个import……你猜对了,保留。好吧...我在Unix上,所以我可以打开文件描述符1,它恰好是stdout。哈克!

人,迭代?除了eval。当然没有循环,但是我们甚至不能使用def或定义函数lambda。而且要加重侮辱的伤害,我们甚至不能使用列表理解!我一直在找借口map(p.__mod__,...)在代码高尔夫中使用诸如此类的东西……理解总是更好的。到现在为止。

p=1
eval(compile("p+=1;open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p))));"*720,'','exec'))

现在,你可能会抱怨说exec是一个关键字,即使我没有使用关键字(我甚至没有evalexec)。好吧,这是一个不使用117个字符的解决方案'exec'

p=2
s="eval('('+s*(p<720)+')',open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p)))),{'p':p+1})";eval(s)

1
在Python3中不保留print :)您可以使用__import__,但这会花费字符
gnibbler 2012年

6

JavaScript(80个字符)

eval((s=Array(719)).join("s[j=++n]?j:"+s.join("s[j+=n]=")+"r+=n+' ';"),r="",n=1)

在您的Web浏览器的控制台中运行。

使用了素筛,结果证明它非常凝结。


4

C,183个字符

#define q j*j<k?i%p[j++]||(i++,j=0):printf("%d\n",p[j=0,k++]=i++)
#define A q;q;q;q;q;q;q;q
#define B A;A;A;A;A;A;A;A
#define C B;B;B;B;B;B;B
main(){int i=2,j=0,k=0,p[999];C;C;C;C;C;}

好吧,这是一个快速的第一次尝试。我相信这应该满足要求。我正在使用简单的试验除法来查找素数和使用预处理器构造的展开循环对其进行迭代,直到找到足够的素数为止。调整了重复次数,以便精确打印128个素数。


4

C,87个字符

d;p(n){--d<2||n%d&&p(n);}r(n){p(d=n);d<2&&printf("%d\n",n);++n<720&&r(n);}main(){r(2);}

(我试图以一种更具功能性的风格来编写它,但是我无法使用return某种方式终止了该计划。)


3

C,134个字符

这是一个替代解决方案,尝试避免尽可能多地使用单词,保留单词或其他方式:

main(i){i<9?main(2953216):i>4097?--i&4094?i/4096%(i%4096)?main(i):
main((i/4096-1)*4097):printf("%d\n",i>>12,main((i/4096-1)*4097)):0;}

它使用的全部是printf并且main带有一个参数。


3

Mathematica 50个字符

我不确定如何为Mathematica解释“保留字”,但我想玩,所以我将其理解为没有内置函数来生成素数或测试素数的操作。

Fold[#2Cases[#/#2,1|_Rational]&,#,#]&@Range[2,719]

2

Haskell,72个字符

main=putStrLn.unwords$take 128[show p|p<-[2..],all((>0).mod p)[2..p-1]]

诚然,在Haskell中避免关键字并不是很困难。


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.