Ein erstklassiger Test, der buchstäblich erstklassig ist


23

Schreiben Sie ein Programm, das die Primalität einer bestimmten Zahl testet und die Ausgabe als Booleschen Wert ausgibt (True ist Primzahl). Ihr Primetest kann (muss aber nicht) für die Nummer 1 gültig sein.

Hier ist der Haken: Ihr Programm selbst muss eine Primzahl ergeben. Konvertieren Sie jedes Zeichen (einschließlich Leerzeichen) in seinen Unicode / ASCII-Wert ( Tabelle ). Addieren Sie dann alle diese Zahlen, um die Summe Ihres Programms zu erhalten.

Nehmen Sie zum Beispiel dieses nicht so großartige Programm, das ich in Python 3.3 geschrieben habe:

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)

Wenn Sie alle Zeichen in den entsprechenden Unicode / ASCII-Wert konvertieren, erhalten Sie:

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 

Sie können die Summe dieser Zahlen dann manuell oder mit Ihrem eigenen Programm ermitteln. Dieses spezifische Programm ergibt 8293, was eine Primzahl ist.

Das ist natürlich Code Golf. Je kleiner Sie also Ihr Programm gestalten können, desto besser. Wie von anderen Usern herausgestellt, ist dieses Programm nicht sehr golfen.

Ein paar Regeln:

Gültige Eingaben sind STDIN und Eingabeaufforderungen (keine Funktionen, es ist nur eine Möglichkeit, kostenlosen zusätzlichen Code hinzuzufügen). Leerzeichen sind zulässig, jedoch nur, wenn sie für die Funktionalität Ihres Programms von entscheidender Bedeutung sind. Die Ausgabe muss eine Ausgabe sein, nicht nur in einer Variablen gespeichert oder zurückgegeben (verwenden Sie print, STDOUT usw.).

Flags können verwendet werden und sollten buchstäblich gezählt und nicht erweitert werden. Kommentare sind nicht erlaubt. Nicht-ASCII-Zeichen sollten dem Wert in ihrer jeweiligen Codierung zugewiesen werden.

Stellen Sie sicher, dass Sie die Größe Ihres Programms und die Summe des Programms angeben. Ich werde testen, um sicherzustellen, dass Programme gültig sind.

Viel Glück!

Hier ist ein Ausschnitt, um die Summe Ihres Programms zu zählen und zu prüfen, ob es ein Primer ist:


12
In Nicht-Golf-Sprachen könnte man einfach den kürzesten Prim-Entscheidungscode nehmen und die Variablennamen so lange ändern, bis die Summe Primzahl ist.
Xnor

5
Warum die Einschränkungen für I / O?
Jonathan Allan

2
Was ist ein "Unibyte-Wert"?! ???
Aditsu

5
Sie sprechen über Zeichen und Codeseiten. Ein Unicode-Zeichen hat immer den gleichen Codepunkt, unabhängig davon, mit welcher Codierung es dargestellt wird. Nicht-ASCII-Zeichen sollten dem Wert in ihrer jeweiligen Codierung zugewiesen werden. lässt mich denken, dass Sie tatsächlich wollen, dass die Summe der Bytewerte Primzahl ist
Dennis

Antworten:


22

Hallo Welt! 13 Bytes1193

hello, world!

1
perfekt . Ich habe schon einmal von dieser Sprache gehört, aber zu denken, dass es auch eine perfekte Bytesumme für diese Herausforderung gibt: D
Value Ink

7

Ruby, Summe 3373, 37 Bytes

require'prime'
g=gets.to_i
p g.prime?

6

Mikroskript II, 2 Bytes (Summe 137)

N;

Mikroskript II, 4 Bytes (Summe 353)

N;ph

Eigentlich bin ich ziemlich überrascht, dass beide mit Prime-Byte-Summen aufgewickelt wurden.



4

Pyth, 2 Bytes, 127

/P

Probieren Sie es online aus

Ausgänge 1für Primzahlen, 0für Nicht-Primzahlen.

/hat Code Punkt 47. Phat Code Punkt 80.

Wie es funktioniert:

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

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

Wilson-Satz.


2
Verwandelte es in ein eigenständiges Programm.
fquarp

Das ::IO Intsollte eigentlich nicht nötig sein, es sei denn, das ist der kürzeste Weg, um eine Primzahlsumme zu erhalten.
Ørjan Johansen

