È un numero primo / esponente costante consecutivo?


22

Qualche tempo fa, ho dato un'occhiata alla fattorizzazione primaria di 27000:

27000 = 2 3 × 3 3 × 5 3

Ci sono due cose speciali a riguardo:

  • numero primo consecutivo : i numeri primi sono consecutivi: 2 è il primo primo, 3 è il 2 ° primo, 5 è il 3 ° primo.
  • esponente costante : l'esponente è lo stesso per ogni numero primo (sempre 3)

Espresso matematicamente:

Un numero intero x è un numero primo / esponente costante consecutivo se esistono numeri interi nettamente positivi n , k , m tali che x = p n m × p n +1 m × ... × p n + k m , dove p j è il j -esimo primo

Il tuo compito è verificare se un numero intero positivo soddisfa queste condizioni.

Ingresso:

Un numero intero positivo> 1, in qualsiasi forma ragionevole.

Produzione:

Uno di due valori, almeno uno dei quali deve essere costante, che indica se l'ingresso è un numero primo / esponente costante consecutivo.

Custodie per bordi:

  • i numeri primi sono veritieri, poiché la fattorizzazione per prime p è p 1
  • altri numeri che possono essere scritti come p m dove p è un numero primo sono anche truthy.

Regole:

  • Si applicano scappatoie standard.
  • Non preoccuparti dell'overflow di numeri interi, ma i numeri fino a 255 devono funzionare.
  • Vince il codice più breve in byte.

Casi test:

Truthy:

2
3
4
5
6
7
8
9
11
13
15
27000
456533

Falsy:

10
12
14
72
10000000

Ecco uno script Python che genera alcuni casi di test.

Il fatto di aver accettato una risposta non significa che la sfida sia finita; il vincitore può ancora cambiare!


Probabilmente potresti arrivare da questo punto di vista generando un elenco di tutti questi numeri e controllando se l'input è nell'elenco
Ingegnere Toast

@EngineerToast Ci sono infiniti numeri di verità però.
Alexis Olson,

@AlexisOlson Certo, ma un prodotto finito che può essere gestito come numero intero da molte lingue.
Ingegnere Toast,

La vostra espressione matematica ha Pj non riguarda la x = Pn^mparte.
Suppongo

@Veskah n ha un valore specifico (indice del primo primo che divide x ), quindi dire che Pn è l' n -esimo primo è imbarazzante se vuoi anche implicare che Pn + 1 è l' n + 1 -primo.
Dennis,

Risposte:


13

05AB1E , 4 byte

Ó0ÛË

Provalo online!

Spiegazione

Ó     # get a list of prime exponents
 0Û   # remove leading zeroes
   Ë  # all remaining elements are equal

ÎÓKËè tutto ciò che riesco a pensare a parte questo, bello ... Stavo pensando, ßma fa il contrario di quello che pensavo.
Magic Octopus Urn

7

Regex (ECMAScript), 276 205 201 193 189 byte

Il confronto delle molteplicità (esponenti) di diversi fattori primi è un problema interessante per la risoluzione con la regex di ECMAScript: la mancanza di riferimenti secondari che persistono attraverso iterazioni di un ciclo rende una sfida contare qualsiasi cosa. Anche se è possibile contare il carattere numerico in questione, spesso un approccio più indiretto rende migliore il golf.

Come con gli altri miei post regex ECMA, darò un avviso spoiler: consiglio vivamente di imparare a risolvere i problemi matematici unari in regex ECMAScript. È stato un viaggio affascinante per me e non voglio rovinarlo per nessuno che potrebbe potenzialmente provarlo da solo, in particolare quelli con un interesse per la teoria dei numeri. Vedi questo post precedente per un elenco di problemi raccomandati consecutivamente con tag spoiler da risolvere uno per uno.

Quindi non leggere oltre se non vuoi che qualche magia regex unaria avanzata venga viziata per te . Se vuoi fare un tentativo per capire da solo questa magia, ti consiglio vivamente di iniziare risolvendo alcuni problemi nella regex di ECMAScript come indicato in quel post collegato sopra.

