Questo numero è un numero primo?


195

Che ci crediate o no, non abbiamo ancora una sfida di golf del codice per un semplice test di primalità . Anche se potrebbe non essere la sfida più interessante, in particolare per le lingue "normali", può essere non banale in molte lingue.

Il codice Rosetta presenta elenchi per lingua degli approcci idiomatici ai test di primalità, uno che utilizza specificamente il test di Miller-Rabin e un altro che utilizza la divisione di prova . Tuttavia, "il più idiomatico" spesso non coincide con "il più breve". Nel tentativo di rendere Programming Puzzles e Code Golf il sito di riferimento per il code golf, questa sfida cerca di compilare un catalogo dell'approccio più breve in ogni lingua, simile a "Hello, World!" e Golf sei un vero paradiso! .

Inoltre, la capacità di implementare un test di primalità fa parte della nostra definizione di linguaggio di programmazione , quindi questa sfida servirà anche come directory di linguaggi di programmazione comprovati.

Compito

Scrivi un programma completo che, dato un intero n strettamente positivo come input, determina se n è primo e stampa di conseguenza un valore di verità o falsa .

Ai fini di questa sfida, un numero intero è primo se ha esattamente due divisori strettamente positivi. Si noti che questo esclude 1 , che è il suo unico divisore strettamente positivo.

Il tuo algoritmo deve essere deterministico (cioè produrre l'output corretto con probabilità 1) e, in teoria, dovrebbe funzionare con numeri interi arbitrariamente grandi. In pratica, si può presumere che l'input possa essere memorizzato nel tipo di dati, purché il programma funzioni per numeri interi compresi tra 1 e 255.

Ingresso

  • Se la tua lingua è in grado di leggere da STDIN, accettare argomenti della riga di comando o qualsiasi altra forma alternativa di input dell'utente, puoi leggere l'intero come sua rappresentazione decimale, rappresentazione unaria (usando un carattere a tua scelta), array di byte (grande o little endian) o single byte (se questo è il tipo di dati più grande per la tua lingua).

  • Se (e solo se) la tua lingua non è in grado di accettare alcun tipo di input dell'utente, puoi inserire un hardcode nel tuo programma.

    In questo caso, l'intero intero codificato deve essere facilmente scambiabile. In particolare, può apparire solo in un'unica posizione nell'intero programma.

    Ai fini del punteggio, inviare il programma che corrisponde all'ingresso 1 .

Produzione

L'output deve essere scritto su STDOUT o sull'alternativa più vicina.

Se possibile, l'output dovrebbe consistere esclusivamente in un valore di verità o falsità (o una sua rappresentazione in forma di stringa), facoltativamente seguito da una sola nuova riga.

L'unica eccezione a questa regola è l'output costante dell'interprete della tua lingua che non può essere soppresso, come un saluto, codici colore ANSI o rientro.

Regole aggiuntive

  • Non si tratta di trovare la lingua con l'approccio più breve per i test di base, si tratta di trovare l'approccio più breve in ogni lingua. Pertanto, nessuna risposta verrà contrassegnata come accettata.

  • Le iscrizioni nella maggior parte delle lingue verranno classificate in byte in una codifica preesistente appropriata, di solito (ma non necessariamente) UTF-8.

    La lingua di Piet , ad esempio, verrà classificata in codici, che è la scelta naturale per questa lingua.

    Alcune lingue, come Cartelle , sono un po 'difficili da segnare. In caso di dubbi, si prega di chiedere su Meta .

  • A differenza delle nostre solite regole, sentiti libero di usare una lingua (o versione linguistica) anche se è più recente di questa sfida. Se qualcuno vuole abusare di questo creando una lingua in cui il programma vuoto esegue un test di primalità, allora si congratula per aver spianato la strada a una risposta molto noiosa.

    Si noti che deve essere presente un interprete per poter testare l'invio. È permesso (e persino incoraggiato) di scrivere questo interprete per una lingua precedentemente non implementata.

  • Se la tua lingua preferita è una banale variante di un'altra lingua (potenzialmente più popolare) che ha già una risposta (pensa a dialetti BASIC o SQL, shell Unix o banali derivati ​​Brainfuck come Headsecks o Unary), considera di aggiungere una nota alla risposta esistente che la stessa soluzione o molto simile è anche la più breve nell'altra lingua.

  • Sono consentite funzioni integrate per il test della primalità . Questa sfida ha lo scopo di catalogare la soluzione più breve possibile in ogni lingua, quindi se è più breve usare un built-in nella tua lingua, provaci.

  • A meno che non siano stati annullati in precedenza, si applicano tutte le regole standard , incluso http://meta.codegolf.stackexchange.com/q/1061 .

Come nota a margine, si prega di non sottovalutare le risposte noiose (ma valide) in lingue in cui non c'è molto da golf; questi sono ancora utili a questa domanda in quanto tenta di compilare un catalogo il più completo possibile. Tuttavia, valuta principalmente le risposte nelle lingue in cui l'autore ha effettivamente dovuto sforzarsi di giocare a golf con il codice.

Catalogare

Lo snippet di stack nella parte inferiore di questo post genera il catalogo dalle risposte a) come elenco della soluzione più breve per lingua eb) come classifica generale.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, utilizzando il seguente modello Markdown:

## Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

## Perl, 43 + 2 (-p flag) = 45 bytes

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


Posso prendere input come numeri negativi, dove abs (input) sarebbe il numero che sto testando?
Stan Strum,

No, l'input è un numero intero strettamente positivo.
Dennis,

1
@LyndonWhite Questo era inteso come un catalogo (come "Hello, World!" ) Di test di primalità, quindi un formato di presentazione unificato sembrava preferibile. È una delle due decisioni su questa sfida di cui mi pento, mentre l'altra consente solo test di primalità deterministici.
Dennis,

1
@Shaggy Sembra una domanda per meta.
Dennis,

1
Sì, è quello che stavo pensando. Ti lascerò fare gli onori, visto che è la tua sfida.
Shaggy,

Risposte:


226

Ciao mondo! , 13

hello, world!

83
Hai appena creato questa lingua, solo per questa presentazione? ;)
ETHproductions

41
@ETHproductions Sembra che l'ultimo commit sia stato 10 giorni fa.
Geobits,

39
Speravo di avere una lingua leggermente migliore prima di collegarla ovunque, ma questa sfida è stata pubblicata e non ho resistito.
histocrat,

31
Direi quasi che appendere su un input di 1 è la funzionalità corretta.
iamnotmaynard,

22
La parte migliore di questo è che il programma non è solo un built-in, ogni personaggio fa la sua parte per ottenere il risultato corretto.
ETHproductions

157

Esagonia , 29 byte

.?'.).@@/'/.!.>+=(<.!)}($>(<%

La versione leggibile di questo codice è:

   . ? ' .
  ) . @ @ /
 ' / . ! . >
+ = ( < . ! )
 } ( $ > ( <
  % . . . .
   . . . .

Spiegazione: Verifica se esiste un numero da 2 a n-1 che divide n.

Inizializzazione:

Scrivi n in una cella di memoria e n-1 in un'altra:

   . ? ' .
  . . . . .
 . . . . . .
+ = ( . . . .
 . . . . . .
  . . . . .
   . . . .

Caso speciale n = 1:

Stampa uno 0 e termina

   . . . .
  . . . @ .
 . . . ! . .
. . . < . . .
 . . . . . .
  . . . . .
   . . . .

Il cappio

Calcola n% a e diminuisci a. Termina se a = 1 o n% a = 0.

   . . . .
  ) . . . /
 ' / . . . >
. . . . . . .
 } ( $ > ( <
  % . . . .
   . . . .

Caso a = 1:

Aumenta da 0 a 1, stampalo e termina. (Il puntatore dell'istruzione viene eseguito in direzione NE e scorre dall'angolo est a quello sud-occidentale. E $ fa in modo che ignori il comando successivo)

   . . . .
  . . . @ .
 . . . ! . .
. . . < . . )
 . . $ . . <
  . . . . .
   . . . .

Caso a% n = 0:

Stampa lo 0 e termina (il puntatore dell'istruzione esegue SW e si sposta in alto verso @

   . . . .
  . . @ . .
 . . . . . >
. . . . . ! .
 . . . . . .
  . . . . .
   . . . .

61
Santa merda, questo è un primo post impressionante. :) Metterò subito la taglia (la assegnerò tra 7 giorni, per attirare un po 'più di attenzione sulla tua risposta). Benvenuti in PPCG!
Martin Ender,

35
Bella risposta! +1 per " La versione leggibile di questo codice è: <...> " :-)
agtoever

68

Esagonia , 218 92 58 55 byte

Avviso: questa risposta è stata ampiamente battuta con una soluzione laterale di 4 Etoplay.

)}?}.=(..]=}='.}.}~./%*..&.=&{.<......=|>(<..}!=...&@\[

Il primo programma di esagonia mai banale (cioè non lineare)! Si basa sullo stesso approccio fattoriale al quadrato della risposta Labyrinth di Sp3000 . Dopo aver iniziato con un esagono di dimensione 10, sono riuscito a comprimerlo fino alla dimensione 5. Tuttavia, sono stato in grado di riutilizzare del codice duplicato e ci sono ancora un bel po 'di no-op nel codice, quindi la dimensione 4 potrebbe semplicemente Essere possibile.

Spiegazione

