完全是素数的素数测试


23

编写一个程序,该程序将测试指定数字的素数,并将输出作为布尔值给出(True是素数)。您的主要测试可以(但不一定)对数字1有效。

要注意的是:您的程序本身必须求和一个质数。将每个字符(包括空格)转换为其Unicode / ASCII值()。然后,将所有这些数字相加,得出程序的总和。

例如,采用我在Python 3.3中编写的不太好的程序:

q=None
y=int(input())
for x in range(2,int(y**0.5)+1):
    if y%x==0:
        q=False
if not q:
    q=True
print(q)

如果将所有字符转换为相应的Unicode / ASCII值,则会得到:

113 61 78 111 110 101 10 121 61 105 110 116 40 105 110 112 117 116 40 41 41 10 102 111 114 32 120 32 105 110 32 114 97 110 103 101 40 50 44 105 110 116 40 121 42 42 48 46 53 41 43 49 41 58 10 32 32 32 32 105 102 32 121 37 120 61 61 48 58 10 32 32 32 32 32 32 32 32 113 61 70 97 108 115 101 10 105 102 32 110 111 116 32 113 58 10 32 32 32 32 113 61 84 114 117 101 10 112 114 105 110 116 40 113 41 

然后,您可以手动或使用自己的程序找到这些数字的总和。此特定程序的总和为8293,这是一个质数。

当然,这是Code Golf,因此您制作的程序越小越好。正如其他用户指出的那样,该程序不是很容易实现。

一些规则:

有效的输入包括STDIN和提示(没有功能,这只是添加免费的额外代码的一种方式)。允许使用空格,但前提是空格对程序的功能至关重要。输出必须是输出,而不仅仅是存储在变量中或返回(使用print,STDOUT等)

可以使用标志,并且应按字面意义进行计数,而不是扩展。不允许发表评论。对于非ASCII字符,应使用各自的编码将它们分配给该值。

确保列出程序的大小和程序的总和。我将进行测试以确保程序有效。

祝好运!

这是一个片段,用于计算程序的总和并检查其是否为素数:


12
在非高尔夫语言中,您似乎可以采用最短的素数决定代码,并调整变量名称,直到总和为素数。
xnor

5
为什么要限制I / O?
乔纳森·艾伦

2
什么是“ Unibyte值”?
aditsu

5
您谈论字符和代码页。Unicode字符始终具有相同的代码点,无论使用哪种编码来表示它。对于非ASCII字符,应使用各自的编码将它们分配给该值。让我觉得您实际上是希望字节值的总和为素数
Dennis

Answers:




6

Microscript II,2个字节(总和137)

N;

Microscript II,4个字节(总和353)

N;ph

实际上,令我惊讶的是,这两个都具有素字节和。



4

Pyth,2个字节, 127

/P

在线尝试

输出1为素数,0非素数。

/有代码点47P有代码点80

怎么运行的:

/P
/PQQ    Implicit variables.
        Q = input
 PQ     Prime factorize Q.
/  Q    Count how many times Q appears. 1 if prime, 0 if not.

4

Haskell,52字节,4421

main=do
 k<-readLn
 print$product[1..k-1]`rem`k==k-1

威尔逊定理。


2
将其变成一个完整的独立程序。
fquarp

::IO Int,除非这是你可以得到一个质和最短的路真的不应该是必要的。
与Orjan约翰森