Il payload principale di una regex che ho sviluppato in precedenza si è rivelato molto applicabile a questa sfida. Questa è la regex che trova i primi della massima molteplicità . La mia prima soluzione è stata molto lunga, e in seguito l'ho portata a tappe gradualmente , prima riscrivendola per usare il lookahead molecolare , e poi riportandola sul semplice ECMAScript usando una tecnica avanzata per aggirare la mancanza di un look molecolare , e successivamente giocare a golf per essere molto più piccolo della semplice soluzione ECMAScript originale.

La parte di quella regex che si applica a questo problema è il primo passo, che trova Q, il più piccolo fattore di N che condivide tutti i suoi fattori primi. Una volta che abbiamo questo numero, tutto ciò che dobbiamo fare per dimostrare che N è un "numero esponente costante" è dividere N per Q fino a quando non possiamo più; se il risultato è 1, tutti i numeri primi sono di uguale molteplicità.

Dopo aver inviato una risposta usando il mio algoritmo precedentemente sviluppato per trovare Q, mi sono reso conto che poteva essere calcolato in un modo completamente diverso: Trova il più grande fattore quadrato libero di N (usando lo stesso algoritmo del mio numero di Carmichael regex ). A quanto pare, ciò non pone alcuna difficoltà * in termini di aggirare la mancanza di lookahead molecolare e lookbehind di lunghezza variabile (non è necessario attingere alla tecnica avanzata precedentemente utilizzata), ed è più breve di 64 byte! Inoltre, elimina la complessità del trattamento di N e primi N quadrati liberi da quadrati come diversi casi speciali, eliminando altri 7 byte da questa soluzione.

(Rimangono ancora altri problemi che richiedono la tecnica avanzata precedentemente utilizzata qui per eseguire il golf down del calcolo di Q, ma attualmente nessuno di questi è rappresentato dai miei post PPCG.)

Ho messo il test di molteplicità prima del test dei numeri primi consecutivi perché quest'ultimo è molto più lento; mettere test che possono fallire più rapidamente prima rende il regex più veloce per un input distribuito uniformemente. È anche meglio il golf per dirla prima, perché utilizza più backreferenze (che costerebbero di più se fossero a due cifre).

Sono stato in grado di eliminare 4 byte da questa regex (193 → 189) usando un trucco trovato da Grimy che può ridurre ulteriormente la divisione nel caso in cui il quoziente sia garantito maggiore o uguale al divisore.

^(?=(|(x+)\2*(?=\2$))((?=(xx+?)\4*$)(?=(x+)(\5+$))\6(?!\4*$))*x$)(?=.*$\2|((?=((x*)(?=\2\9+$)x)(\8*$))\10)*x$)(?!(((x+)(?=\13+$)(x+))(?!\12+$)(x+))\11*(?=\11$)(?!(\15\14?)?((xx+)\18+|x?)$))

Provalo online!

# For the purposes of these comments, the input number = N.
^

# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \2.
# If N is square-free, \2 will be unset.
(?=
    # Search through all factors of N, from largest to smallest, searching for one that
    # satisfies the desired property. The first factor tried will be N itself, for which
    # \2 will be unset.
    (|(x+)\2*(?=\2$))     # for factors < N: \2 = factor of N; tail = \2
    # Assert that tail is square-free (its prime factors all have single multiplicity)
    (
        (?=(xx+?)\4*$)    # \4 = smallest prime factor of tail
        (?=(x+)(\5+$))    # \5 = tail / \4 (implicitly); \6 = tool to make tail = \5
        \6                # tail = \5
        (?!\4*$)          # Assert that tail is no longer divisible by \4, i.e. that that
                          # prime factor was of exactly single multiplicity.
    )*x$
)
# Step 2: Require that either \2 is unset, or that the result of repeatedly
# dividing tail by \2 is 1.
(?=
    .*$\2
|
    (
        # In the following division calculation, we can skip the test for divisibility
        # by \2-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
        # capture \2-1 above, and can use a better-golfed form of the division.
        (?=
            (              # \8 = tail / \2
                (x*)       # \9 = \8-1
                (?=\2\9+$)
                x
            )
            (\8*$)         # \10 = tool to make tail = \8
        )
        \10               # tail = \8
    )*
    x$                    # Require that the end result is 1
)

# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
(?!
    (                          # \11 = a factor of N
        (                      # \12 = a non-factor of N between \11 and \13
            (x+)(?=\13+$)      # \13 = a factor of N smaller than \11
            (x+)               # \14 = tool (with \15) to make tail = \13
        )
        (?!\12+$)
        (x+)                   # \15 = tool to make tail = \12
    )
    \11*(?=\11$)               # tail = \11

    # Assert that \11, \12, and \13 are all prime
    (?!
        (\15\14?)?             # tail = either \11, \12, or \13
        ((xx+)\18+|x?)$
    )
)


* È ancora più pulito con un lookahead molecolare, senza nessun caso speciale per N che è privo di quadrati. Questo scende di 6 byte, producendo una soluzione 195 187 183 byte :

^(?=(?*(x+))\1*(?=\1$)((?=(xx+?)\3*$)(?=(x+)(\4+$))\5(?!\3*$))*x$)(?=((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$)(?!(((x+)(?=\12+$)(x+))(?!\11+$)(x+))\10*(?=\10$)(?!(\14\13?)?((xx+)\17+|x?)$))

# For the purposes of these comments, the input number = N.
^

# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \1.
(?=
    (?*(x+))              # \1 = proposed factor of N
    \1*(?=\1$)            # Assert that \1 is a factor of N; tail = \1
    # Assert that tail is square-free (its prime factors all have single multiplicity)
    (
        (?=(xx+?)\3*$)    # \3 = smallest prime factor of tail
        (?=(x+)(\4+$))    # \4 = tail / \3 (implicitly); \5 = tool to make tail = \4
        \5                # tail = \4
        (?!\3*$)          # Assert that tail is no longer divisible by \3, i.e. that that
                          # prime factor was of exactly single multiplicity.
    )*x$
)
# Step 2: Require that the result of repeatedly dividing tail by \1 is 1.
(?=
    (
        # In the following division calculation, we can skip the test for divisibility
        # by \1-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
        # capture \1-1 above, and can use a better-golfed form of the division.
        (?=
            (             # \7 = tail / \1
                (x*)      # \8 = \7-1
                (?=\1\8+$)
                x
            )
            (\7*$)        # \9 = tool to make tail = \7
        )
        \9                # tail = \7
    )*
    x$                    # Require that the end result is 1
)

# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
(?!
    (                          # \10 = a factor of N
        (                      # \11 = a non-factor of N between \10 and \12
            (x+)(?=\12+$)      # \12 = a factor of N smaller than \10
            (x+)               # \13 = tool (with \14) to make tail = \12
        )
        (?!\11+$)
        (x+)                   # \14 = tool to make tail = \11
    )
    \10*(?=\10$)               # tail = \10

    # Assert that \10, \11, and \12 are all prime
    (?!
        (\14\13?)?             # tail = either \10, \11, or \12
        ((xx+)\17+|x?)$
    )
)

Qui è portato su lookbehind di lunghezza variabile:

Regex (ECMAScript 2018), 198 195 194 186 182 byte

^(?=(x+)(?=\1*$)(?<=^x((?<!^\5*)\3(?<=(^\4+)(x+))(?<=^\5*(x+?x)))*))((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$(?<!(?!(\14\16?)?((xx+)\12+|x?)$)(?<=^\13+)((x+)(?<!^\15+)((x+)(?<=^\17+)(x+))))

Provalo online!

# For the purposes of these comments, the input number = N.
^

# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \1.
(?=
    (x+)(?=\1*$)      # \1 = factor of N; head = \1
    (?<=              # This is evaluated right-to-left, so please read bottom to top.
        ^x
        (
            (?<!^\5*)        # Assert that head is no longer divisible by \6, i.e. that
                             # that prime factor was of exactly single multiplicity.
            \3               # head = \4
            (?<=(^\4+)(x+))  # \4 = head / \5 (implicitly); \3 = tool to make head = \4
            (?<=^\5*(x+?x))  # \5 = smallest prime factor of head
        )*
    )
)
# Step 2: Require that the result of repeatedly dividing tail by \1 is 1.
(
    # In the following division calculation, we can skip the test for divisibility
    # by \1-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
    # capture \1-1 above, and can use a better-golfed form of the division.
    (?=
        (             # \7 = tail / \1
            (x*)      # \8 = \7-1
            (?=\1\8+$)
            x
        )
        (\7*$)        # \9 = tool to make tail = \7
    )
    \9                # tail = \7
)*
x$                    # Require that the end result is 1

# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
# This is evaluated right-to-left, so please read bottom to top, but switch back to
# reading top to bottom at the negative lookahead.
(?<!
    # Assert that \13, \15, and \17 are all prime.
    (?!
        (\14\16?)?           # tail = either \13, \15, or \17
        ((xx+)\12+|x?)$
    )

    (?<=^\13+)
    (                        # tail = \13
        (x+)                 # \14 = tool to make tail = \15
        (?<!^\15+)
        (
            (x+)             # \16 = tool (with \14) to make tail = \17
            (?<=^\17+)(x+)   # \17 = a factor of N smaller than \13
        )                    # \15 = a non-factor of N between \13 and \17
    )                        # \13 = a factor of N
)

È possibile sostituire .*$\2con\2^
H.Piz il

Anche se, credo che questo sia valido:^(?=(|(x+)\2*(?=\2$))(((?=(xx+?)\5*$)(?=(x+)(\6+$))\7(?!\5*$))*x$))(?!(((xx+)(?=\10+$)(x+))(?!\9+$)(x+))\8*(?=\8$)(?!(\12\11?)?(xx+)\14+$))((?=((x*)(?=\2\17+$)x)(\16*$))\19)*\3$
H.Piz,

Non sembra vicino all'ottimale però
H.Piz il

6

Gelatina , 13 6 5 byte

ÆEt0E

Provalo online!

Ancora superato ... (grazie Erik per -1 byte)


Spiegazione

ÆE     # get a list of prime exponents (noooo long builtin name)
  t0   # remove zeroes on both sides (leading or trailing)
    E  # all remaining elements are equal

œl-> t. Non vi è alcun motivo per la presenza di zero finali nell'output di ÆE.
Erik the Outgolfer,


@dylnan Che fallisce per il 2250 .
Dennis,

@Dennis Grazie, mi ero reso conto che non avrebbe funzionato, ma spero che ispirerà una soluzione a quattro byte
dylnan,

6

JavaScript (ES6), 87 byte

Restituisce 0 per verità o un numero intero diverso da zero per falsa.

f=(n,k=2,j,i)=>n%k?j*(P=d=>k%--d?P(d):d==!i)(k)|j-i|(n>1&&f(n,k+1,j||i)):f(n/k,k,j,-~i)

Provalo online!

Commentate

f = (                     // f() = recursive function taking:
  n,                      //   n = input
  k = 2,                  //   k = current factor
  j,                      //   j = reference exponent, initially undefined
  i                       //   i = current exponent, undefined each time we start testing
) =>                      //       the next factor
  n % k ?                 // if k is not a divisor of n:
    j * (                 //   ignore the primality of k if j is still undefined
      P = d =>            //     P() = function testing if k is prime:
        k % --d ?         //       decrement d; if d is not a divisor of k:
          P(d)            //         do a recursive call until it is
        :                 //       else:
          d == !i         //         unless i is already defined: d must not be equal to 1
                          //         (if it is: k is the next prime but does not divide n)
    )(k) |                //   initial call to P() with d = k
    j - i | (             //   if both i and j are defined, they must be equal
      n > 1 &&            //   if n is not yet equal to 1,
      f(n, k + 1, j || i) //   go on with k + 1; if j is undefined, set it to i
    )                     //   (otherwise, stop recursion and return what we have)
  :                       // else:
    f(n / k, k, j, -~i)   //   increment the current exponent and go on with n / k

Questo è stato rotto dal cambio di j||ia i. Ora produce molti falsi positivi.
Deadcode

@Deadcode Non riesco a controllare o correggere questo per il momento, quindi per il momento ho appena eseguito il rollback.
Arnauld,

5

CJam , 30 29 byte

{mFz~)-!\__W=,\0=>\-:mp1#W=&}

Provalo online!

La mia prima risposta dopo una pausa di quasi 2 (!) Anni, quindi probabilmente può essere giocata a golf di più. Questo è un blocco che accetta input come numero intero (può anche essere mappato per matrici di numeri interi).

Spiegazione

{        e# Begin block
 mF      e# Factor input, giving an array of primes and their powers
 z~      e# Transpose and dump, giving an array of primes and an array of powers
 )-      e# Check that the powers are the same: subtract each power from the last element
 !       e# Negate to make sure they're all 0
 \__W=,  e# Get the range from 0 to the largest prime minus one
 \0=>    e# Slice that array so it only includes everything larger than the smallest prime
 \-      e# Remove the original primes from the range array
 :mp     e# Check each element for primality. If the input's primes are consecutive,
         e# this will contain no primes
 1#W=    e# Make sure a "1" is not found
 &       e# If the powers are the same AND primes are consecutive, return 1. Otherwise, 0.
}

5

Stax , 5 6 byte

╣♥qJ╬c

Esegui ed esegui il debug

Disimballato, non golfato e commentato, sembra così.

|n    get the exponents of the prime factorization
0:D   trim leading zeroes
:u    array has exactly a single distinct element

Modifica: non funziona 512. Ci penserò su e spero di risolverlo più tardi. Ora funziona.


3

Stax , 9 byte

1 è vero, 0 è falso

αAG<└\{┬⌠

Esegui ed esegui il debug

Spiegazione

|nX0-u%x:^=      # Full Program, unpacked, implicit input
|n               # Exponents of sequential primes in factorization. (eg. 20 -> [2 0 1])
  X              # Save to X register
   0-            # Remove all '0' from array
     u%          # Get unique numbers and get length of array
       x         # Copy back the array saved to X
        :^       # Is it ascending
         =       # Are the two comparisons equal? implicit output

Probabilmente si può giocare a golf di più, ma copre i casi che mi mancavano nell'ultima soluzione.


3

MATL , 12 11 10 byte

YFtgYsg)Zs

Provalo su MATL Online!

Grazie a Luis Mendo per la parte di eliminazione degli zero. Ha anche sottolineato che lo scambio di valori di verità è consentito, quindi questo restituisce 0 per numeri che soddisfano i requisiti della sfida e qualsiasi valore positivo in caso contrario.

Grosso Modo, questo genera gli esponenti della scomposizione in fattori primi sequenziali, rimuove gli zeri iniziali e calcola la deviazione standard.


Penso che 0iYFhdzfunzioni per 7 byte: anteporre uno 0 agli esponenti della fattorizzazione sequenziale, differenze consecutive, numero di non zeri. Il risultato è che l' 1input soddisfa il requisito
Luis Mendo,

@LuisMendo Ci scusiamo per la risposta ritardata, ma puoi pubblicarla come risposta separata. È decisamente molto diverso.
Mr. Xcoder,

OK, l'ho pubblicato come risposta
Luis Mendo,

3

Java 10, 223 191 178 176 168 byte

n->{var s=new java.util.HashSet();for(int f=1,i=1,x,j;n>1;){for(x=++i,j=2;j<x;)x=x%j++<1?1:x;if(x>1){for(j=0;n%i<1&&n>(f=0);n/=i)j++;if(f<1)s.add(j);}}return s.size();}

Ritorna 1come verità e >=2come falsità.

Provalo online.

Spiegazione:

n->{                   // Method with integer parameter and boolean return-type
  var s=new java.util.HashSet();
                       //  Set to keep track of the prime exponents
  for(int f=1,         //  Prime-flag, starting at 1
          i=1,x,j;     //  Index and temp integers
          n>1;){       //  Loop as long as `n` is still larger than 1
    for(x=++i,         //   Set `x` to `i`, after we've increased `i` by 1 first with `++i`
        j=2;           //   Set `j` to 2 (first prime)
        j<x;)          //   Inner loop as long as `j` is still smaller than `x`
      x=x%j++<1?       //    If `x` is divisible by `j`:
         1             //     Set `x` to 1
        :              //    Else:
         x;            //     Leave `x` unchanged
    if(x>1){           //    If `x` is larger than 1 (if `i` is a prime):
      for(j=0;         //     Use `j` as counter, and set it to 0
          n%i<1        //     If `n` is divisible by `i`:
                       //      And loop as long as `n` is still divisible by `i`,
          &&n>         //      and `n` is larger than 0
              (f=0);   //      (and set `f` to 0 at the same time)
          n/=i)        //       Divide `n` by `i`
        j++;           //       And increase `j` by 1
      if(f<1)          //     If the flag `f` is now/still 0:
        s.add(j);}}    //      Add counter `j` to the Set
  return s.size();}    //  Return the amount of items in the Set
                       //  (1 being true, >=2 being false)

Alcuni input di esempio:

n=15:

  • La bandiera rimane 1per il primo primo 2 (perché 15 non è divisibile per 2).
  • Flag va da 1a 0non appena siamo ai primi 3. Dal momento che 15 è divisibile per 3, ndiventa 5 (15/3 1 ) e il Set diventa [] → [1].
  • Quindi controlliamo il prossimo primo 5. Poiché 5 è divisibile per 5, ndiventa 1 (5/5 1 ) e il Set rimane lo stesso ( [1] → [1]).
  • Ora n=1, quindi fermiamo il circuito esterno. Il Set ( [1]) contiene solo un oggetto, il 1da entrambi i numeri primi 3 e 5 adiacenti, quindi restituiamo true.

n=14:

  • Flag va da 1a 0per il primo primo 2 (perché 14 è divisibile per 2). ndiventa 7 (14/2 1 ) e il Set diventa [] → [1].
  • Quindi controlliamo il prossimo primo 3. Poiché 7 non è divisibile per 3, nrimane lo stesso e il Set diventa [1] → [1,0].
  • Quindi controlliamo il prossimo primo 5. Poiché anche 7 non è divisibile per 5, nrimane lo stesso e anche il set rimane lo stesso ( [1,0] → [1,0]).
  • Quindi controlliamo il prossimo primo 7. Poiché 7 è divisibile per 7, ndiventa 1 (7/7 1 ) e il Set rimane lo stesso ( [1,0] → [1,0]).
  • Ora n=1, quindi fermiamo il circuito esterno. Il Set ( [1,0]) contiene due elementi, i 1numeri primi non adiacenti 2 e 7 e 0i numeri primi 3 e 5, quindi restituiamo false.

n=72:

  • Flag va da 1a 0per il primo primo 2, perché 72 è divisibile per 2 (più volte). Quindi ndiventa 9 (72/2 3 ) e il set diventa [] → [3].
  • Quindi controlliamo il prossimo primo 3. Poiché 9 è divisibile per 3 (più volte), ndiventa 1 (9/3 2 ) e il Set diventa [3] → [3,2].
  • Ora n=1, quindi fermiamo il circuito esterno. Il Set ( [3,2]) contiene due elementi, il 3da primo 2 e il 2da primo 3, quindi restituiamo false.

1
È possibile rimuovere <2e restituire un int (specificare che si restituisce 1 per verità).
wastl

@wastl Ah, mancava la regola che solo uno dei due valori fosse coerente. In quel caso 1è verità e, 2o più in alto, è falsità. Grazie.
Kevin Cruijssen,

Grazie a chiunque mi abbia dato la generosità, ma perché?
Kevin Cruijssen,

1
Avevo iniziato una ricompensa "Ricompensa risposta esistente" per attirare più attenzione sulla mia risposta ECMAScript, che credo ancora meriti più di quanto non sia stata ottenuta (considererei la generosità fallita). Alla fine della settimana, ho dovuto scegliere una risposta diversa dalla mia a cui assegnare la generosità o lasciarla in default ai più votati. Non pensavo che qualcuno lo meritasse, ma la tua risposta aveva la migliore spiegazione, ed è per questo che te l'ho assegnato; le buone spiegazioni sono troppo rare su PPCG. Per quanto riguarda la mia risposta, immagino di doverlo scrivere meglio, su cui ho in programma quando ho tempo.
Deadcode

1
@Deadcode Ah, ecco perché. Pensavo che forse qualcuno avesse iniziato la generosità, ma per caso hanno lasciato scadere e invece è venuto da me. Ancora un po 'confuso perché la mia risposta allora e non la più votata. Devo dire che sono impressionato da tutte le tue risposte Regex. Ne ho visti alcuni e ogni volta sono stupito. Soprattutto quando torno più tardi alla stessa risposta e hai giocato a golf ancora di più. : DI ho appena notato che non avevo visto né votato a favore di questa sfida, quindi l'ho appena fatto. Sai, aggiungerò una generosità a questa tua risposta . :)
Kevin Cruijssen,

2

J , 16 byte

Grazie mille a FrownyFrog per -8 byte!

(=&#+/\=@#])_&q:

Provalo online!

La mia vecchia soluzione:

J , 24 byte

[:(1=[:#@~.{.@I.}.])_&q:

Provalo online!

Spiegazione:

_&q: esponenti principali

{.@I.}.] rimuove gli zeri iniziali trovando il primo elemento diverso da zero:

     }.   drop
       ]  from the list of exponents
{.@       as much items as the first of the 
   I.     indices of non-zero elements

1=[:#@~. verifica se tutti i numeri rimanenti sono uguali:

  [:#@~.  finds the length of the list after removing the duplicates
1=        is it 1?


2

MATL , 7 byte

0iYFhdz

Il risultato è che l' 1input soddisfa il requisito.

Provalo online! Oppure verifica tutti i casi di test

Spiegazione

0    % Push 0
i    % Push input number
YF   % Exponents of consecutive prime factors
h    % Concatenate horizontally
d    % Consecutive differences
z    % Number of nonzeros. Implicitly display

2

Ottava , 67 byte

@(x)~any(diff(find(h=histc(factor(x),primes(x))))-1)&h(h>0)==max(h)

Provalo online!

Credo che questa sia l'unica soluzione che utilizza un istogramma.

Spiegazione:

Questo crea un istogramma, in cui le variabili da contare sono i fattori dell'input e posizionate nei bin primes(x), che sono tutti numeri primi inferiori all'input. Troviamo quindi la posizione dei fattori primi, prende la differenza tra ciascuno degli indici e sottraggiamo uno. Se ci sono elementi che non sono zero (ovvero la differenza degli indici dei numeri primi non è 1), ciò comporterà un valore errato, altrimenti restituirà un valore veritiero.

Chech quindi che tutti gli elementi diversi da zero nell'istogramma sono uguali all'elemento massimo. Se ci sono valori che non sono uguali, ciò comporterà un valore errato, altrimenti restituirà un valore veritiero.

Se entrambi questi blocchi sono veritieri, il nostro input è un numero esponente consecutivo primo costante!


1

APL (Dyalog Extended) , 28 byte

{f p`↓⍭⍵⋄(1=≢∪p)∧∨/f⍷⍸1⍭⍳⍵}

Provalo online!

Come:

{f p`↓⍭⍵⋄(1=≢∪p)∧∨/f⍷⍸1⍭⍳⍵} ⍝ Monadic function, takes an argument ⍵
       ⍭⍵                     ⍝ Prime factors and exponents of ⍵
     `                         split the resulting matrix in 2 vectors
 f p                           assign the factors to f and the powers to p
                               then
                          ⍳⍵    range [1..⍵]
                        1      primality check for each element in the vector
                                where; returns the indices of truthy values
                     f          find the factors; returns a boolean vector
                   ∨/            logical OR reduction
                                logical AND
           (   p)               unique members of the powers
                                tally; returns the number of elements in the vector
            1=                   check if there's only one element



0

J , 14 byte

1#.2~:/\0,_&q:

1 nell'uscita indica esponente costante consecutivo.

Provalo online!

        0,_&q:   zero followed by the prime exponents of input
   2~:/\         for every two consecutive values, 1 if they are different
1#.              convert from base-1, just add them up

0

Pulito , 127 byte

import StdEnv
@n=[]== $n
?n#j= $n
= @n||j==filter@[hd j..last j]&&any(\p=(prod j)^p==n)[1..n]
$n=[i\\i<-[2..n-1]|n/i*i==n&& @i]

Provalo online!

Definisce la funzione ? :: Int -> Boolusando $ :: Int -> [Int]per fattorizzare e @ :: Int -> Boolverificare la primalità.


0

APL (NARS) 41 caratteri, 82 byte

{(1=≢∪+/¨{v=⍵⊃v}¨⍳≢v)∧(1↓w)≡¯1↓1πw←∪v←π⍵}

{π⍵} è la fattorizzazione della funzione dell'argomento ⍵ nell'elenco dei fattori primi (ripetere se un numero primo appare più tempo);
{1π⍵} è la funzione primo primo (nota che in questo caso il suo argomento non è uno scalare ma un array di numeri interi). test:

  h←{(1=≢∪+/¨{v=⍵⊃v}¨⍳≢v)∧(1↓w)≡¯1↓1πw←∪v←π⍵}
  (2..30)/⍨h¨2..30
2 3 4 5 6 7 8 9 11 13 15 16 17 19 23 25 27 29 30 
  h¨27000 456533 72 10000000
1 1 0 0 
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.