Per dare un senso al codice, dobbiamo prima dispiegarlo. Hexagony inserisce qualsiasi codice sorgente nel numero esagonale centrato successivo con no-ops ( .), che è 61. Quindi riorganizza il codice in un esagono regolare della dimensione corrispondente:

     ) } ? } .
    = ( . . ] =
   } = ' . } . }
  ~ . / % * . . &
 . = & { . < . . .
  . . . = | > ( <
   . . } ! = . .
    . & @ \ [ .
     . . . . .

Questo è abbastanza pesantemente giocato con percorsi di esecuzione incrociati e sovrapposti e puntatori di istruzioni multiple (IP). Per spiegare come funziona, esaminiamo prima una versione non controllata in cui il flusso di controllo non passa attraverso i bordi, viene utilizzato solo un IP e i percorsi di esecuzione sono il più semplici possibile:

             . . . . . . . . . . . . .
            . . . . . . . . . . . . . .
           . . . . . . . . . . . . . . .
          . . . . . . . . . . @ . . . . .
         . . . . . . . . . . ! . . . . . .
        . . . . . . . . . . % . . . . . . .
       . . . . . . . . . . ' . . . . . . . .
      . . . . . . . . . . & . . . . . . . . .
     . . . . . . . . . . { . . . . . . . . . .
    . . . . . . . . . . * . . . . . . . . . . .
   . . . . . . . . . . = . . . . . . . . . . . .
  . . . . . . . . . . } . . . . . . . . . . . . .
 ) } ? } = & { < . . & . . . . . . . . . . . . . .
  . . . . . . . > ( < . . . . . . . . . . . . . .
   . . . . . . = . . } . . . . . . . . . . . . .
    . . . . . } . . . = . . . . . . . . . . . .
     . . . . | . . . . | . . . . . . . . . . .
      . . . . * . . . ) . . . . . . . . . . .
       . . . . = . . & . . . . . . . . . . .
        . . . . > } < . . . . . . . . . . .
         . . . . . . . . . . . . . . . . .
          . . . . . . . . . . . . . . . .
           . . . . . . . . . . . . . . .
            . . . . . . . . . . . . . .
             . . . . . . . . . . . . .

Nota a margine: il codice sopra riportato inizia con l'esecuzione della prima riga, che è piena di no-ops. Quindi, quando l'IP colpisce il bordo nord-est, si sposta nell'angolo più a sinistra (il )), dove inizia il codice effettivo.

Prima di iniziare, una parola sul layout della memoria di Hexagony. È un po 'come il nastro di Brainfuck sugli steroidi. Infatti, non è un nastro, ma è una griglia esagonale stessa (un uno infinito), dove ogni bordo ha un valore intero, che inizialmente è 0 (e al contrario di serie Brainfuck, i valori sono firmati interi precisione arbitraria). Per questo programma, utilizzeremo quattro bordi:

inserisci qui la descrizione dell'immagine

Ci calcolare il fattoriale sul bordo A , il conto alla rovescia il nostro ingresso sul bordo C e memorizziamo un'altra copia dell'ingresso (per il modulo) sul bordo D . B viene utilizzato come bordo temporaneo per i calcoli.

Il puntatore di memoria (MP) inizia sul bordo A e punta verso nord (questo è importante per spostare l'MP in giro). Ora ecco il primo bit del codice:

)}?}=&{

)incrementi bordo A per 1la base del fattoriale. }fa girare la MP a destra, ovvero si sposta sul bordo C (puntando a nord-est). Qui leggiamo l'input come intero con ?. Quindi prendiamo un'altra svolta a destra sul bordo D con }. =inverte il MP, in modo da puntare al vertice in comune con C . &copia il valore da C (input) a D - il valore viene copiato da sinistra perché il valore corrente è non positivo (zero). Infine, facciamo la MP prendere un sinistro tornare indietro a C con {.

Successivamente, <è tecnicamente un ramo, ma sappiamo che il valore corrente è positivo, quindi l'IP girerà sempre a destra verso >. Un ramo colpito dal lato agisce come uno specchio, in modo tale che il PI si muove di nuovo orizzontalmente, verso il (che decrementa il valore C .

Il prossimo ramo, in realtà< è un ramo ora. Questo è il modo in cui passiamo da giù a . Mentre il valore corrente in C è positivo, l'IP fa una svolta a destra (per eseguire il loop). Una volta premuto zero, invece, girerà a sinistra.n-11

Diamo un'occhiata al loop "body". L' |sono specchi semplici, la >e <sono utilizzati anche come specchi di nuovo. Ciò significa che il corpo del circuito reale si riduce a

}=)&}=*}=

}sposta l'MP sul bordo B , =inverte la sua direzione per affrontare il vertice ABC . )incrementa il valore: questo è rilevante solo per la prima iterazione, dove il valore di B è ancora zero: vogliamo assicurarci che sia positivo, in modo che l'istruzione successiva &copi il vicino giusto , cioè A , cioè il valore corrente del fattoriale calcolo, in B .

}quindi sposta il MP in A , lo =inverte nuovamente per affrontare il vertice comune. *moltiplica entrambi vicini, cioè i bordi B e C e memorizza il risultato in A . Infine, ne abbiamo un altro }=per tornare a C , ancora di fronte al vertice ABC .

Spero che si può vedere come questo calcola il fattoriale di n-1a A .

Quindi ora lo abbiamo fatto, il contatore di loop in C è zero. Vogliamo quadrare il fattoriale e quindi prendere il modulo con l'input. Ecco cosa fa questo codice:

&}=*{&'%!@

Dal momento che C è pari a zero, &copia il vicino di sinistra, vale a dire il fattoriale in A . }=*sposta a B e memorizza il prodotto delle due copie del fattoriale (cioè il quadrato) in B . {torna a C , ma non inverte l'MP. Sappiamo che il valore corrente è ora positiva, in modo &ingresso copie da D in C . 'il deputato all'indietro verso destra, vale a dire su A . Ricordate, il quadrato del fattoriale è in B e l'ingresso è in C . Quindi %calcola (n-1)!^2 % n, esattamente quello che stiamo cercando.!stampa il risultato come intero (0 o 1) e @termina il programma.


Va bene, ma quella era la versione non golfata. E la versione golfizzata? Devi sapere altre due cose su Hexagony:

  1. I bordi si avvolgono. Se l'IP colpisce un bordo dell'esagono, salta al bordo opposto. Questo è ambiguo quando l'IP colpisce un angolo dritto, quindi colpire un angolo funge anche da ramo: se il valore corrente è positivo, l'IP salta al bordo della griglia alla sua destra, altrimenti a quello alla sua sinistra.
  2. In realtà ci sono 6 IP. Ognuno di essi inizia in un angolo diverso, spostandosi lungo il bordo in senso orario. Solo uno di questi è attivo alla volta, il che significa che puoi semplicemente ignorare gli altri 5 IP se non li desideri. È possibile passare al successivo IP (in senso orario) con ]e al precedente con [. (Puoi anche sceglierne uno specifico con #, ma è per un'altra volta.)

Ci sono anche alcuni nuovi comandi in esso: \e /sono simili ai mirror |e ~moltiplica il valore corrente per -1.

Quindi, come si traduce la versione non golfata in quella giocata a golf? Il codice di configurazione lineare )}?}=&{e la struttura del loop di base sono disponibili qui:

        ) } ? } .  ->
       . . . . . .
      . . . . . . .
     . . . . . . . .
->  . = & { . < . . .
     . . . . . > ( <
      . . . . . . .
       . . . . . .
        . . . . .

Ora il corpo del loop attraversa alcune volte i bordi, ma soprattutto, il calcolo effettivo viene passato all'IP precedente (che inizia nell'angolo sinistro, spostandosi a nord-est):

        ) . . . .
       = . . . ] .
      } = . . } . .
     ~ . / . * . . .
    . . . . . . . . .
     . . . = . > ( <
      . . } . = . .
       . & . \ [ .
        . . . . .

Dopo aver rimbalzato dal ramo verso sud-est, l'IP si avvolge attorno al bordo verso i due =nell'angolo in alto a sinistra (che, insieme, sono una no-op), quindi rimbalza su /. Il ~inverte il segno del valore di corrente, che è importante per iterazioni successive. L'IP avvolge nuovamente lo stesso bordo e infine colpisce [dove il controllo viene passato all'altro IP.

Questo ora esegue ciò ~}=)&}=*}che annulla la negazione e quindi esegue solo il corpo del loop non golfato (meno il =). Alla fine colpisce ]quali mani controllano di nuovo l'IP originale. (Nota che la prossima volta lo eseguiremo in questo IP, inizierà da dove era stato interrotto, quindi prima colpirà l'angolo. Abbiamo bisogno che il valore corrente sia negativo affinché l'IP possa tornare indietro al bordo nord-ovest invece di quello sud-est.)

Una volta che l'IP originale riprende il controllo, rimbalza su \, esegue il rimanente =e quindi colpisce >per alimentare l'iterazione del ciclo successivo.

Ora la parte davvero pazza: cosa succede quando termina il ciclo?

        ) . . . .
       . ( . . ] =
      . . ' . } . }
     . . . % * . . &
    . . . . . . . . .
     . . . = | . . <
      . . } ! . . .
       . & @ . . .
        . . . . .