好决定。但是,我们然后得到一些“散列”为偶数的代码。添加空格或换行符不会做任何事情(甚至是值),也不会更改变量的名称(它出现四次,因此替换其代码(例如c)等于减去4 * c并加上4 * c',使总和,即使如此,也可以通过打破界限来调整它,但仍然可以缩短,我做到了
fquarp '18

1
47个字节,具有不同的素性测试:在线尝试!(请注意,使用制表符代替空格可以正确计数)。
Laikoni '18

也欢迎来到PPCG!
Laikoni '18 -4-2

4

Python 2,50个字节, 4201

适用于1。如果为质数,则输出为正;否则为零。

p=input();print all(p%m for m in range(2,p))*~-p;p

在线尝试


Python 2,44个字节, 3701

不适用于1.输出一个布尔值。

p=input();print all(p%k for k in range(2,p))

在线尝试



3

05AB1E,2个字节,173

p=

说明:

p  # Checks if number is prime - returns 1 if true and 0 if false. Uses implicit input.
 = # Wouldn't usually be required for this sort of program, but I added it to make the sum prime.

在线尝试!


有些东西“不允许发表评论”,但我想有效的无操作效果很好:D
Value Ink

2

PHP,38字节,总和2791

有趣的事实:用$h代替$c,总和2801(也是素数),并且其二进制表示形式101011110001也以十进制表示也是素数。

for($b=$c=$argv[1];$c%--$b;);echo$b<2;

接受命令行参数,打印1或为空字符串。用运行-r

代码来自我自己的主要函数(如果可以,请查看原始帖子)。


@Artyer是固定的。
泰特斯(Titus),

2

R,27 32字节,总和2243 2609

@rturnbull节省了5个字节

cat(gmp::isprime(scan(),r=43)>0)

这利用了gmp库的isprime函数。

> sum(as.integer(charToRaw('cat(!!gmp::isprime(scan()))')))
[1] 2243
> cat(!!gmp::isprime(scan()))
1: 2243
2: 
Read 1 item
TRUE
> 

cat(!!gmp::isprime(scan()))短5个字节,并且总计为2243,也为质数。
rturnbull

@rturnbull对此表示感谢:)
MickyT

1

Python 2,44个字节,字节总和3109

这是xnor的44字节实现具有最低值的变量名,产生素字节和。

1如果是素数0则打印,如果不是,则打印。

C=B=1
exec"B*=C*C;C+=1;"*~-input()
print B%C

1

果冻 6 个字节,字节总和691

ƓÆḍ,ṠE

打印1素数和0否。

TryItOnline!

以十六进制表示的字节是93 0D D5 2C CD 45(请参见代码页),或者以十进制表示的字节的147 13 213 44 205 69总和为691,即素数。

怎么样?

ƓÆḍ,ṠE - Main Link: no arguments
Ɠ      - read and evaluate a line from STDIN (integer expected)
 Æḍ    - proper divisor count
   ,   - paired with
    Ṡ  - sign
     E - all equal? - returns a boolean (1 or 0)
       - implicit print

Æḍ功能是这样的素数和他们的否定返回一个,而其他整数不会(复合材料及其否定返回数字比一,一和减一零个和收益和零收益,奇怪的是,减去一个更大)。

功能是这样的,负整数返回负一,零返回零和正整数返回一个。

因此,这两个函数只会为素数返回相同的值。

注意,ƓÆP不幸的是,直接测试来自STDIN的输入是否为素数的3字节程序不是素数和程序(240)。

使用=(等于),e(存在于)或(非向量化等于)5个字节来测试相等性也不会生成素数和程序。


备用(可能不可接受)4个字节,总和571

如果I / O限制仍然允许带有参数的完整程序。

Æḍ⁼Ṡ

...使用与上述相同的原理,非向量化相等性在哪里(非向量化方面没有效果,因为无论如何都没有向量化的可能)。十六进制值,0D D5 8C CD这是13 213 140 205十进制其中一笔571,一个素数。

再次注意,2字节程序ÆP没有素数(93)。


ƓÆPG(311)和ÆPF(163)应该很好,我认为呢?
林恩

作为Unicode,对于ƓÆḍ,ṠE,值是16183,这恰好是质数!
Artyer

@Lynn是的,似乎已经取消了“不必要的代码限制”(空格字符除外),ƓÆPG可以了。我也问过一个接受输入而不是使用STDIN的程序是否可以接受。
乔纳森·艾伦,

1
......如果这两种东西都是那么OK ÆP¥是3个字节,97
乔纳森·艾伦


1

Mathematica,21个字节, 1997

Print@*PrimeQ@Input[]

Input[]读取输入行(如果未使用前端,则从STDIN读取,如果使用Mathematica前端,则通过对话框读取),Print@*PrimeQ是和函数的组成(@*),并且是前缀函数表示法。PrintPrimeQ@


1

Perl 6的24 22个字节,1949

say .is-prime
for +get

所有三个空格字符都是必需的。
(Perl 6的不关心什么样的的空白字符他们,虽然如此,我选择的,而不是为第二个较为常用的空间换行...)



1

,8字节,511

0Na%,a=1

我写了一个素数检查器,总和为素数。方便。验证输入1-30:在线尝试!

说明

          a is first command-line argument
    ,a    Numbers from 0 to a-1
  a%      Take a mod each of those numbers (a%0 gives nil)
