文字通り素数の素数テスト


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
「ユニバイト値」とは何ですか?!???
-aditsu

5
あなたはキャラクターとコードページについて話します。Unicode文字は、どのエンコードを使用して表現するかに関係なく、常に同じコードポイントを持ちます。非ASCII文字については、それぞれのエンコーディングの値に割り当てる必要があります。実際にバイト値の合計を素数にしたいと思うようになります
デニス

回答:




6

Microscript II、2バイト(合計137)

N;

マイクロスクリプトII、4バイト(合計353)

N;ph

私は実際、これらの両方が素数のバイト合計を持っていることに驚いた。



4

Pyth、2バイト、 127

/P

オンラインで試す

1素数、0非素数の出力。

/コードポイントがあり47ます。Pコードポイントがある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はあなたが素数を得ることができる最短の方法でない限り、本当に必要ではないはずです。
Ørjanヨハンセン

良い電話。しかし、その後、偶数値に「ハッシュ」するコードを取得します。スペースまたは改行を追加しても何も(値も)行わず、変数の名前も変更しません(4回出現します。そのため、コード(cなど)を置き換えると、4 * cを減算し、4 * c 'を加算し、ただし、行を分割することで微調整することができ、さらに短くすることができます
-fquarp

1
異なる素数テストで47バイト:オンラインで試してみてください!(カウントを正しくするためにスペースの代わりにタブがあることに注意してください)。
ライコニ

PPCGへようこそ!
ライコニ

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(また素数)になり、10101111000110進数として読み取られるそのバイナリ表現も素数になります。

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

コマンドライン引数を取り、表示する1か、空の文字列にします。で実行-rます。

私自身のプライム関数から取得したコード(可能な場合は元の投稿をご覧ください)。


@Artyerそれは修正されました。
タイタス

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!

16進数のバイトは93 0D D5 2C CD 45コードページを参照)、または10 進数のバイトは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

このÆḍ機能は、素数とその否定が1を返す一方で、他の整数は返さないというものです(合成とその否定は、1を超える数を返します。1マイナス1は、ゼロとゼロを返します。

機能は、負の整数はゼロリターンはゼロと正の整数は1を返し、マイナス1を返すようなものです。

したがって、2つの関数は素数に対して同じ値のみを返します。

ƓÆPSTDINからの入力が素数であるかどうかを直接テストする3バイトのプログラムは、残念ながら素数プログラムではないことに注意してください(240)。

5バイトの=(等しい)、e(存在する)、または(非ベクトル化の等しい)を使用した等価性のテストでも、プライムサムプログラムは生成されません。


代替(受け入れられない場合があります)4バイト、合計571

I / Oの制限により、引数を取る完全なプログラムが引き続き許可される場合。

Æḍ⁼Ṡ

...上記と同じ原則を使用します。ここで、非ベクトル化の等式です(ベクトル化するものがないため、非ベクトル化の側面は効果がありません)。進値がさ0D D5 8C CDである13 213 140 205571の合計値、プライム小数で。

繰り返しますが、2バイトのプログラムにÆPは総和(93)がないことに注意してください。


ƓÆPG(311)とÆPF(163)は問題ないはずです。
リン

Unicodeの場合ƓÆḍ,ṠE、値は16183であり、偶然に素数です!
アーティア

@Lynnはい、「不要なコード制限」(スペース文字を除く)が解除され、ƓÆPGOK になったようです。また、STDINを使用するのではなく、入力を受け取るプログラムが受け入れられるかどうかも尋ねました。
ジョナサンアラン

1
両方のようなものがOKであれば...それからÆP¥3バイトで、97
ジョナサン・アラン


1

Mathematica、21バイト、 1997

Print@*PrimeQ@Input[]

Input[] reads a line of input (from STDIN if no front end is used, through a dialog box if the Mathematica front end is used), Print@*PrimeQ is the composition (@*) of the Print and PrimeQ functions, and @ is prefix function notation.


1

Perl 6, 24 22 bytes, 1949

say .is-prime
for +get

All three whitespace characters are required.
(Perl 6 doesn't care what kind of whitespace character they are, though, so I chose a newline instead of the more commonly used space for the second one...)



1

Pip, 8 bytes, 511

0Na%,a=1

I wrote a prime checker, and the sum was prime. Convenient. Verify inputs 1-30: Try it online!

Explanation

          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 Bytes, 1103

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

Not far from optimal, the least I could golf a full program primality test to was 17 Bytes: echo(p:[:".1!:1)1, which unfortunately sums to 1133 = 11*103.

Unfortunately I can't figure out how to get keyboard input working on TIO, so no link yet.

Explanation:

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

Validating the program:

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

1

C (gcc), 62 60 bytes, 4583

Pretty straight-forward. Outputs * if prime, otherwise it outputs a space. Does not work for 1.

-2 thanks to l4m2

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

Try it online!


1
n;main(i){for(scanf("%d",&n);++i<n;)n=n%i?n:0;puts("*"+!n);} may need to change some variable name for prime sum
l4m2

@l4m2 Nice one!
gastropner

1

AWK, 36 bytes, byte-sum 2239

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

Try it online!

Outputs 0 if not prime and 1 for prime. Definitely not the most efficient code, since it checks every integer greater than 1 to see if it divides the input.


1

Excel (57 bytes, code sum 3547)

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

Excel doesn't really have an "input" as such, but this formula expects the number to be tested to be in A1 and outputs to whatever cell you drop it in. It's an array formula, so press Ctrl-Shift-Enter to enter it, rather than Enter.


1

Java 8, 114 bytes, 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);}}

Try it online.

Explanation:

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)

I've used x instead of i to make the unicode sum a prime. Verify the unicode sum here.



0

SmileBASIC, 42 bytes, 2687

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

Outputs 1 (true) if the number is prime, otherwise 0 (false).

The variable names were not just chosen to make the program prime. N is the number to test, D is the divisor, and P keeps track of whether N is prime.



0

Rust, 190 bytes, 15013 score

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)}

Ungolfed

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);
}

Does not work for 1



0

Whispers v2, 33 bytes

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

Try it online!

  1. Score: 44381
  2. Only 6 bytes/2 characters added to make it valid!
  3. 1 is not prime

How it works

This is shown in the order it is executed in:

		; 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.