L'IP si sposta a nord-est dalla <e si avvolge attorno alla diagonale nord-est. Quindi finisce sullo stesso percorso di esecuzione del loop body ( &}=*}]). Il che è piuttosto interessante, perché questo è esattamente il codice che vogliamo eseguire a questo punto, almeno se ne aggiungiamo un altro =}(perché }=}equivale a {). Ma come fa questo a non entrare nuovamente nel ciclo precedente? Perché ]cambia al prossimo IP che ora è l'IP (finora inutilizzato) che inizia nell'angolo in alto a destra, spostandosi a sud-ovest. Da lì, l'IP continua lungo il bordo, si avvolge nell'angolo in alto a sinistra, si sposta in basso sulla diagonale, rimbalza su |e termina @mentre esegue il bit finale del codice lineare:

=}&)('%!@

( )(Naturalmente è una no-op - ho dovuto aggiungere il (perché )era già lì.)

Accidenti ... che casino ...


Bello! Quanto è nuovo questo? Inoltre, potresti voler creare una pagina esolangs ogni volta che ottieni una versione stabile
mbomb007,

18
@ mbomb007 Ho implementato la lingua due giorni fa (e l'ho progettata due o tre giorni prima). E sì, aggiungerò sicuramente una pagina esolangs, ma penso che le specifiche non siano ancora stabili al 100% (ci sono ancora 3 comandi non assegnati per esempio). Quando avrò la sensazione che sia più stabile, lo aggiungerò sia agli esolang che al nostro meta post.
Martin Ender,

Sotto l'esagono espanso si avvolge nell'angolo più a sinistra (il 1) . Di cosa 1stai parlando lì?
mbomb007,

@ mbomb007 riparato. Il )solito era un 1.
Martin Ender,

5
+1 solo per il livello di dettaglio nella tua spiegazione di come funziona. Se più lingue arrivassero con un esempio che dettagliasse più persone potrebbero usarle: D
jdarling

66

Pyth, 4 byte

}QPQ

Stampe Trueo False.


12
So che questo è vecchio ma ora puoi farlo anche così: P_Q e risparmia 1 byte.
drobilc,

14
Ora è possibile conP_
Blue

3
@drobilc Puoi tagliare la Q, come EOF quando la funzione si aspetta un argomento, usa l'input
Stan Strum

55

Retina , 16 byte

^(?!(..+)\1+$)..

Provalo online!

Cominciamo con un classico: rilevare i numeri primi con una regex . L'input deve essere dato in modo unario , usando qualsiasi carattere stampabile ripetuto. La suite di test include una conversione da decimale a unario per comodità.

Un programma Retina costituito da una sola riga tratta quella riga come regex e stampa il numero di corrispondenze trovate nell'input, che sarà 0per numeri compositi e numeri 1primi.

Il lookahead assicura che l'input non sia composito: il backtracking tenterà ogni possibile sottostringa (di almeno 2 caratteri) (..+), quindi il lookahead tenta di abbinare il resto dell'input ripetendo ciò che è stato catturato qui. Se ciò è possibile, ciò significa che l'ingresso ha un divisore maggiore di 1, ma che è inferiore a se stesso. In tal caso, il lookahead negativo causa un errore nella corrispondenza. Per i numeri primi non esiste tale possibilità e la partita continua.

L'unico problema è che anche questo lookahead accetta 1, quindi lo escludiamo abbinando almeno due caratteri con ...


Questa è in realtà un'espressione irregolare, poiché i numeri primi non formano un linguaggio regolare.
PyRulez,

@PyRulez La maggior parte dei sapori regex del mondo reale sono molto più potenti del concetto teorico di espressioni regolari. Ho migliorato la formulazione però.
Martin Ender,

1
I più potenti motori "regex" all'aperto adesso hanno un potere di riconoscimento pari a quello di un automa limitato lineare. Regex di problemi standard, ricorsione dei modelli, lookhead illimitato e lookbehind illimitato sono tutto ciò che serve per l'analisi sensibile al contesto (anche se i riferimenti indietro e tali in genere aiutano a complicare l'analisi efficiente), e alcuni li hanno tutti. Non farmi nemmeno avviare dai motori che ti consentono di incorporare il codice in regex.
eaglgenes101,

52

CJam, 4 byte

qimp

CJam ha un operatore integrato per i test di primalità.


18
In alternativa:limp
Sp3000,

43
pimpmio cjam.
Flawr,

12
pimpè oggettivamente più magnaccia
MickLH,

1
Puoi anche farel~mp
Cows quack

12
@Cyoce, qlegge una riga di input, la ianalizza come un numero intero ed mpè integrata. CJam ha due gruppi di built-in a due caratteri: iniziano quelli "estesi" ee iniziano quelli "matematici"m
Peter Taylor

48

HTML + CSS, 254 + n max * 28 byte

Possiamo verificare la primalità usando espressioni regolari. Mozilla ha @document, che è definito come:

@document [ <url> | url-prefix(<string>) | domain(<string>) | regexp(<string>) ]# {
  <group-rule-body>
}

Per filtrare elementi tramite CSS in base all'URL corrente. Questo è un singolo passaggio, quindi dobbiamo fare due passaggi:

  1. Ricevi input dall'utente. Questo input deve in qualche modo essere riflesso nell'URL corrente.
  2. Rispondi all'utente nel minor numero di codice possibile.

1. Ottenere input

Il modo più breve che posso immaginare per ottenere l'input e trasferirlo nell'URL è un GETmodulo con caselle di controllo. Per la regex, abbiamo solo bisogno di una stringa univoca per contare le apparenze.

Quindi iniziamo con questo (61 byte):

<div id=q><p id=r>1<p id=s>0</div><form method=GET action=#q>

Abbiamo due <p>s univoci per indicare se il numero inserito è un numero primo (1) o meno (0). Definiamo anche la forma e la sua azione.

Seguito da n max caselle di controllo con lo stesso nome (n max * 28 byte):

<input type=checkbox name=i>

Seguito dall'elemento submit (34 byte):

<input name=d value=d type=submit>

2. Visualizza risposta

Abbiamo bisogno del CSS (159 byte) per selezionare il <p>da visualizzare (1 o 0):

#q,#s,#q:target{display:none}#q:target{display:block}@-moz-document regexp(".*\\?((i=on&)?|(((i=on&)(i=on&)+?)\\4+))d=d#q$"){#s{display:block}#r{display:none}}

»Provalo su codepen.io (solo firefox)


12
+1: Questo è il mio abuso preferito di sempre dell'HTML e il tipo di cose che mi fanno amare il codegolf.
cat

Questo è certamente interessante, ma non sono sicuro che soddisfi le regole di questa sfida. In particolare, non penso che sia conforme al tuo algoritmo [...] dovrebbe, in teoria, funzionare con numeri arbitrariamente grandi. Non potresti usare una regex anche sul valore di un campo di input?
Dennis,

@Dennis Forse. Probabilmente anche. Ma ciò non risolverebbe il problema che hai citato. Lascio qui una voce non competitiva, perché questa è la sfida più tematica per questo.
mınxomaτ il

Perchè no? Se si dispone di un numero in unario in un campo di input, il codice non dipenderà più dal numero massimo.
Dennis,

5
Hm, ci ho pensato un po 'di più, e non c'è davvero alcuna differenza tra avere solo x caselle di controllo e un interprete che ha solo numeri di y-bit. Ignora il mio commento precedente.
Dennis,


40

Esagonia , 28 byte

Dato che Etoplay mi ha assolutamente criticato su questa domanda , ho sentito di dover superare la sua unica altra risposta .

