Un test primo che è letteralmente primo


23

Scrivi un programma che testerà la primalità di un numero specificato e fornirà l'output come valore booleano (True è primo). Il tuo test primo può (ma non deve) essere valido per il numero 1.

Ecco il problema: il tuo stesso programma deve riassumere in un numero primo. Converti ogni carattere (inclusi gli spazi) nel suo valore Unicode / ASCII ( tabella ). Quindi, aggiungi tutti quei numeri insieme per ottenere la somma del tuo programma.

Ad esempio, prendi questo programma non eccezionale che ho scritto in 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)

Se converti tutti i caratteri nel loro corrispondente valore Unicode / ASCII, otterrai:

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 

È quindi possibile trovare la somma di tali numeri manualmente o con il proprio programma. Questo programma specifico si somma a 8293, che è un numero primo.

Naturalmente, questo è Code Golf, quindi più piccolo puoi rendere il tuo programma, meglio è. Come sottolineato da altri utenti, questo programma non è molto da golf.

Alcune regole:

Gli input validi includono STDIN e prompt (nessuna funzione, è solo un modo per aggiungere un codice extra gratuito). Gli spazi sono consentiti, ma solo se sono cruciali per la funzionalità del tuo programma. L'output deve essere un output, non solo archiviato in una variabile o restituito (usa print, STDOUT, ecc.)

Le bandiere possono essere utilizzate e devono essere contate letteralmente, non espanse. I commenti non sono ammessi Per quanto riguarda i caratteri non ASCII, dovrebbero essere assegnati al valore nella rispettiva codifica.

Assicurati di elencare le dimensioni del tuo programma e la somma del programma. Proverò per accertarmi che i programmi siano validi.

In bocca al lupo!

Ecco uno snippet per contare la somma del tuo programma e verificare se è primo:


12
Nei linguaggi non golfistici, sembra che potresti semplicemente prendere il codice di decisione principale più breve e modificare i nomi delle variabili fino a quando la somma non è prima.
xnor

5
Perché le restrizioni sull'I / O?
Jonathan Allan,

2
Che cos'è un "valore Unibyte"?! ???
aditsu,

5
Parli di personaggi e pagine di codice. Un carattere Unicode ha sempre lo stesso punto di codice, indipendentemente dalla codifica utilizzata per rappresentarlo. Per quanto riguarda i caratteri non ASCII, dovrebbero essere assegnati al valore nella rispettiva codifica. mi fa pensare che tu voglia davvero che la somma dei valori dei byte sia primaria
Dennis

Risposte:


22

Ciao mondo! , 13 byte,1193

hello, world!

1
perfezionare . Ho già sentito parlare di questa lingua prima, ma pensare che sia capitato anche di avere una somma di byte perfetta per questa sfida: D
Value Ink

7

Rubino, somma 3373, 37 byte

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

6

Microscript II, 2 byte (somma 137)

N;

Microscript II, 4 byte (somma 353)

N;ph

In realtà sono abbastanza sorpreso dal fatto che entrambi abbiano avuto somme di byte primi.



4

Pyth, 2 byte, 127

/P

Provalo online

Uscite 1per numeri primi, 0per non numeri primi.

/ha un punto di codice 47. Pha un punto di codice 80.

Come funziona:

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

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

Teorema di Wilson.


2
Trasformato in un programma completamente autonomo.
dal

In ::IO Intrealtà non dovrebbe essere necessario a meno che non sia il modo più breve per ottenere una somma primaria.
Ørjan Johansen

Buona chiamata. Tuttavia, otteniamo quindi del codice che "hash" su un valore pari. L'aggiunta di spazi o nuove righe non fa nulla (anche i valori), né cambiare il nome della variabile (appare quattro volte, quindi sostituire il suo codice (diciamo c) equivale a sottrarre 4 * c e aggiungere 4 * c ', lasciando il . somma anche Tuttavia, può essere ottimizzato rompendo le righe ed essere ancora più breve, che ho fatto.
fquarp

1
47 byte con un test di primalità diverso: provalo online! (nota che ci sono schede invece di spazi per ottenere il conteggio corretto).
Laikoni,

Benvenuto anche in PPCG!
Laikoni,

4

Python 2, 50 byte, 4201

Funziona per 1. L'output è positivo se primo o zero se non lo è.

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

Provalo online


Python 2, 44 byte, 3701

Non funziona per 1. Emette un valore booleano.

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

Provalo online


3

JavaScript (ES6), 47 byte, 3541

Questo è fortemente basato sulla funzione di test della primalità di ETHproductions , che può essere trovata qui .

alert((F=(n,x=n)=>n%--x?F(n,x):!~-x)(prompt()))


3

05AB1E , 2 byte,173

p=

Spiegazione:

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.

Provalo online!


Qualcosa "i commenti non sono ammessi" ma credo che le no-op efficaci funzionino bene: D
Value Ink

2

PHP, 38 byte, somma 2791

Curiosità: con $hinvece di $c, la somma sarebbe 2801(anche un numero primo), e la sua rappresentazione binaria 101011110001letta come decimale è anche un numero primo.

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

accetta l'argomento della riga di comando, stampa 1o stringa vuota. Corri con -r.

Codice preso dalla mia funzione principale (guarda il post originale se puoi).


@Artyer È stato risolto.
Tito

2

R, 27 32 byte, somma 2243 2609

Salvato 5 byte grazie a @rturnbull

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

Questo utilizza la funzione isprime della libreria gmp.

> 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()))è più breve di 5 byte e si somma 2243anche a primi.
rturnbull,

@rturnbull grazie per quello :)
MickyT

1

Python 2, 44 byte, somma byte 3109

