LITERALLY asal olan bir ana test


23

Belirtilen sayının ilkliğini test edecek bir program yazın ve çıktıyı bir Boole değeri olarak verin (Gerçek asaldır). Birinci testiniz 1 numara için geçerli olabilir (ancak zorunlu değildir).

İşte yakalamak: programınızın kendisi bir asal sayıya toplanmalıdır. Her karakteri (boşluklar dahil) Unicode / ASCII değerine ( tablo ) dönüştürün. Ardından, programınızın toplamını almak için tüm bu sayıları bir araya getirin.

Örneğin, Python 3.3'te yazdığım bu harika olmayan programı kullanın:

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)

Tüm karakterleri karşılık gelen Unicode / ASCII değerine dönüştürürseniz, şunları elde edersiniz:

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 

Daha sonra bu sayıların toplamını manuel olarak veya kendi programınızla bulabilirsiniz. Bu özel program bir asal sayı olan 8293’e tekabül ediyor.

Tabii ki, bu Code Golf, yani programınızı ne kadar küçük yaparsanız, o kadar iyi. Diğer kullanıcılar tarafından işaret edildiği gibi, bu program çok golf gibi değil.

Birkaç kural:

Geçerli girişler STDIN ve istemleri içerir (işlev yok, bu sadece ekstra kod eklemenin bir yoludur). Boşluklara izin verilir, ancak yalnızca programınızın işlevselliği için çok önemliyse. Çıktı, bir değişken olmalı, sadece bir değişkende saklanmamış veya iade edilmemiş (baskı, STDOUT vb. Kullanın).

Bayraklar kullanılabilir ve genişletilmemelidir, kelimenin tam anlamıyla sayılmalıdır. Yorumlara izin verilmiyor. ASCII olmayan karakterlere gelince, ilgili kodlamalarındaki değere atanmalıdırlar.

Programınızın boyutunu ve programın toplamını listelediğinizden emin olun. Programların geçerli olduğundan emin olmak için test edeceğim.

İyi şanslar!

İşte programınızın toplamını saymak ve asal olup olmadığını kontrol etmek için bir kod parçası:


12
Golf yapmayan dillerde, sadece en kısa ana karar verme kodunu alabilir ve toplam değer asal olana kadar değişken isimlerini değiştirebilirsiniz.
xnor

5
Neden G / Ç ile ilgili kısıtlamalar var?
Jonathan Allan,

2
"Unibyte değeri" nedir?! ???
aditsu

5
Karakterler ve kod sayfaları hakkında konuşuyorsunuz. Bir Unicode karakteri, hangi kodlamanın kullanıldığına bakılmaksızın her zaman aynı kod noktasına sahiptir. ASCII olmayan karakterlere gelince, ilgili kodlamalarındaki değere atanmalıdırlar. aslında bayt değerlerinin toplamının asıl olmasını istediğinizi düşündürüyor
Dennis

Yanıtlar:




6

Mikroscript II, 2 bayt (toplam 137)

N;

Mikroscript II, 4 bayt (toplam 353)

N;ph

Aslına bakarsanız, bu yaraların ikisinin de asal bayt toplamına sahip olmasına şaşırdım.



4

Pyth, 2 bayt, 127

/P

Çevrimiçi deneyin

1Asal 0olmayanlar için asal çıkışlar .

/kod noktası var 47. Pkod noktası var 80.

Nasıl çalışır:

/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 bayt, 4421

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

Wilson teoremi.


2
Tam bağımsız bir program haline getirdi.
fquarp

Asıl ::IO Inttoplamı almanın en kısa yolu bu olmadığı sürece gerçekten gerekli olmamalı.
Ørjan Johansen