?\.">"!*+{&'=<\%(><.*.'(@>'/

Provalo online!

Uso il teorema di Wilson, come ha fatto Martin nella sua risposta : dato n, ho prodotto(n-1!)² mod n

Qui si è svolto il programma:

   ? \ . "
  > " ! * +
 { & ' = < \
% ( > < . * .
 ' ( @ > ' /
  . . . . .
   . . . .

Ed ecco la versione leggibile :

Molto leggibile

Spiegazione:

Il programma prevede tre fasi principali: inizializzazione , fattoriale e output .

Il modello di memoria di Hexagony è una griglia esagonale infinita. Sto usando 5 posizioni di memoria, come mostrato in questo diagramma:

Memoria

Mi riferirò a queste posizioni (e agli Integer memorizzati in esse) dalle loro etichette su quel diagramma.

Inizializzazione:

Inizializzazione

Il puntatore dell'istruzione ( IP ) inizia nell'angolo in alto a sinistra, andando verso est. Il puntatore di memoria ( MP ) inizia da IN .

Innanzitutto, ?legge il numero dall'input e lo memorizza in IN . L' IP rimane sul percorso blu, riflesso da \. La sequenza "&(sposta l' MP indietro e verso sinistra (su A ), copia il valore da IN ad A e lo decrementa.

L' IP esce quindi da un lato dell'esagono e rientra dall'altro lato (sul percorso verde). Esegue '+che sposta il deputato di B e copia quello che era in A . <reindirizza l' IP verso ovest.

Fattoriale:

Calcolo il fattoriale in un modo specifico, in modo che quadrarlo sia facile. Conservo n-1!in B e C come segue.

Fattoriale

Il puntatore dell'istruzione inizia sul percorso blu, in direzione est.

='inverte la direzione della MP e lo sposta all'indietro C . Ciò equivale a {=ma avere il punto in =cui è stato utile in seguito.

&{copia il valore da A a C , poi sposta il MP di nuovo a A . L' IP segue quindi il percorso verde, senza fare nulla, prima di raggiungere il percorso rosso, colpendo \e andando sul percorso arancione.

Con (>, abbiamo decrementa A e reindirizzare l' IP Oriente. Qui colpisce un ramo: <. Per la A positiva , continuiamo lungo il percorso arancione. Altrimenti l' IP viene diretto a nord-est.

'*sposta il MP a B e memorizza A * C a B . Questo è (n-1)*(n-2)dove era l'input iniziale n. L' IP ritorna quindi nel ciclo iniziale e continua a diminuire e moltiplicarsi fino a quando A raggiunge 0. (informatica n-1!)

NB : Sui loop seguenti, &memorizza il valore da B in C , poiché C ha un valore positivo memorizzato in esso ora. Questo è fondamentale per il calcolo fattoriale.

Produzione:

Produzione

Quando A raggiunge 0. Il ramo dirige invece l' IP lungo il percorso blu.

=*inverte la MP e memorizza il valore di B * C in A . Quindi l' IP esce dall'esagono e rientra nel percorso verde; in esecuzione "%. Questo sposta l' MP in OUT e calcola A mod IN , o (n-1!)² mod n.

Quanto segue {"funge da no-op, poiché si annullano a vicenda. !stampa il risultato finale e *+'(sono eseguiti prima della terminazione: @.

Dopo l'esecuzione, (con un input di 5) la memoria appare così:

Memory2

Le splendide immagini del flusso di controllo sono state realizzate utilizzando Hexagony Coloror di Timwi .

Grazie a Martin Ender per aver generato tutte le immagini, poiché non sono riuscito a farlo sul mio PC.


Cosa stai usando per questi diagrammi di memoria? Ho visto IDE esoterico ma non sono riuscito a farlo funzionare ...
NieDzejkob

@NieDzejkob farai meglio a chiedere a Martin in chat, visto che li ha fatti comunque per me.
H.Piz

@NieDzejkob Sì, il diagramma di memoria può essere esportato da EsoIDE. chat.stackexchange.com/rooms/27364/… se vuoi chattare ancora su questo.
Martin Ender,

34

Mornington Crescent , 2448 byte

Siamo tornati a Londra!

Take Northern Line to Bank
Take Circle Line to Bank
Take District Line to Parsons Green
Take District Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upney
Take District Line to Hammersmith
Take Circle Line to Victoria
Take Victoria Line to Seven Sisters
Take Victoria Line to Victoria
Take Circle Line to Victoria
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Aldgate
Take Circle Line to Aldgate
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Aldgate
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take Circle Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Bank
Take Circle Line to Victoria
Take Circle Line to Temple
Take Circle Line to Aldgate
Take Circle Line to Aldgate
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Pinner
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Pinner
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Pinner
Take Metropolitan Line to Aldgate
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Victoria
Take Circle Line to Aldgate
Take Circle Line to Victoria
Take Circle Line to Victoria
Take District Line to Upminster
Take District Line to Embankment
Take Circle Line to Embankment
Take Northern Line to Angel
Take Northern Line to Moorgate
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Aldgate
Take Circle Line to Aldgate
Take Circle Line to Cannon Street
Take District Line to Upney
Take District Line to Cannon Street
Take District Line to Acton Town
Take District Line to Acton Town
Take Piccadilly Line to Russell Square
Take Piccadilly Line to Hammersmith
Take Piccadilly Line to Russell Square
Take Piccadilly Line to Ruislip
Take Piccadilly Line to Ruislip
Take Metropolitan Line to Preston Road
Take Metropolitan Line to Aldgate
Take Circle Line to Aldgate
Take Circle Line to Cannon Street
Take Circle Line to Aldgate
Take Circle Line to Aldgate
Take Metropolitan Line to Preston Road
Take Metropolitan Line to Moorgate
Take Circle Line to Moorgate
Take Northern Line to Mornington Crescent

Timwi è stato così gentile da implementare le stazioni di flusso di controllo Templee Angelin IDE esoterico , nonché aggiungere input e analisi di interi alla specifica del linguaggio.

Questo è probabilmente migliore del "Ciao, mondo!", Perché questa volta ho scritto uno script CJam per aiutarmi a trovare il percorso più breve tra due stazioni. Se vuoi usarlo (anche se non so perché qualcuno vorrebbe ...), puoi usare l'interprete online . Incolla questo codice:

"Mornington Crescent"
"Cannon Street"
]qN/{'[/0=,}$:Q;{Q{1$#!}=\;_oNo'[/1>{']/0="[]"\*}%}%:R;NoQ{R\f{f{\#)}:+}:*},N*

Qui le prime due linee sono le stazioni che si desidera controllare. Inoltre, incolla il contenuto di questo pastebin nella finestra di input.

L'output mostrerà quali linee sono disponibili nelle due stazioni, quindi un elenco di tutte le stazioni che collegano le due, ordinate in base alla lunghezza dei nomi delle stazioni. Li mostra tutti, perché a volte è meglio usare un nome più lungo, o perché consente una linea più breve, o perché la stazione è speciale (come Bank o Temple) in modo che tu voglia evitarlo. Ci sono alcuni casi limite in cui due stazioni non sono collegate da nessuna altra stazione (in particolare, le linee Metropolitan e District non si incrociano mai), nel qual caso dovrai scoprire qualcos'altro. ;)

Per quanto riguarda l'attuale codice MC, si basa sull'approccio fattoriale quadrato come molte altre risposte perché MC ha moltiplicazione, divisione e modulo. Inoltre, ho pensato che un singolo loop sarebbe stato conveniente.

Un problema è che i loop sono loop do-while e il decremento e l'incremento sono costosi, quindi non posso facilmente calcolare (n-1)!(per n > 0). Invece, sto calcolando n!e poi divido per nalla fine. Sono sicuro che esiste una soluzione migliore per questo.

Quando ho iniziato a scrivere questo, ho pensato che archiviare -1in Hammersmith sarebbe stata una buona idea in modo da poter diminuire più a buon mercato, ma alla fine questo potrebbe essere costato più di quanto risparmiato. Se trovo la pazienza di rifare questo, potrei provare a tenere un -1giro in Upminster invece di poter usare Hammersmith per qualcosa di più utile.


10
London turing è completo?
Rohan Jhunjhunwala,

1
@RohanJhunjhunwala probabilmente
Martin Ender,

Wow! Adoro vedere domande ben ponderate. Mi piace soprattutto vedere le domande in cui devi scrivere un programma per scrivere un programma.
Rohan Jhunjhunwala,

27

Brachylog (V2), 1 byte

Provalo online!

Brachylog (V1), 2 byte

#p

Questo utilizza il predicato incorporato #p - Prime, che limita il suo input come numero primo.

Brachylog è il mio tentativo di realizzare una versione di Prolog di Code Golf, ovvero un linguaggio di golf di codice dichiarativo che utilizza il backtracking e l'unificazione.

Soluzione alternativa senza built-in: 14 byte

ybbrb'(e:?r%0)

Ecco una ripartizione del codice sopra:

y            The list [0, …, Input]
bbrb         The list [2, …, Input - 1]
'(           True if what's in the parentheses cannot be proven; else false
     e           Take an element from the list [2, …, Input - 1]
     :?r%0       The remainder of the division of the Input but that element is 0
)

1
Potresti voler modificare anche la versione di Brachylog 2 nel post, ora che la sintassi è più corta di byte.

1
@ ais523 Vero, fatto.
Fatalizza

La risposta di Brachylog 2 postdatare la sfida?
Scott Milner,

1
@ScottMilner Sì, ma questo è esplicitamente consentito in questa sfida: "A differenza delle nostre solite regole, sentiti libero di usare una lingua (o versione linguistica) anche se è più recente di questa sfida"
Fatalizza

26

Haskell, 49 byte

Usando il corollario di xnor al teorema di Wilson :

main=do n<-readLn;print$mod(product[1..n-1]^2)n>0

Non sarebbe più breve da fare main=interact$\n-> ...?
John Dvorak,

2
Controintuitivamente no! Considera che ne avresti bisogno interact...readda qualche parte, il che lo rende molto più lungo del semplice readLn. Spesso la donotazione può essere più concisa di quanto ci si possa aspettare, soprattutto quando l'alternativa è una lambda.
Lynn,

24

Labirinto , 29 byte

1
?
:
}  +{%!@
(:'(
 } {
 :**

Legge un numero intero da STDIN e genera ((n-1)!)^2 mod n. Il teorema di Wilson è piuttosto utile per questa sfida.

Il programma inizia nell'angolo in alto a sinistra, a partire dal 1quale moltiplica la parte superiore dello stack per 10 e aggiunge 1. Questo è il modo in cui Labyrinth costruisce grandi numeri, ma poiché le pile di Labyrinth sono piene di zero, l'effetto finale è come se noi appena premuto un 1.

?quindi legge nda STDIN e lo :duplica. }passa nallo stack ausiliario, da utilizzare alla fine per il modulo. (quindi diminuisce ne siamo pronti per iniziare a calcolare il fattoriale quadrato.

Il nostro secondo :(duplicato) è ad un incrocio, e qui entrano in gioco le caratteristiche del flusso di controllo di Labyrinth. Ad un incrocio dopo l'esecuzione di un'istruzione, se la parte superiore dello stack è positiva giriamo a destra, per negativo giriamo a sinistra e per zero andiamo dritto. Se provi a girare ma colpisci un muro, Labyrinth ti fa invece girare nell'altra direzione.

Perché n = 1, poiché la parte superiore della pila è ndiminuita, o 0, andiamo dritto. Abbiamo quindi colpito un no-op 'seguito da un altro decremento (che ci mette a -1. Questo è negativo, quindi giriamo a sinistra, eseguendo +più ( -1 + 0 = -1), {per ntornare indietro dallo stack ausiliario a main e %modulo ( -1 % 1 = 0). Quindi eseguiamo l'output con !e terminiamo con @.

Perché n > 1, al secondo :, giriamo a destra. Spostiamo quindi }il contatore del loop copiato sullo stack ausiliario, dupliciamo :e moltipliciamo due volte **, prima di spostare indietro il contatore {e diminuirlo (. Se siamo ancora positivi proviamo a girare a destra ma non ci riusciamo, quindi Labyrinth ci fa invece girare a sinistra, continuando il ciclo. Altrimenti, la parte superiore dello stack è il nostro contatore loop che è stato ridotto a 0, che +aggiungiamo al nostro calcolato ((n-1)!)^2. Infine, torniamo nindietro con {poi modulo %, output !e termina @.

Ho detto che 'è una no-op, ma può anche essere utilizzata per il debug. Corri con la -dbandiera per vedere lo stato dello stack ogni volta che 'viene passato!


2
La quadratura del fattoriale è un trucco davvero interessante :)
Lynn,

@Mauris Grazie! Devo dare credito dove è dovuto però - ho visto per la prima volta il trucco usato da xnor qui
Sp3000

5
Yay, la prima risposta di Labyrinth non scritta da me! :)
Martin Ender,

24

Utilità Bash + GNU, 16

  • 4 byte salvati grazie a @Dennis

  • 2 byte salvati grazie a @Lekensteyn

factor|awk NF==2

L'input è una riga presa da STDIN. L'output è una stringa vuota per falso e una stringa non vuota per verità. Per esempio:

$ ./pr.sh <<< 1
$ ./pr.sh <<< 2
2: 2
$ ./pr.sh <<< 3
3: 3
$ ./pr.sh <<< 4
$

2
Bene, ho imparato un altro coreutil. Puoi factor|awk NF==2
rimuovere

@Lekensteyn - grazie - per qualche motivo mi sono perso il tuo commento prima :)
Digital Trauma

Avrei pubblicato qualcosa in qualche modo simile, solo più a lungo e senza AWK. Ben fatto.
David Conrad,

21

Java, 126 121 byte

Immagino che abbiamo bisogno di una risposta Java per il tabellone ... quindi ecco un semplice ciclo di divisione di prova:

class P{public static void main(String[]a){int i=2,n=Short.valueOf(a[0]);for(;i<n;)n=n%i++<1?0:n;System.out.print(n>1);}}

Come al solito per Java, il requisito del "programma completo" lo rende molto più grande di quanto sarebbe se fosse una funzione, dovuta principalmente alla mainfirma.

In forma estesa:

class P{
    public static void main(String[]a){
        int i=2,n=Short.valueOf(a[0]);
        for(;i<n;)
            n=n%i++<1?0:n;
        System.out.print(n>1);
    }
}

Modifica: risolto e regolato da Peter nei commenti. Grazie!


Buggy: segnala che 1è primo. Altrimenti ci sarebbe un risparmio di 4 caratteri rimuovendo pe dicendofor(;i<n;)n=n%i++<1?0:n;System.out.print(n>0);
Peter Taylor,

2
class P{public static void main(String[]a){int i=2,n=Short.valueOf(a[0]);for(;i<n;)n=n%i++<1?0:n;System.out.print(n>1);}}Opere OTOH
Peter Taylor,

6
cambiando la linea 3 in 'long i = 2, n = Long.valueOf (a [0]); `non comporta alcun cambiamento di lunghezza ma una gamma più ampia di input validi.
James K Polk,

4
Invece di .valueOfte puoi usare new, come in new Short(a[0]), o new Long(a[0]), che è un po 'più breve.
ECS

3
È possibile salvare 4 byte utilizzando un'interfaccia e rilasciando il publicmodificatore.
RamenChef,

18

Brain-Flak , 112 108 byte

({}[()]){((({})())<>){{}<>(({}<(({}[()])()<>)>)<>)<>{({}[()]<({}[()]<({}())>)>{(<()>)}{})}{}{}}}<>{{}}([]{})

Provalo online!

Come funziona

Inizialmente, il primo stack conterrà un numero intero positivo n , il secondo stack sarà vuoto.

Iniziamo decrementando n come segue.

(
  {}      Pop n.
  [()]    Yield -1.
)       Push n - 1.

n = 1

Se n = 1 è zero, il ciclo while

{
  ((({})())<>)
  {
    {}<>(({}<(({}[()])()<>)>)<>)<>{({}[()]<({}[()]<({}())>)>{(<()>)}{})}{}{}
  }
}

viene ignorato del tutto. Infine, viene eseguito il codice rimanente.

<>    Switch to the second stack (empty).
{}    Pop one of the infinite zeroes at the bottom.
{<>}  Switch stacks while the top on the active stack is non-zero. Does nothing.
(
  []    Get the length of the active stack (0).
  {}    Pop another zero.
)     Push 0 + 0 = 0.

n> 1

Se n - 1 è diverso da zero, entriamo nel ciclo che n = 1 salta. Non è un ciclo "reale"; il codice viene eseguito una sola volta. Raggiunge quanto segue.

{                   While the top of the active stack is non-zero:
  (
    (
      ({})                Pop and push n - 1.
      ()                  Yield 1.
    )                   Push n - 1 + 1 = n.
    <>                  Switch to the second stack. Yields 0.
  )                   Push n + 0 = n.
                      We now have n and k = n - 1 on the first stack, and n on
                      the second one. The setup stage is complete and we start
                      employing trial division to determine n's primality.
  {                   While the top of the second stack is non-zero:
    {}                  Pop n (first run) or the last modulus (subsequent runs),
                        leaving the second stack empty.
    <>                  Switch to the first stack.
    (
      (
        {}                  Pop n from the first stack.
        <
          (
            (
              {}              Pop k (initially n - 1) from the first stack.
              [()]            Yield -1.
            )               Push k - 1 to the first stack.
            ()              Yield 1.
            <>              Switch to the second stack.
          )               Push k - 1 + 1 = k on the second stack.
        >               Yield 0.
      )               Push n + 0 = n on the second stack.
      <>              Switch to the first stack.
    )               Push n on the first stack.
    <>              Switch to the second stack, which contains n and k.
                    The first stack contains n and k - 1, so it is ready for
                    the next iteration.
    {({}[()]<({}[()]<({}())>)>{(<()>)}{})}{}{}  Compute and push n % k.
  }               Stop if n % k = 0.
}               Ditto.

n% k viene calcolato utilizzando l'algoritmo del modulo a 42 byte dalla mia risposta al test di divisibilità .

Infine, interpretiamo i risultati per determinare la primalità di n .

<>    Switch to the first stack, which contains n and k - 1, where k is the
      largest integer that is smaller than n and divides n evenly.
      If (and only if) n > 1 is prime, k = 1 and (thus) k - 1 = 0.
{     While the top of the first stack is non-zero:
  {}    Pop it.
}     This pops n if n is prime, n and k - 1 if n is composite.
(
  []    Yield the height h of the stack. h = 1 iff n is prime).
  {}    Pop 0.
)     Push h + 0 = h.

2
Non è necessario far apparire gli ultimi 0 in pila, poiché 1 in verità è sufficiente; puoi salvare due byte in quel modo rimuovendo l'ultimo {}.
Steven H.

1
Sono strappato. Da un lato, la domanda dice che l' output dovrebbe consistere esclusivamente in un valore di verità o falsità ed 1 0è due valori. D'altra parte, accetteremmo le matrici fintanto che il linguaggio le considera veritiere o false e più oggetti stack sono la cosa più vicina alle matrici Brain-Flak. Potrebbe valere la pena portarlo a meta.
Dennis,

Ho verificato con il creatore di Brain-Flak che 1 0è vero. chat.stackexchange.com/transcript/message/32746241#32746241
Steven H.


17

R, 37 29 byte

n=scan();cat(sum(!n%%1:n)==2)

Utilizza la divisione di prova. scan()legge un numero intero da STDIN e cat()scrive su STDOUT.

Generiamo un vettore di lunghezza ncostituito dagli interi da 1 a nmodulo n. Testiamo se ognuno è 0 negando ( !), che restituisce un valore logico vero quando il numero è 0 e falso quando è maggiore di 0. La somma di un vettore logico è il numero di elementi veri e per i numeri primi ci aspettiamo gli unici moduli diversi da zero sono 1 e n, quindi, prevediamo che la somma sia 2.

8 byte salvati grazie a flodel!


Con f=function(x)sum(!x%%1:x)==2te puoi farlo in 28 byte.
Mutador,

2
@ AndréMuta Per questa sfida, tutti gli invii devono essere programmi completi anziché solo funzioni. Grazie per il suggerimento però.
Alex A.

17

TI-BASIC, 12 byte

2=sum(not(fPart(Ans/randIntNoRep(1,Ans

Abbastanza diretto. randIntNoRep(dà una permutazione casuale di tutti i numeri interi da 1 a Ans.

Questo piega un po 'le regole; perché gli elenchi in TI-BASIC sono limitati a 999 elementi che ho interpretato

supponiamo che l'input possa essere memorizzato nel tipo di dati

nel senso che si può presumere che tutti i tipi di dati accettino l'input. OP concorda con questa interpretazione.

Una soluzione a 17 byte che funziona fino a 10 ^ 12 o giù di lì:

2=Σ(not(fPart(Ans/A)),A,1,Ans

@toothbrush TI-BASIC è un linguaggio tokenizzato , quindi ogni token qui è un byte, ad eccezione del randIntNoRep(quale due.
Lirtosiast,

+1 Ah, non ho mai visto TL-BASIC prima d'ora. Grazie per avermelo fatto sapere
Spazzolino da denti

1
Anche se è un po 'ingiusto, non è vero ...? Dovrei scrivere un linguaggio da golf che richiede solo 1-4 byte (l'ID della domanda) e quindi i parametri. Sceglierà la risposta migliore in una lingua comprensibile, la eseguirà (passando qualsiasi parametro) e restituirà il risultato ... Mi chiedo se questo infrange le regole? :-)
Spazzolino

@toothbrush A difesa di TI-BASIC: per l'interprete, non è più ingiusto dei comandi a un carattere di Pyth e CJam, e TI-BASIC è più leggibile.
lirtosiast,

1
Vero. Non mi piacciono questi tipi di lingue, poiché le soluzioni in quasi tutte le altre lingue sono più lunghe ... anche se di recente ho battuto CJam con VB6 ! : -]
Spazzolino da denti

15

PARI / GP, 21 byte

print(isprime(input))

Funziona con input incredibilmente grandi, perché questo tipo di cose è fatto per PARI / GP.


6
isprimefa una prova di primalità APR-CL, quindi rallenta un po 'quando gli input diventano molto grandi. ispseudoprime(input)esegue un probabile test primo AES BPSW, che sarà molto più veloce per oltre 100 cifre. Ancora nessun controesempio noto dopo 35 anni. La versione 2.1 e precedenti di Pari, precedenti al 2002, utilizza un metodo diverso che può facilmente dare risultati falsi, ma nessuno dovrebbe usarlo.
DanaJ,

15

TI-BASIC, 24 byte

Si noti che i programmi TI-Basic utilizzano un sistema token, quindi il conteggio dei caratteri non restituisce il valore byte effettivo del programma.

Valorizza la risposta di Thomas Kwa , è superiore.

:Prompt N
:2
:While N≠1 and fPart(N/Ans
:Ans+1
:End
:N=Ans

Campione:

N=?1009
                         1
N=?17
                         1
N=?1008
                         0
N=?16
                         0

Ora ritorna 0se non un numero primo o 1se lo è.


3
La radice quadrata non è solo un'ottimizzazione che in realtà non è necessaria affinché il programma sia corretto?
Martin Ender,

Perché dovresti dividere per due?
Geobits,

Adoro sempre le risposte TI-BASIC.
Grant Miller,

15

Stack Cats , 62 + 4 = 66 byte

*(>:^]*(*>{<-!<:^>[:((-<)<(<!-)>>-_)_<<]>:]<]]}*<)]*(:)*=<*)>]

Deve essere eseguito con i -lnflag della riga di comando (quindi +4 byte). Stampa 0per numeri composti e 1per numeri primi.

Provalo online!

Penso che questo sia il primo programma Stack Cats non banale.

Spiegazione

Una rapida introduzione su Stack Cats:

  • Stack Cats opera su un nastro infinito di pile, con una testina che punta verso uno stack corrente. Ogni stack viene inizialmente riempito con una quantità infinita di zeri. Generalmente ignorerò questi zeri nella mia formulazione, quindi quando dico "il fondo dello stack" intendo il valore inferiore a zero e se dico "lo stack è vuoto" intendo che ci sono solo zeri.
  • Prima dell'avvio del programma, a -1viene inserito nello stack iniziale, quindi viene inserito l'intero input. In questo caso, a causa del -nflag, l'input viene letto come un numero intero decimale.
  • Alla fine del programma, lo stack corrente viene utilizzato per l'output. Se c'è una -1in fondo, verrà ignorata. Ancora una volta, a causa della -nbandiera, i valori dalla pila vengono semplicemente stampati come numeri interi decimali separati da avanzamento riga.
  • Stack Cats è un linguaggio di programma reversibile: ogni parte di codice può essere annullata (senza che Stack Cats tenga traccia di una cronologia esplicita). Più specificamente, per invertire qualsiasi parte di codice, è sufficiente rispecchiarlo, ad esempio <<(\-_)diventa (_-/)>>. Questo obiettivo di progettazione pone restrizioni piuttosto severe su quali tipi di operatori e costrutti di flusso di controllo esistono nel linguaggio e quali tipi di funzioni è possibile calcolare sullo stato della memoria globale.
  • Per finire, ogni programma Stack Cats deve essere auto-simmetrico. Potresti notare che questo non è il caso del codice sorgente sopra. Questo è lo scopo della -lbandiera: rispecchia implicitamente il codice a sinistra, usando il primo carattere per il centro. Quindi il programma attuale è:

    [<(*>=*(:)*[(>*{[[>[:<[>>_(_-<<(-!>)>(>-)):]<^:>!->}<*)*[^:<)*(>:^]*(*>{<-!<:^>[:((-<)<(<!-)>>-_)_<<]>:]<]]}*<)]*(:)*=<*)>]
    

Programmare in modo efficace con l'intero codice è estremamente banale e non intuitivo e non ha ancora capito come un essere umano possa farlo. Abbiamo forzato brutalmente questo programma per compiti più semplici, ma non saremmo riusciti ad avvicinarci a quello a mano. Fortunatamente, abbiamo trovato un modello di base che ti consente di ignorare metà del programma. Anche se questo è sicuramente non ottimale, è attualmente l'unico modo noto per programmare in modo efficace in Stack Cats.

Quindi in questa risposta, il modello di detto modello è questo (c'è una certa variabilità nel modo in cui viene eseguito):

[<(...)*(...)>]

All'avvio del programma, il nastro dello stack si presenta così (per input 4, diciamo):

     4    
... -1 ...
     0
     ^

Le [mosse top dello stack a sinistra (e la testa nastro lungo) - chiamiamo questa "spinta". E <muove la testina da sola. Quindi dopo i primi due comandi, abbiamo questa situazione:

...   4 -1 ...
    0 0  0
    ^

Ora (...)c'è un loop che può essere usato abbastanza facilmente come condizionale: il loop viene inserito e lasciato solo quando la parte superiore dello stack corrente è positiva. Dato che attualmente è zero, saltiamo l'intera prima metà del programma. Ora il comando centrale è *. Questo è semplicemente XOR 1, cioè attiva o disattiva il bit meno significativo della parte superiore dello stack, e in questo caso trasforma il 0in un 1:

... 1 4 -1 ...
    0 0  0
    ^

Ora incontriamo l'immagine speculare di (...). Questa volta la cima della pila è positivo e ci fa inserire il codice. Prima di esaminare cosa succede tra parentesi, lasciami spiegare come andremo a finire alla fine: vogliamo assicurarci che alla fine di questo blocco, abbiamo di nuovo la testina su un valore positivo (in modo che il ciclo termina dopo una singola iterazione e viene utilizzato semplicemente come un condizionale lineare), che la pila a destra mantiene l'uscita e che il diritto pila di che detiene un -1. In tal caso, lasciamo il loop, ci >spostiamo sul valore di output e lo ]spingiamo su in -1modo da avere uno stack pulito per l'output.

Questo è quanto. Ora tra parentesi possiamo fare tutto ciò che vogliamo controllare la primalità purché ci assicuriamo di sistemare le cose come descritto nel paragrafo precedente alla fine (cosa che può essere facilmente fatta con qualche spinta e movimento della testina). Per prima cosa ho provato a risolvere il problema con il teorema di Wilson, ma alla fine ho superato i 100 byte, perché il calcolo fattoriale quadrato è in realtà piuttosto costoso in Stack Cats (almeno non ho trovato una soluzione breve). Quindi sono andato invece con la divisione di prova e questo è risultato molto più semplice. Diamo un'occhiata al primo bit lineare:

>:^]

Hai già visto due di quei comandi. Inoltre, :scambia i primi due valori dello stack corrente e ^XORs il secondo valore nel valore superiore. Questo rende :^un modello comune per duplicare un valore su uno stack vuoto (tiriamo uno zero sopra il valore e poi trasformiamo lo zero in 0 XOR x = x). Quindi, dopo questo, la sezione del nostro nastro appare così:

         4    
... 1 4 -1 ...
    0 0  0
         ^

L'algoritmo della divisione di prova che ho implementato non funziona per l'input 1, quindi in questo caso dovremmo saltare il codice. Possiamo facilmente mappare 1per 0e tutto il resto a valori positivi con *, quindi ecco come lo facciamo:

*(*...)

Cioè ci trasformiamo 1in 0, saltiamo una grande parte del codice se otteniamo effettivamente 0, ma all'interno annulliamo immediatamente il valore in *modo da recuperare il nostro valore di input. Dobbiamo solo assicurarci di nuovo che finiamo con un valore positivo alla fine delle parentesi in modo che non inizino il ciclo. All'interno del condizionale, spostiamo uno stack a destra con il >e quindi avviamo il ciclo principale della divisione di prova:

{<-!<:^>[:((-<)<(<!-)>>-_)_<<]>:]<]]}

Le parentesi graffe (al contrario delle parentesi) definiscono un diverso tipo di loop: è un loop do-while, il che significa che corre sempre per almeno un'iterazione. L'altra differenza è la condizione di terminazione: quando si entra nel ciclo Stack Cat ricorda il valore massimo dello stack corrente ( 0nel nostro caso). Il ciclo verrà quindi eseguito fino a quando questo stesso valore non verrà nuovamente visualizzato al termine di un'iterazione. Questo è conveniente per noi: in ogni iterazione semplicemente calcoliamo il resto del prossimo potenziale divisore e lo spostiamo su questo stack su cui stiamo iniziando il loop. Quando troviamo un divisore, il resto è 0e il ciclo si interrompe. Proveremo i divisori a partire da n-1e poi li diminuiremo fino a 1. Ciò significa che a) sappiamo che questo terminerà quando raggiungiamo1al più tardi eb) possiamo quindi determinare se il numero è primo o no controllando l'ultimo divisore che abbiamo provato (se è 1, è un numero primo, altrimenti non lo è).

Andiamo a questo. C'è una breve sezione lineare all'inizio:

<-!<:^>[:

Sai cosa fanno ormai la maggior parte di quelle cose. I nuovi comandi sono -e !. Stack Cats non ha operatori di incremento o decremento. Tuttavia ha -(negazione, cioè moltiplicare per -1) e !(NOT bit a bit, cioè moltiplicare per -1e decrementare). Questi possono essere combinati in un incremento !-o in decremento -!. Quindi decrementiamo la copia nsopra -1, quindi ne facciamo un'altra copia na sinistra, quindi prendiamo il nuovo divisore di prova e lo mettiamo sotto n. Quindi sulla prima iterazione, otteniamo questo:

      4       
      3       
... 1 4 -1 ...
    0 0  0
      ^

Su ulteriori iterazioni, la 3volontà verrà sostituita con il successivo divisore di prova e così via (mentre le due copie di navranno sempre lo stesso valore a questo punto).

((-<)<(<!-)>>-_)

Questo è il calcolo del modulo. Poiché i loop terminano su valori positivi, l'idea è di iniziare -ne aggiungere ripetutamente il divisore di prova dfino a quando non si ottiene un valore positivo. Una volta fatto, sottraiamo il risultato de questo ci dà il resto. Il punto difficile qui è che non possiamo semplicemente mettere uno -nin cima allo stack e iniziare un ciclo che aggiunge d: se la parte superiore dello stack è negativa, il ciclo non verrà inserito. Tali sono i limiti di un linguaggio di programmazione reversibile.

Quindi, per aggirare questo problema, iniziamo con nin cima allo stack, ma lo neghiamo solo alla prima iterazione. Ancora una volta, sembra più semplice di quanto sembri ...

(-<)

Quando la parte superiore della pila è positiva (cioè solo sulla prima iterazione), la neghiamo con -. Tuttavia, non possiamo semplicemente farlo (-)perché non lasceremo il ciclo fino a quando non verrà -applicato due volte. Quindi spostiamo una cella a sinistra <perché sappiamo che c'è un valore positivo lì (il 1). Bene, quindi ora abbiamo negato in modo affidabile nsulla prima iterazione. Ma abbiamo un nuovo problema: ora la testina del nastro si trova in una posizione diversa rispetto alla prima iterazione rispetto a tutte le altre. Dobbiamo consolidarlo prima di procedere. Il prossimo <sposta la testina a sinistra. La situazione alla prima iterazione:

        -4       
         3       
...   1  4 -1 ...
    0 0  0  0
    ^

E sulla seconda iterazione (ricorda che ora abbiamo aggiunto duna volta -n):

      -1       
       3       
... 1  4 -1 ...
    0  0  0
    ^

Il condizionale successivo unisce nuovamente questi percorsi:

(<!-)

Alla prima iterazione la testina del nastro punta a zero, quindi questo viene saltato del tutto. Su ulteriori iterazioni, la testina del nastro punta verso una, quindi eseguiamo questa operazione, ci spostiamo a sinistra e incrementiamo la cella lì. Poiché sappiamo che la cella inizia da zero, ora sarà sempre positiva in modo da poter lasciare il ciclo. Questo assicura che finiamo sempre due stack a sinistra dello stack principale e ora possiamo tornare indietro >>. Quindi alla fine del ciclo modulo facciamo -_. Lo sai già -. _è sottrarre ciò che ^è XOR: se la parte superiore dello stack è ae il valore sottostante è bsostituito ada b-a. Da quando abbiamo negata aperò, -_sostituisce acon b+a, aggiungendo cosìd nel nostro totale corrente.

Dopo che il ciclo termina (abbiamo raggiunto un valore positivo), il nastro si presenta così:

        2       
        3       
... 1 1 4 -1 ...
    0 0 0  0
        ^

Il valore più a sinistra potrebbe essere qualsiasi numero positivo. In effetti, è il numero di iterazioni meno uno. Ora c'è un altro breve bit lineare:

_<<]>:]<]]

