Condividiamo il cluster principale?


10

Il gruppo primo di un numero intero N maggiore di 2 è definita come la coppia formata dalla massima primo strettamente inferiore rispetto N e il primo e disponibilità strettamente maggiore di N .

Nota che seguendo la definizione sopra, se l'intero è un numero primo stesso, allora il suo cluster primo è la coppia dei numeri primi che lo precedono e succedono .

Compito

Dati due numeri interi N , M ( N, M ≥ 3 ), emette un valore di verità / falsità in base al fatto che N e M abbiano lo stesso cluster primo.

Questo è , quindi l'obiettivo è ridurre il numero di byte il più possibile. Pertanto, vince il codice più breve in ogni linguaggio di programmazione .

Casi di prova / esempi

Ad esempio, il cluster principale di 9 è [7, 11], perché:

  • 7 è il primo più alto strettamente inferiore a 9 e
  • 11 è il primo più basso strettamente superiore a 9 .

Allo stesso modo, il cluster primo di 67 è [61, 71](nota che 67 è un numero primo).

Coppie vere

8, 10
20, 22
65, 65
73, 73
86, 84
326, 318
513, 518

Coppie di Falsy

4, 5
6, 8
409, 401
348, 347
419, 418
311, 313
326, 305

I valori di verità / falsità devono essere due valori distinti o si può definire una mappatura dall'output del loro programma a un valore di verità / falsità e produrre (potenzialmente infinitamente) molti valori diversi?
Jonathan Frech,

@JonathanFrech Truthy / Falsy per definizione del problema decisionale , non necessariamente coerente ma distinto e verità / falsità
Mr. Xcoder

Risposte:


14

Gelatina , 6 4 3 5 4 byte

rÆPE

Provalo online! oppure Prova tutti i casi di test .

Come funziona