Guter Anruf. Dann erhalten wir jedoch einen Code, der auf einen geraden Wert "hascht". Das Hinzufügen von Leerzeichen oder Zeilenumbrüchen hat keine Auswirkung (gerade Werte) und auch keine Änderung des Namens der Variablen (sie wird viermal angezeigt. Das Ersetzen des Codes (sagen wir c) bedeutet also, 4 * c zu subtrahieren und 4 * c 'zu addieren Es kann jedoch durch Brechen der Linien optimiert werden und es kann immer noch kürzer sein, wie ich es getan habe.
Fquarp

1
47 Bytes mit einem anderen Primalitätstest: Probieren Sie es online aus! (Beachten Sie, dass es anstelle von Leerzeichen Tabulatoren gibt, um die Zählung richtig zu machen).
Laikoni

Willkommen auch bei PPCG!
Laikoni

4

Python 2, 50 Bytes, 4201

Funktioniert für 1. Die Ausgabe ist positiv, wenn prim oder null, wenn nicht.

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

Probieren Sie es online aus


Python 2, 44 Bytes, 3701

Funktioniert nicht für 1. Gibt einen Booleschen Wert aus.

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

Probieren Sie es online aus



3

05AB1E , 2 Bytes,173

p=

Erläuterung:

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.

Probieren Sie es online!


Etwas "Kommentare sind nicht erlaubt", aber ich denke, effektive No-Ops funktionieren
Value Ink

2

PHP, 38 Bytes, Summe 2791

Unterhaltsame Tatsache: Mit $hanstelle von $cwäre die Summe 2801(auch eine Primzahl), und ihre 101011110001als Dezimalzahl gelesene Binärdarstellung ist auch eine Primzahl.

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

Nimmt Kommandozeilenargumente, druckt 1oder leere Zeichenkette. Laufen Sie mit -r.

Code aus meiner eigenen primären Funktion genommen (schauen Sie sich den ursprünglichen Beitrag an, wenn Sie können).


@Artyer Es ist behoben.
Titus

2

R 27 32 Bytes, Summe 2243 2609

5 Bytes dank @rturnbull gespeichert

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

Dies nutzt die isprime-Funktion der gmp-Bibliothek.

> 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()))ist 5 Bytes kürzer und summiert sich 2243auch prime.
Rturnbull

@rturnbull danke dafür :)
MickyT


1

Jelly 6 Bytes , Bytesumme 691

ƓÆḍ,ṠE

druckt 1ob prime und 0wenn nicht.

TryItOnline!

Die Bytes in hexadezimaler Schreibweise sind 93 0D D5 2C CD 45(siehe Codepage ) oder in dezimaler Schreibweise 147 13 213 44 205 69die Summe zu 691, was eine Primzahl ist.

Wie?

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

Das Æḍ Funktionalität ist so, dass Primzahlen und ihre Negationen eine Zahl zurückgeben, während andere Ganzzahlen keine zurückgeben (zusammengesetzte Zahlen und ihre Negationen geben Zahlen zurück, die größer als eins, eins und minus eins sind, und null gibt, seltsamerweise minus eins zurück).

Die Funktionalität ist so, dass negative Ganzzahlen minus eins zurückgeben, null null zurückgibt und positive Ganzzahlen eins zurückgeben.

Somit geben die beiden Funktionen nur den gleichen Wert für die Primzahlen zurück.

Beachten Sie, dass das 3-Byte-Programm, ƓÆPdas direkt testet, ob die Eingabe von STDIN eine Primzahl ist, leider kein Primsummenprogramm ist (240).

Das Testen auf Gleichheit mit =(equals), e(exists in) oder (non-vectorising equals) für 5 Bytes liefert ebenfalls keine Primsummenprogramme.


Alternative (möglicherweise nicht akzeptabel) 4 Byte, Summe 571

Wenn die E / A-Einschränkungen weiterhin vollständige Programme zulassen, die ein Argument annehmen.

Æḍ⁼Ṡ

... nach dem gleichen Prinzip wie oben, wobei Gleichheit ohne Vektorisierung vorliegt (der Aspekt ohne Vektorisierung hat keine Auswirkung, da ohnehin nichts zu vektorisieren ist). Die Hex - Werte sind , 0D D5 8C CDdie sind 13 213 140 205in dezimal die Summe auf 571, eine Primzahl.

Beachten Sie erneut, dass das 2-Byte-Programm ÆPkeine Primsumme hat (93).