Come ho detto prima, dobbiamo sottrarre il risultato dper ottenere il resto ( 3-2 = 1 = 4 % 3), quindi lo facciamo _ancora una volta. Successivamente, dobbiamo ripulire lo stack che abbiamo incrementato a sinistra: quando proviamo il divisore successivo, deve essere nuovamente zero, perché la prima iterazione funzioni. Quindi ci spostiamo lì e spingiamo quel valore positivo sull'altro stack di supporto con <<]e poi torniamo al nostro stack operativo con un altro >. Ci fermiamo dcon :e lo rimettiamo sul -1con ]e poi spostiamo il resto sul nostro stack condizionale con <]]. Questa è la fine del ciclo della divisione di prova: questo continua fino a quando non otteniamo un resto zero, nel qual caso lo stack a sinistra contienenil più grande divisore (diverso da n).

Al termine del ciclo, c'è poco *<prima di unire 1nuovamente i percorsi con l'input . La *trasforma semplicemente lo zero in una 1, che avremo bisogno di un po ', e poi ci spostiamo il divisore con <(in modo che siamo sulla stessa pila come per l'ingresso 1).

A questo punto aiuta a confrontare tre diversi tipi di input. Innanzitutto, il caso speciale in n = 1cui non abbiamo fatto nessuna delle cose della divisione di prova:

         0    
