是素数吗?无数学[关闭]


14

用任何一种语言来编写程序或函数,以表明输入是否为质数。

  • 输入是一个字符串,表示以10为底的自然数。
  • 输出是两个字符串“ Prime”或“ Not !!”之一。可以正确识别输入。
  • 程序中的任何地方均不允许使用算术运算符,按位运算符,数字变量和常量,一般为“数学运算”等。您应该使用字符串操作来执行所有必要的“计算”。
  • 您可以比较字符串长度(即数字)-如果不比较,则为-10。
  • 您的程序应该可以在任何长度的输入上工作(给定足够的内存和时间)。
  • 最低字节数(UTF-8)获胜。

数字的界限是什么?可以否定吗?零?可以包含小数点吗?
贾斯汀

如果有加分,这不是代码高尔夫球场
彼得·泰勒

添加了“自然”以指定输入范围。
Wally 2014年

我希望对一些疯狂的显式字符串操作感到惊讶(我个人是在考虑编写代码以“减少”字符串,以便可以循环播放-我在字符串长除法和重复字符串减法之间陷入了困境...),我那个很酷的正则表达式一元首选匹配器让我感到惊讶!也许我需要再问一次不允许正则表达式的问题,看看我是否得到了更多奇妙的东西?但是我认为没有什么可以像正则表达式那样简短。
Wally 2014年

要获得“更多精彩的东西”,也许您可​​以尝试使其成为一项人气竞赛。改变问题本身通常是不被接受的。而且我不确定您是否应该仅仅因为有人提出了您未想到的问题而提出一个新问题或更改任何内容,我认为这在这里经常发生。此外,规则弯曲也是这项运动的一部分:)
daniero 2014年

Answers:


7

Ruby,64-10 = 54