Questa è l'implementazione a 44 byte di xnor con i nomi delle variabili con il valore più basso che producono una somma di byte primi.

Stampa 1se primo e in 0caso contrario.

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

1

Gelatina 6 byte , somma byte 691

ƓÆḍ,ṠE

stampa 1se primo e in 0caso contrario.

TryItOnline!

I byte in esadecimali sono 93 0D D5 2C CD 45(vedere la tabella codici ) o in decimali147 13 213 44 205 69 che corrispondono a 691, che è primo.

Come?

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

Il Æḍ funzionalità è tale che i numeri primi e le loro negazioni restituiscono uno mentre gli altri non lo fanno (i compositi e le loro negazioni restituiscono numeri maggiori di uno, uno e meno uno restituiscono zero e zero ritorni, stranamente, meno uno).

La funzionalità è tale che gli interi negativi restituiscono meno uno, zero restituisce zero e gli interi positivi restituiscono uno.

Pertanto, le due funzioni restituiscono solo lo stesso valore per i numeri primi.

Si noti che il programma a 3 byte ƓÆP che verifica direttamente se l'ingresso da STDIN è primo non è purtroppo un programma a somma primi (240).

Anche il test per l'uguaglianza utilizzando =(uguale a), e(esiste in) o (uguale a non vettoriale) per 5 byte non produce programmi di somma.


Alternativo (forse non accettabile) 4 byte, somma 571

Se le restrizioni I / O consentono ancora programmi completi che accettano un argomento.

Æḍ⁼Ṡ

... usando lo stesso principio di cui sopra, dove è l'uguaglianza non vettorializzante (l'aspetto non vettorializzante non ha alcun effetto poiché non c'è nulla su cui vettorializzare comunque). I valori esadecimali sono 0D D5 8C CD, che sono 13 213 140 205in decimale che somma 571, un numero primo.

Notare ancora che il programma a 2 byte ÆPnon ha una somma primi (93).


ƓÆPG(311) e ÆPF(163) dovrebbero andare bene, penso?
Lynn,

Come Unicode, per ƓÆḍ,ṠE, il valore è 16183, che è per coincidenza primo!
Artyer,

@Lynn Sì, sembra che la "restrizione del codice non necessaria" (ad eccezione del carattere spazio) sia stata eliminata, rendendo ƓÆPGOK. Ho anche chiesto se un programma che accetta input piuttosto che l'uso di STDIN è accettabile.
Jonathan Allan il

1
... Se entrambe queste cose sono OK, allora ÆP¥è 3 byte e 97.
Jonathan Allan il


1

Mathematica, 21 byte, 1997

Print@*PrimeQ@Input[]

Input[]legge una linea di ingresso (da STDIN se non estremità anteriore viene utilizzato, tramite una finestra di dialogo se si utilizza il front-end Mathematica), Print@*PrimeQè la composizione ( @*) del Printe PrimeQfunzioni, ed @è funzione del prefisso notazione.


1

Perl 6 , 24 22 byte,1949

say .is-prime
for +get

Sono richiesti tutti e tre i caratteri degli spazi bianchi.
(Perl 6 non importa che tipo di carattere di spazio bianco siano, comunque, quindi ho scelto una nuova riga invece dello spazio più comunemente usato per il secondo ...)



1

Pip , 8 byte,511

0Na%,a=1

Ho scritto una prima e la somma era ottima. Conveniente. Verifica input 1-30: provalo online!

Spiegazione

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

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

Non lontano dall'ottimale, il minimo a cui ho potuto giocare un test di primalità del programma completo era di 17 byte:, echo(p:[:".1!:1)1che purtroppo si somma a 1133 = 11 * 103.

Sfortunatamente non riesco a capire come far funzionare l'input da tastiera su TIO, quindi nessun collegamento ancora.

Spiegazione:

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

Convalida del programma:

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

1

C (gcc) , 62 60 byte, 4583

Abbastanza diretto. Emette * se primo, altrimenti emette uno spazio. Non funziona per 1.

-2 grazie a l4m2

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

Provalo online!


1
n;main(i){for(scanf("%d",&n);++i<n;)n=n%i?n:0;puts("*"+!n);}potrebbe essere necessario modificare un nome variabile per la somma principale
l4m2

@ l4m2 Nice one!
Gastropner

1

AWK , 36 byte, somma byte 2239

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

Provalo online!

Uscite 0se non prime e 1per prime. Sicuramente non è il codice più efficiente, poiché controlla ogni numero intero maggiore di 1vedere se divide l'input.


1

Excel (57 byte, somma codice 3547)

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

Excel in realtà non ha un "input" in quanto tale, ma questa formula prevede che il numero venga testato in A1 e viene emesso in qualsiasi cella in cui lo lasci cadere. È una formula di matrice, quindi premi Ctrl-Maiusc-Invio per accedere piuttosto che Enter.


1

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

Provalo online.

Spiegazione:

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)

Ho usato xinvece di irendere la somma unicode un numero primo. Verifica qui la somma unicode.



0

SmileBASIC, 42 byte, 2687

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

Emette 1 (vero) se il numero è primo, altrimenti 0 (falso).

I nomi delle variabili non sono stati scelti solo per rendere il programma primo. Nè il n umero di prova, Dè la d iVisor, e Ptiene traccia se N è p brina.



0

Ruggine, 190 byte, 15013 punti

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

Non funziona per 1



0

Whispers v2 , 33 byte

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

Provalo online!

  1. Punto: 44381
  2. Sono stati aggiunti solo 6 byte / 2 caratteri per renderlo valido!
  3. 1 non è un numero primo

Come funziona

Questo è mostrato nell'ordine in cui viene eseguito:

		; 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.