... 1 1 -1 ...
    0 0  0
         ^

Quindi, nel nostro esempio precedente n = 4, un numero composto:

    2           
    1    2 1    
... 1 4 -1 1 ...
    0 0  0 0
         ^

E infine, n = 3un numero primo:

    3           
    1    1 1    
... 1 3 -1 1 ...
    0 0  0 0
         ^

Quindi, per i numeri primi, abbiamo uno 1su questo stack e per i numeri compositi abbiamo 0un numero positivo o maggiore di 2. Trasformiamo questa situazione in 0o 1abbiamo bisogno con il seguente pezzo finale di codice:

]*(:)*=<*

]spinge questo valore verso destra. Quindi *viene utilizzato per semplificare notevolmente la situazione condizionale: alternando il bit meno significativo, trasformiamo 1(primo) in 0, 0(composito) in valore positivo 1e tutti gli altri valori positivi rimarranno positivi. Ora dobbiamo solo distinguere tra 0positivo e positivo. Ecco dove ne usiamo un altro (:). Se la parte superiore dello stack è 0(e l'input era un numero primo), questo viene semplicemente ignorato. Ma se la parte superiore dello stack è positiva (e l'input era un numero composto) questo lo scambia con il 1, in modo che ora abbiamo 0per composito e1per i numeri primi - solo due valori distinti. Certo, sono l'opposto di ciò che vogliamo produrre, ma questo è facilmente risolvibile con un altro *.