rÆPE    Main link. Arguments: N, M
r       Yield the range of integers between N and M, inclusive.
 ÆP     For each integer, yield 1 if it is prime, 0 otherwise.
   E    Yield 1 if all items are equal (none in the range were prime,
        or there's only one item).

Funziona perché due numeri hanno cluster primi diversi se c'è un numero primo tra loro, o uno dei due numeri è esso stesso primo; a meno che entrambi i numeri siano uguali, nel qual caso Erestituisce 1comunque (tutti gli elementi in un array a elemento singolo sono uguali).


7
La fonte dei tuoi programmi non sembra amichevole ...
Stan Strum,

2

Perl 6 , 52 byte

{[eqv] @_».&{(($_...0),$_..*)».first(*.is-prime)}}

Provalo

Allargato:

{  # bare block lambda with implicit slurpy input 「@_」

  [eqv]               # see if each sub list is equivalent

    @_».&{            # for each value in the input

      (

        ( $_ ... 0 ), # decreasing Seq
          $_ ..  *    # Range

      )».first(*.is-prime) # find the first prime from both the Seq and Range

    }
}


2

Rubino , 57 54 byte

->n,m{[*n..m,*m..n].all?{|x|?1*x=~/^(11+)\1+$/}||n==m}

Provalo online!

Utilizza l'orribile test di primge regex dalla mia risposta (che avevo dimenticato fino a quando non ho cliccato su di esso) alla domanda correlata Questo numero è un numero primo? . Dato che abbiamo N, M ≥ 3, il controllo per 1 può essere rimosso dal pattern, rendendo il conteggio dei byte inferiore rispetto all'uso del built-in.

Nota: il test di primalità regex è patologicamente, esilarantemente inefficiente. Credo che sia almeno O (n!), Anche se non ho tempo di capirlo adesso. Ci vollero dodici secondi per controllare 100.001 e stava macinando per cinque o dieci minuti su 1.000.001 prima che lo annullassi. Utilizzare / abusare a proprio rischio.


1
A quel ritmo è probabile . Sai, 100001! = 2824257650254427477772164512240315763832679701040485762827423875723843380680572028502730496931545301922349718873479336571104510933085749261906300669827923360329777024436472705878118321875571799283167659071802605510878659379955675120386166847407407122463765792082065493877636247683663198828626954833262077780844919163487776145463353109634071852657157707925315037717734498612061347682956332369235999129371094504360348686870713719732258380465223614176068 ... (Warning: The output exceeded 128 KiB and was truncated.)ci vorranno millenni per correre.
user202729

2

Retina , 58 byte

\b(.+)¶\1\b

.+
$*
O`
+`\b(1+)¶11\1
$1¶1$&
A`^(11+)\1+$
^$

Provalo online! Spiegazione:

\b(.+)¶\1\b

Se entrambi gli ingressi sono uguali, è sufficiente eliminare tutto e passare all'uscita 1 alla fine.

.+
$*

Converti in unario.

O`

Ordina in ordine.

+`\b(1+)¶11\1
$1¶1$&

Espandere in un intervallo di tutti i numeri.

A`^(11+)\1+$

Elimina tutti i numeri composti.

^$

Se non sono rimasti numeri, emettere 1, altrimenti 0.


2

PARI / GP, 28 byte

v->s=Set(v);#s<2||!primes(s)

Provalo online con tutti i casi di test!

Restituisce 0o 1(valori abituali "booleani" PARI / GP).

Spiegazione:

vdeve essere un vettore (o un vettore di colonna o un elenco) con i due numeri Ne Mcome coordinate. Per esempio [8, 10]. Quindi ssarà il "set" composto da questi numeri, che è un vettore a una coordinata (se N==M), o un vettore a due coordinate con voci ordinate altrimenti.

Quindi se il numero #sdi coordinate in sè solo uno, otteniamo 1(verità). Altrimenti, primesrestituirà un vettore di tutti i numeri primi nell'intervallo chiuso da s[1]a s[2]. La negazione !di ciò darà 1se il vettore è vuoto, mentre la negazione di un vettore di una o più voci diverse da zero (qui uno o più numeri primi) darà 0.


2

JavaScript (ES6), 57 56 byte

Accetta input nella sintassi del curry (a)(b). Restituisce 0o 1.

a=>b=>a==b|!(g=k=>a%--k?g(k):k<2||a-b&&g(a+=a<b||-1))(a)

Casi test

Come?

a => b =>                 // given a and b
  a == b |                // if a equals b, force success right away
  !(g = k =>              // g = recursive function taking k
    a % --k ?             //   decrement k; if k doesn't divide a:
      g(k)                //     recursive calls until it does
    :                     //   else:
      k < 2 ||            //     if k = 1: a is prime -> return true (failure)
      a - b &&            //     if a equals b: neither the original input integers nor
                          //     any integer between them are prime -> return 0 (success)
      g(a += a < b || -1) //     else: recursive call with a moving towards b
  )(a)                    // initial call to g()

2

R , 63 46 byte

-17 di Giuseppe

function(a,b)!sd(range(numbers::isPrime(a:b)))

Provalo online!

Applicazione abbastanza semplice della soluzione Jelly di ETHProductions . Il principale asporto interessante è che con i vettori booleani R any(x)==all(x)è equivalente min(x)==max(x).



Inoltre, poiché min(x)==max(x)equivale a verificare che tutti gli elementi in is_prime(a:b)siano uguali, possiamo usare quest'ultimo trucco per ridurlo a 46 byte con primesil numberspacchetto o .
Giuseppe,

2

C (gcc), 153 146 byte

i,B;n(j){for(B=i=2;i<j;)B*=j%i++>0;return!B;}
#define g(l,m,o)for(l=o;n(--l););for(m=o;n(++m););
a;b;c;d;h(e,f){g(a,b,e)g(c,d,f)return!(a-c|b-d);}

-7 da Jonathan Frech

Definisce una funzione hche accetta due se intrestituisce 1verità e 0falsità

Provalo online!

n è una funzione che restituisce 1 se il suo argomento non è primo.

g è una macro che imposta il suo primo e secondo argomento sul primo primo minore di e maggiore di (rispettivamente) il suo terzo argomento

hfa gper entrambi gli ingressi e controlla se le uscite sono uguali.


return a==c&&b==d;può essere return!(a-c|b-d);.
Jonathan Frech,


@JonathanFrech Risolto il collegamento TIO.
pizzapants184


1

APL (Dyalog Unicode) , 18 + 16 = 34 24 byte

CY'dfns'
∧/=/4 ¯4∘.pco

Provalo online!

Grazie ad Adám per 10 byte.

La linea ⎕CY'dfns'( C OP Y ) è necessario per importare i dfns ( d inamico f unctio ns ) raccolta, inclusa con difetto Dyalog APL installazioni.

Come funziona:

∧/=/4 ¯4∘.pco  Main function. This is a tradfn body.
               The 'quad' takes the input (in this case, 2 integers separated by a comma.
          pco   The 'p-colon' function, based on p: in J. Used to work with primes.
    4 ¯4∘.      Applies 4pco (first prime greater than) and ¯4pco (first prime smaller than) to each argument.
  =/            Compares the two items on each row
∧/              Applies the logical AND between the results.
                This yields 1 iff the prime clusters are equal.




0

Mathematica, 39 27 26 byte

Equal@@#~NextPrime~{-1,1}&

Allargato:

                         &  # pure function, takes 2-member list as input
       #~NextPrime~{-1,1}   # infix version of NextPrime[#,{-1,1}], which
                            # finds the upper and lower bounds of each
                              argument's prime clusters
Equal@@                     # are those bounds pairs equal?

Uso:

Equal@@#~NextPrime~{-1,1}& [{8, 10}]
(*  True  *)

Equal@@#~NextPrime~{-1,1}& [{6, 8}]
(*  False  *)

Equal@@#~NextPrime~{-1,1}& /@ {{8, 10}, {20, 22}, {65, 65}, 
    {73, 73}, {86, 84}, {326, 318}, {513, 518}}
(*  {True, True, True, True, True, True, True}  *)

Equal@@#~NextPrime~{-1,1}& /@ {{4, 5}, {6, 8}, {409, 401}, 
    {348, 347}, {419, 418}, {311, 313}}
(*  {False, False, False, False, False, False}  *)

Contributi: -12 byte di Jenny_mathy , -1 byte di Martin Ender


Questo controlla solo il prossimo primo. Prova NextPrime [#, {- 1,1}]
J42161217

@Jenny_mathy: vedo che hai ragione. Catturato dal test case "348, 347", che ora ha dimostrato di passare.
Eric Towers,

27 byte: Equal@@NextPrime[#,{-1,1}]&accetta come input [{N,M}]o se si desidera mantenere l'input originale utilizzare questi 30 byte:Equal@@NextPrime[{##},{-1,1}]&
J42161217

@Jenny_mathy: Beh, ... l'input specificato è due numeri interi, non un elenco, quindi ...
Eric Towers,

1
@EricTowers che prende un elenco va bene . Inoltre, è possibile salvare un byte utilizzando la notazione infissa #~NextPrime~{-1,1}.
Martin Ender,

0

J , 15 byte

-:&(_4&p:,4&p:)

Come funziona:

   &(           ) - applies the verb in the brackets to both arguments
            4&p:  - The smallest prime larger than y
      _4&p:       - The largest prime smaller than y
           ,      - append
 -:               - matches the pairs of the primes

Provalo online!

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.