puts ('1
'..gets).map{?1}*''=~/^1?$|^(11+?)\1+$/?'Not!!': :Prime

这使用Ruby的内置字符串迭代方法从字符串“ 1”(加上换行符)迭代到输入字符串,该方法看起来非常像加1,但从技术上讲它在任何时候都不会创建高级数值变量。它使用以下事实:输入n将进行n次迭代以创建n长度的字符串,然后使用正则表达式确定该字符串是否可以分组为相同的子字符串。


“ map {?1}”中的“ 1”是Fixnum吗?-如果是这样,您可能必须将其更改为“ map('1')?我找不到关于表达式?1的任何文档,除了一些提示,在旧版本的Ruby中它返回了ASCII码,现在它返回了一个字符串。 。
沃利

?1与'1'相同,它是1个字符的字符串文字。我可以用其他任何字符替换1以外的所有实例。
histocrat

好的-我只是找不到在任何地方都可以很好地描述的构造!
Wally 2014年

我之所以选择它作为“优胜者”,是因为它避免了甚至一点数学问题。
Wally 2014年

3
没有给阿比盖尔的帽子小费吗?耻辱。这是1998年perl解决方案的直接入口:catonmat.net/blog/perl-regex-that-matches-prime-numbers
skibrianski 2014年

16

红宝石:52-10 = 42

使用那个著名的素数匹配正则表达式的变体。

puts ?_*gets.to_i=~/^(_|(__+?)\2+)$/?"Not!!":"Prime"

只是要清楚:?_*gets.to_i是一个字符串操作,它会附加n"_"自身,其中n是输入数字。如我所见,没有比较字符串长度,因此应该满足10个字符的附加标准。


1
我对Ruby不太熟悉,如果我错了,请纠正我,但是“ to_i”不会将字符串转换为整数吗?并不是说我不喜欢一元单调的首字母缩写…
Wally

1
@Wally我认为“转换”不是正确的词,但是该方法返回一个int,是的。不过,我不使用以下任何Arithmetic operators, bit-wise operators, numeric variables and constants一种方法,并且您不能真正将调用方法归类为"math-stuff" in general..?
daniero

@daniero听起来很合理-也许就在规范的边缘。
Wally 2014年

3

Perl 52-10 = 42

实作

print((('-'x$ARGV[0])=~/^.$|^(..+?)\1+$/)?Not:Prime)

演示版

$ seq 1 10|xargs -I{} bash -c "echo -n '{} '  && perl Prime.pl {} && echo"
1 Not
2 Prime
3 Prime
4 Not
5 Prime
6 Not
7 Prime
8 Not
9 Not
10 Not

4
1不是真正的素数。
elixenide

使用数字数组索引-在规范的边缘。
Wally 2014年

使用pop代替$ARGV[0],节省4个字符,删除数值数组索引
mob

1

ECMAScript 6,159-10 = 149

听起来像是正则表达式的任务。像往常一样使用prompt/进行I / O。alert

for(s=prompt(u=""); /[^0]/.test(s); )
  s=s.replace(/(.)(0*)$/,(_,d,t)=>u+="x"," 012345678"[d]+t.replace(/0/g,"9"))
alert(/^((xx+)\2+|x?)$/.test(u)?"Not!!":"Prime")

while循环每次通过正则表达式纯粹将十进制数减一。最终的正则表达式通过首先匹配一个因数,然后通过对字符串的其余部分重复第一个因数来匹配另一个由x的复合数组成的字符串。


我喜欢字符串减量功能-简洁明了。
Wally 2014年

1

Javascript 266

function N(a){function b(a){return P.every(function(b){if(n=b,i=a.length,j=b.length,j>i) return;if(j==i) return 1;while(n.length<i)n+=b;return n.length!=i})}if(q=A,A!=a)for(;q.length.toString()!=a;)b(q)&&P.push(q),q+=A;console.log(b(q)?"Prime":"Not!!")}A="0",P=[A+A]

创建一个名为N的函数,该函数将输出所需的结果。未缩小的版本看起来像这样。我做了一手minify来清理一些变量,然后将其运行到uglify中,然后再次手工缩小。

// A a string of "0" for using to generate long strings
// P is the store for all known primes
A="0", P=[A+A];
function N(val) {
  function _isPrime(str) {
    // go through all the known primes and return true
    // if we don't match on any of them
    return P.every(function(prime) {
      // prime is some known string whose length is a prime number
      tsr = prime, strlen = str.length, primelen = prime.length;
      // if the string we're checking has fewer chars than
      // this then it's not a prime
      if(strlen < primelen) return 0;
      // if the string we're checking has the same number of chars
      // as the the prime we're checking against then it is a prime
      if(primelen == strlen) return 1;
      // Keep incrementing our temporary string with the prime we're
      // checking. we'll break out of the loop once the temporary string
      // is greater than or equal to the string we're testing
      while(tsr.length < strlen) {
        tsr += prime;
      }
      return !(tsr.length == strlen)
    });
  }
  // start with a string of one unit
  nstr = A
  if(A!=val) {
    // keep incrementing the string so that we can compile a list
    // of known primes smaller than this value
    while(nstr.length.toString() !== val) {
      if(_isPrime(nstr)) {
        P.push(nstr);
      }
      nstr += A;
    }
  }
  console.log(_isPrime(nstr) ? "Prime" : "Not!!");
}

使用以下代码片段对其进行了测试:

for(var X=0;X<10;X++) {
  console.log('checking: ' + X);
  N(X.toString());
}

1
我不确定我是如何工作的,但是我确实看到了数值变量(i)和算术运算符(i ++)。
Wally 2014年

哦,没有意识到我不能做这样的for循环..今晚将其重写。
Sugendran 2014年

基本上,我正在生成长度为素数的字符串数组。因此,当我获得输入时,我会继续向字符串中添加字符,直到字符串的长度值与输入匹配。然后,我使用此字符串,看看是否可以将其除以任何已知的质数。如果我做不到,那一定是素数。通过除法,我的意思是我采用已知的素数字符串,并不断将其添加到自身中,以使字符串的长度等于或大于所讨论的字符串。
Sugendran 2014年

我更新了代码,实际上减少了字符数:)
Sugendran 2014年

凉。它看起来与正则表达式相同,但是效率更高,并且显式显示了实际的逻辑。
Wally 2014年

0

重击66-10 = 56

实作

[[ -z `printf %$1s|grep -P "^(..+?)\1+$"` ]]&&echo Prime||echo Not

演示版

$ seq 1 10|xargs -I{} bash -c "echo -n '{} '  && ./Prime.sh {}"
1 Prime
2 Prime
3 Prime
4 Not
5 Prime
6 Not
7 Prime
8 Not
9 Not
10 Not

如上所述,1不是质数。
Wally 2014年

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.