Ora non resta che ripristinare il modello di stack previsto dal nostro framework circostante: testina di stampa su un valore positivo, risultato in cima allo stack a destra e un singolo -1nello stack a destra di quello . Questo è ciò che =<*serve. =scambia le cime delle due pile adiacenti, spostando in tal modo la -1a destra del risultato, ad es. per inserire 4nuovamente:

    2     0       
    1     3       
... 1 4   1 -1 ...
    0 0 0 0  0
          ^

Quindi ci spostiamo a sinistra con <e trasformiamo quello zero in uno con *. E quello è quello.

Se vuoi approfondire il funzionamento del programma, puoi utilizzare le opzioni di debug. Aggiungi il -dflag e inserisci "dove vuoi vedere lo stato di memoria corrente, ad esempio in questo modo , oppure usa il -Dflag per ottenere una traccia completa dell'intero programma . In alternativa, è possibile utilizzare EsotericIDE di Timwi che include un interprete Stack Cats con un debugger passo-passo.


3
>:^]dovrebbe essere il logo ufficiale Stack Cats
Alex A.

14

Haskell, 54 byte

import Data.Numbers.Primes
main=readLn>>=print.isPrime

Non c'è molto da spiegare.


1
Lo stesso punteggio può essere raggiunto (anche se in modo molto inefficiente) senza librerie esterne, usando il teorema di Wilson:main=do n<-readLn;print$n>1&&mod(product[1..n-1]+1)n<1
Lynn,

9
Possiamo anche fare più brevi: main=do n<-readLn;print$mod(product[1..n-1]^2)n>0è di 49 byte.
Lynn,