İyi arama. Bununla birlikte, eşit bir değere “hash” yapan bir kod alırız. Boşluk veya yeni satır eklemek hiçbir şey yapmaz (hatta değerleri), değişkenin adını da değiştirmez (dört kez görünür, bu nedenle kodunu değiştirmek (c demek) 4 * c çıkarma ve 4 * c 'ekleme yapmaktan çıkar, Ancak, satırları kırarak
ince ayar

1
Farklı bir birincillik testiyle 47 bayt: Çevrimiçi deneyin! (Sayıyı doğru almak için boşluk yerine sekmeler olduğunu unutmayın).
Laikoni

Ayrıca PPCG'ye hoş geldiniz!
Laikoni

4

Python 2,50 bayt, 4201

1 için çalışır. Asal ise çıktı pozitif, değilse sıfırdır.

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

Çevrimiçi deneyin


Python 2,44 bayt, 3701

1 için çalışmıyor. Bir Boole verir.

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

Çevrimiçi deneyin



3

05AB1E , 2 bayt,173

p=

Açıklama:

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.

Çevrimiçi deneyin!


"Yorumlara izin verilmez" diye bir şey var, ancak etkili olmayan operasyonların iyi sonuç verdiğini düşünüyorum: D
Value Ink

2

PHP, 38 bayt, toplam 2791

Eğlenceli bir gerçek: With $hyerine $c, toplamı olacaktır 2801(aynı zamanda asal) ve ikili gösterimi 101011110001ondalık da bir asal sayıdır olarak okunur.

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

komut satırı argümanını alır, yazdırır 1veya boş dizge. İle koş -r.

Kendi asal fonksiyonumdan alınan kod (eğer yapabilirseniz orijinal yazıya bakın).


@ Artyer Sabit.
Titus,

2

R, 27 32 bayt, toplam 2243 2609

@Rturnbull sayesinde 5 bayt kaydedildi

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

Bu, gmp kütüphanesinin isprime fonksiyonunu kullanır.

> 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 bayt daha kısa ve 2243aynı zamanda asal olur.
rturnbull

@rturnbull bunun için teşekkürler :)
MickyT

1

Python 2, 44 bayt, bayt toplamı 3109

Bu, xnor'ın , asal bayt toplamını sağlayan en düşük değerli değişken adlarına sahip 44 bayt uygulamasıdır .

1Asal olup 0olmadığını yazdırır .

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

1

Jöle 6 bayt , bayt toplamı 691

ƓÆḍ,ṠE

1asal olup 0olmadığını yazdırır .

TryItOnline!

Onaltılıktaki baytlar 93 0D D5 2C CD 45( kod sayfasına bakın ) veya ondalık basamakta 147 13 213 44 205 69hangisi asal olan 691'dir.

Nasıl?

ƓÆḍ,Ṡ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

Æḍİşlevsellik diğer tamsayı olmayan (kompozit ve olumsuzluklar bir, bir ve eksi bir geri ve sıfır döner ilginçtir ki, eksi birden daha fazla sayıda geri dönüş) yaparken asal ve olumsuzluklar bir geri şekildedir.

İşlevsellik negatif tamsayı geri eksi bir sıfır döner sıfır ve pozitif tamsayı bir geri şekildedir.

Bu nedenle, iki işlev yalnızca primerler için aynı değeri verir.

3 baytlık program unutmayın ƓÆPSTDIN'den gelen girişin asal olup olmadığını doğrudan test maalesef birinci sınıf bir program olmadığını unutmayın (240).

5 bayt için =(eşittir), e( içeride bulunur) veya (vektörleşmeyen eşitler) kullanarak eşitlik testi de prime toplam programları vermez.


Alternatif (belki kabul edilmez) 4 bayt, toplam 571

Eğer G / Ç kısıtlamaları hala tartışılan tüm programlara izin veriyorsa.

Æḍ⁼Ṡ

... yukarıdakiyle aynı prensibi kullanarak, vektörelleştirici olmayan eşitlik (vektörelleştirici olmayan özellik hiçbir şekilde etkileyemez). Onaltılık değerler vardır 0D D5 8C CDhangi 13 213 140 205571 için toplamı, birinci sınıf bir ondalık.

Yine, 2 baytlık programın ÆPbirinci sınıf bir toplamının olmadığını unutmayın (93).


ƓÆPG(311) ve ÆPF(163) iyi olmalı bence?
Lynn

Unicode ƓÆḍ,ṠEolarak 16183, bunun için, tesadüf eseri asal olan değer !
Artyer

@Lynn Evet, "gereksiz kod kısıtlaması" (boşluk karakteri hariç) kaldırılmış, ƓÆPGtamam gibi görünüyor. Ayrıca STDIN kullanmak yerine girdi alan bir programın kabul edilebilir olup olmadığını sordum.
Jonathan Allan,

1
... Her iki şey de yolunda ÆP¥ise 3 bayt ve 97.
Jonathan Allan


1

Mathematica, 21 bayt, 1997

Print@*PrimeQ@Input[]

Input[](eğer bir ön uç kullanılmazsa STDIN'den, Mathematica ön uç kullanılıyorsa bir iletişim kutusu aracılığıyla) bir girdi satırı okur ve işlevlerin Print@*PrimeQbileşimidir ( @*) ve önek işlevi gösterimidir.PrintPrimeQ@


1

Perl 6 , 24 22 bayt,1949

say .is-prime
for +get

Her üç boşluk karakteri de gereklidir.
(Perl 6, ne tür bir boşluk karakteri olduğu umurumda değil , bu yüzden ikincisi için daha çok kullanılan alan yerine yeni bir satır seçtim ...)



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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.