ƓÆPG(311) und ÆPF(163) sollten in Ordnung sein, denke ich?
Lynn

Als Unicode ist ƓÆḍ,ṠEder Wert 16183, der zufällig Primzahl ist!
Artyer

@Lynn Ja, es scheint, dass die "unnötige Code-Einschränkung" (außer dem Leerzeichen) aufgehoben wurde, was ƓÆPGOK macht. Ich habe auch gefragt, ob ein Programm, das eher Eingaben als die Verwendung von STDIN vornimmt, akzeptabel ist.
Jonathan Allan

1
... Wenn beide solche Dinge in Ordnung sind, dann ÆP¥ist 3 Bytes und 97.
Jonathan Allan


1

Mathematica, 21 Bytes, 1997

Print@*PrimeQ@Input[]

Input[]Liest eine Eingabezeile (von STDIN, wenn kein Front-End verwendet wird, durch ein Dialogfeld, wenn das Mathematica-Front-End verwendet wird), Print@*PrimeQist die Zusammensetzung ( @*) der Printund PrimeQ-Funktionen und @ist die Präfixfunktionsnotation.


1

Perl 6 , 24 22 Bytes,1949

say .is-prime
for +get

Alle drei Leerzeichen sind erforderlich.
(Perl 6 ist es egal, welche Art von Whitespace-Zeichen sie sind, also habe ich eine neue Zeile gewählt, anstatt den üblicherweise verwendeten Platz für die zweite ...)



1

Pip , 8 Bytes,511

0Na%,a=1

Ich habe einen Prime Checker geschrieben und die Summe war prime. Praktisch. Überprüfen Sie die Eingaben 1-30: Probieren Sie es online aus!

Erläuterung

          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

Nicht weit vom Optimum entfernt, konnte ich einen vollständigen Programm-Primärtest mit mindestens 17 Bytes durchführen echo(p:[:".1!:1)1, was leider 1133 = 11 * 103 ergibt.

Leider kann ich nicht herausfinden, wie Tastatureingaben auf TIO funktionieren, also noch kein Link.

Erläuterung:

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

Programm validieren:

   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

Ziemlich einfach. Gibt * aus, wenn prime, andernfalls wird ein Leerzeichen ausgegeben. Funktioniert nicht für 1.

-2 dank l4m2

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

Probieren Sie es online!


1
n;main(i){for(scanf("%d",&n);++i<n;)n=n%i?n:0;puts("*"+!n);}Möglicherweise müssen Sie einen Variablennamen für die Primzahl ändern
l4m2

@ l4m2 Schöne!
Gastropner

1

AWK , 36 Bytes, Bytesumme 2239

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

Probieren Sie es online!

Ausgänge 0wenn nicht prime und 1for prime. Auf jeden Fall nicht der effizienteste Code, da er jede ganze Zahl überprüft, die größer ist als 1die Teilung der Eingabe.


1

Excel (57 Byte, Codesumme 3547)

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

Excel hat eigentlich keine "Eingabe", aber diese Formel geht davon aus, dass die zu testende Zahl in A1 vorliegt, und gibt sie in jede Zelle aus, in die Sie sie einfügen. Dies ist eine Array-Formel. Drücken Sie daher zum Eingeben Strg-Umschalt-Eingabe es, anstatt einzutreten.


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

Probieren Sie es online aus.

Erläuterung:

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)

Ich habe verwendet, xanstatt idie Unicode-Summe zu einer Primzahl zu machen. Überprüfen Sie hier die Unicode-Summe.



0

SmileBASIC, 42 Bytes, 2687

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

Gibt 1 (wahr) aus, wenn die Zahl eine Primzahl ist, andernfalls 0 (falsch).

Die Variablennamen wurden nicht nur ausgewählt, um das Programm zu optimieren. Nist die n umber zu testen, Dist das d iVISOR und Pverfolgt, ob N p Raureif.



0

Rust, 190 Bytes, 15013 Punkte

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

Funktioniert nicht für 1



0

Flüstert v2 , 33 Bytes

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

Probieren Sie es online!

  1. Ergebnis: 44381
  2. Nur 6 Bytes / 2 Zeichen hinzugefügt, um es gültig zu machen!
  3. 1 ist keine Primzahl

Wie es funktioniert

Dies wird in der Reihenfolge angezeigt, in der es ausgeführt wird:

		; 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.