4
@Mauris: Nizza. Si prega di pubblicarlo come risposta separata.
nimi,

14

Rubino, 15 + 8 = 23 byte

p$_.to_i.prime?

Esecuzione di esempio:

bash-4.3$ ruby -rprime -ne 'p$_.to_i.prime?' <<< 2015
false

Heheh, sapevo che ci sarebbe stato un incasso in Ruby da qualche parte, ma non potevo preoccuparmi di cercarlo, quindi ho risposto in C. +1.
Level River St

@steveverrill, lo sapevo perché è stato di grande aiuto per Project Euler.
arte

14

JavaScript, 39 36 byte

Risparmiato 3 byte grazie alle produzioni ETH:

for(i=n=prompt();n%--i;);alert(1==i)

Visualizza vero per un numero primo, falso altrimenti.

Il per ciclo test ogni numero i da n-1 finché i è un divisore. Se il primo divisore trovato è 1, allora è un numero primo.


Soluzione precedente (39 byte):

for(i=n=prompt();n%--i&&i;);alert(1==i)

Come è stato lasciato un test non necessario:

for(i=2,n=prompt();n%i>0&&i*i<n;i++);alert(n%i>0) //49: Simple implementation: loop from 2 to sqrt(n) to test the modulo.
for(i=2,n=prompt();n%i>0&&i<n;i++);alert(n==i)    //46: Replace i*i<n by i<n (loop from 2 to n) and replace n%i>0 by n==i
for(i=2,n=prompt();n%i&&i<n;i++);alert(n==i)      //44: Replace n%i>0 by n%i
for(i=2,n=prompt();n%i&&i++<n;);alert(n==i)       //43: Shorten loop increment
for(i=n=prompt();n%--i&&i>0;);alert(1==i)         //41: Loop from n to 1. Better variable initialization.
for(i=n=prompt();n%--i&&i;);alert(1==i)           //39: \o/ Replace i>0 by i

Ho pubblicato solo la soluzione da 39 byte perché la migliore risposta JavaScript era già di 40 byte.


2
Benvenuto in Programmazione di puzzle e codice golf!
Dennis,

2
Bella risposta! In &&irealtà non fa nulla in questo programma, quindi puoi rimuoverlo.
ETHproductions

dovrebbe aggiungere n>1alla condizione finale, tuttavia, se non si desidera 1essere primi.
Tito

1
@Titus Se l'ingresso è 1il ciclo for lo farà n%--iuna volta: 1%0ritorna NaNe arresta il ciclo. Quando alertviene chiamato iè già uguale a 0così 1==iritorna false.
Hedi,

2
i <2 (e alcuni testi)
Scheintod

13

Lumache, 122

L'input dovrebbe essere dato in unario. Le cifre possono essere qualsiasi combinazione di caratteri tranne le nuove righe.

^
..~|!(.2+~).!~!{{t.l=.r=.}+!{t.!.!~!{{r!~u~`+(d!~!.r~)+d~,.r.=.(l!~u~)+(d!~l~)+d~,.l.},l=(.!.)(r!~u~)+(d!~!.r~)+d~,.r.!.

In questo linguaggio di corrispondenza dei motivi 2D, lo stato del programma è costituito esclusivamente dalla posizione della griglia corrente, dall'insieme di celle che sono state abbinate e dalla posizione nel codice del motivo. È anche illegale viaggiare in una piazza abbinata. È difficile, ma è possibile archiviare e recuperare informazioni. La restrizione a viaggiare su una cella abbinata può essere superata con il backtracking, il teletrasporto ( t) e le asserzioni ( =, !) che lasciano la griglia non modificata dopo il completamento.

Fattorizzazione di 25

La fattorizzazione per un numero composto dispari inizia marcando un insieme di celle reciprocamente non adiacenti (blu nel diagramma). Quindi, da ciascuna cella gialla, il programma verifica che ci sia un numero uguale di celle non blu su entrambi i lati di quella blu adiacente spostando avanti e indietro tra i due lati. Il diagramma mostra questo modello per una delle quattro celle gialle che devono essere controllate.

Codice annotato:

^                         Match only at the first character
..~ |                     Special case to return true for n=2
!(.2 + ~)                 Fail for even numbers
. !~                      Match 1st character and fail for n=1
!{                        If the bracketed pattern matches, it's composite.
  (t. l=. r=. =(.,~) )+   Teleport to 1 or more chars and match them (blue in graphic)
                          Only teleport to ones that have an unmatched char on each side.
                          The =(.,~) is removed in the golfed code. It forces the
                          teleports to proceed from left to right, reducing the
                          time from factorial to exponential.
  !{                      If bracketed pattern matches, factorization has failed.
    t . !. !~             Teleport to a square to the left of a blue square (yellow in diagram)
    !{                    Bracketed pattern verifies equal number of spaces to
                          the left or right of a blue square.
      {              
        (r!~ u~)+         Up...
        (d!~!. r~)+       Right...
        d~,               Down...
        . r . =.          Move 1 to the right, and check that we are not on the edge;
                          otherwise d~, can fall off next iteration and create and infinite loop
        (l!~ u~)+         Up...
        (d!~ l~)+         Left...
        d ~,              Down...
        . l .             Left 1
      } ,                 Repeat 0 or more times
      l  =(. !.)          Check for exactly 1 unused char to the left
      (r!~ u~)+           Up...
      (d!~!. r~)+         Right...
      d ~,                Down...
      . r . !.
    }
  }
}

13

C, 67 byte

i,n;main(p){for(scanf("%d",&i),n=i;--i;p=p*i*i%n);putchar(48+p%n);}

Stampe !1(un valore falso, secondo la definizione di Peter Taylor ) 0 se (n-1)!^2 == 0 (mod n)e 1altrimenti.

EDIT : Dopo alcune discussioni in chat, puts("!1"+p%n)sembra essere considerato un po 'economico, quindi l'ho sostituito. Il risultato è più lungo di un byte.

EDIT : risolto per grandi input.

Soluzioni più brevi

56 byte : come raccomandato nei commenti di pawel.boczarski, ho potuto prendere l'input in unario leggendo il numero di argomenti della riga di comando:

p=1,n;main(i){for(n=--i;--i;p=p*i*i%n);putchar(48+p%n);}

invocare il programma come

$ ./a.out 1 1 1 1 1
1                        <-- as 5 is prime

51 byte : se si consente "output" mediante codici di ritorno:

p=1,n;main(i){for(n=--i;--i;p=p*i*i%n);return p%n;}

La soluzione potrebbe essere abbreviata utilizzando la rappresentazione unaria (numero di argomenti della riga di comando), come indicato nella mia soluzione. È possibile radere alcuni byte durante la chiamata scanf.
pawel.boczarski,

puts("!1"+p%n)Come hai mai potuto fare a+bper i char*valori?
Erik the Outgolfer,

Se la stringa "!1"inizia all'indirizzo a, allora a+1troverai la stringa "1".
Lynn,

@Lynn Oh, ho pensato che fosse per la concatenazione (sì, meglio lasciare che a strcat(const char*,const char*).)
Erik l'Outgolfer

Potresti cambiare p=p*i*i%ninp*=i*i%n
Albert Renshaw il

12

Python 3, 59 byte

Ora utilizza input()invece gli argomenti della riga di comando. Grazie a @Beta Decay

n=int(input())
print([i for i in range(1,n)if n%i==0]==[1])

Prendere input usando input()sarebbe molto più breve
Decadimento beta

Grazie, ho già scritto usando input (), ma ho dimenticato di aggiornare la mia risposta. Grazie ancora!
uno20001

4
52 byte: n=m=int(input()),print(all(n%m for m in range(2,n)))
John Lione

1
Sei serio. Hai speso 25 caratteri extra per un eccesso di velocità quadratico? Qui odiamo i byte . Trascorriamo ogni ora, minuto e secondo della nostra vita per sbarazzarci del diciannovesimo byte. (Sto scherzando. Ma non facciamo ottimizzazioni di tempo che aumentano la durata del programma.)
CalculatorFeline

2
Usa n%i<1invece.
Erik the Outgolfer,

12

APL, 40 13 byte

2=+/0=x|⍨⍳x←⎕

Divisione prova con lo stesso algoritmo come la mia risposta R . Assegniamo xall'input da STDIN ( ) e otteniamo il resto per xdiviso per ogni numero intero da 1 a x. Ogni resto viene confrontato con 0, che ci fornisce un vettore di uno e zero che indica quali numeri interi si dividono x. Questo è sommato usando +/per ottenere il numero di divisori. Se questo numero è esattamente 2, significa che gli unici divisori sono 1 ex , quindi, xè primo.



12

Metaprogrammazione di modelli C ++. 166 131 119 byte.

Il codice viene compilato se la costante è un numero primo e non viene compilata se composita o 1.

template<int a,int b=a>struct t{enum{x=t<a,~-b>::x+!(a%b)};};
template<int b>struct t<b,0>{enum{x};};
int _[t<1>::x==2];

(tutte le nuove righe, tranne quella finale, sono eliminate nella versione "reale").

Immagino che "la mancata compilazione" sia un valore di ritorno falso per un linguaggio di metaprogrammazione. Si noti che non si collega (quindi se lo si alimenta come un numero primo, si otterranno errori di collegamento) come un programma C ++ completo.

Il valore da testare è il numero intero sull'ultima "riga".

esempio dal vivo .

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.