0N        Count number of times 0 occurs in that list
      =1  If 0 occurs only 1 time (for a%1), then a is prime


1

J,18字节, 1103

echo 1&p:".(1!:1)1

距离最佳目标不远,我至少可以进行一次完整的程序原始性测试为17字节:echo(p:[:".1!:1)1,不幸的是,总和为1133 = 11 * 103。

不幸的是,我无法弄清楚如何在TIO上使用键盘输入,因此尚无链接。

说明:

echo 1&p:".(1!:1)1  | Full program
           (1!:1)1  | Read a line of input from keyboard
         ".         | Evaluate (converts string to int)
     1&p:           | 1 for prime, 0 for composite
echo                | Print result. The space is required, as 'echo1' would be interpreted as a variable

验证程序:

   1 p:+/u:inv'echo 1&p:".(1!:1)1'  NB. Convert to ints, sum, and test primality
1

1

C(gcc)62 60字节,4583

很简单。如果为质数则输出*,否则输出空格。不适用于1。

-2感谢l4m2

p;main(i){for(scanf("%d",&p);++i<p;)p=p%i?p:0;puts("*"+!p);}

在线尝试!


1
n;main(i){for(scanf("%d",&n);++i<n;)n=n%i?n:0;puts("*"+!n);}可能需要更改一些变量名称的总和
l4m2 '18

@ l4m2不错!
gastropner '18

1

AWK,36字节,字节总和2239

{for(a=1;$0%++a&&a<$0;);$0=(a==$0)}1

在线尝试!

输出0非素数和1素数。绝对不是最有效的代码,因为它检查的每个整数都大于1看是否将输入除以整数。


1

Excel(57字节,代码总和3547)

=XOR(0<PRODUCT(MOD(A1,ROW(OFFSET(D2,0,,SQRT(A1))))),3>A1)

Excel实际上并没有这样的“输入”,但是此公式希望将要测试的数字放在A1中,并输出到您将其放入的任何单元格中。这是一个数组公式,因此请按Ctrl-Shift-Enter进行输入它,而不是Enter。


1

Java 8,114字节,Prime 10037

interface M{static void main(String[]a){long n=new Long(a[0]),x=2;for(;x<n;n=n%x++<1?0:n);System.out.print(n>1);}}

在线尝试。

说明:

interface M{                     // Class
  static void main(String[]a){   //  Mandatory main-method
    long n=new Long(a[0]),       //   The first argument as number
    x=2;for(;x<n;n=n%x++<1?0:n); //   Check if `n` is a prime
    System.out.print(n>1);}}     //   Print whether `n` was a prime
                                 //    (if `n` is still the same: it's a prime;
                                 //     if `n` is now 0 or 1: it's not a prime)

我使用x而不是i使unicode sum为素数。在此处验证unicode的总和。



0

SmileBASIC,42个字节, 2687

INPUT N:FOR D=2TO N/2P=P+!(N MOD D)NEXT?!P

如果数字是质数,则输出1(true),否则输出0(false)。

不仅仅是为了使程序成为素数而选择了变量名。 NÑ棕土测试,Dd ivisor,和P跟踪N是否为p雾凇。



0

Rust,190字节,15013得分

fn main(){let A=&mut"".into();std::io::stdin().read_line(A);let(B,mut C)=(A.trim().parse::<u64>().unwrap(),true);for H in 2..((B as f64).sqrt()+1.0) as u64{if B%H==0{C=false}}print!("{}",C)}

不打高尔夫球

fn main() {
    let input = &mut "".into();
    std::io::stdin().read_line(input);
    let (number, mut prime) = (input.trim().parse::<u64>().unwrap(), true);

    for x in 2..((number as f64).sqrt() + 1.0) as u64 {
        if number % x == 0 {
            prime = false;
        }
    }

    print!("{}", prime);
}

不适用于1



0

私语v2,33字节

>>> ⊤ℙ∘ℕ
> Input
>> 1∘2

在线尝试!

  1. 得分: 44381
  2. 仅添加6个字节/ 2个字符使其有效!
  3. 1不是素数

怎么运行的

按执行顺序显示:

		; Line 3:
>>  ∘		; Compose...
   1            ; Line 1 with
     2          ; The result of line 2

		; Line 2:
> Input		; Retrieve a line of input

		; Line 1:
>>> ⊤		; The input is...
     ℙ		; Prime
      ∘		; And it is...
       ℕ	; Natural
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.