Numeri di contenimento Prime (edizione golf)


21

Questa è la sequenza A054261 .

Il n ° numero di contenimento primario è il numero più basso, che contiene i primi n primi numeri come stringhe. Ad esempio, il numero 235 è il numero più basso che contiene i primi 3 numeri primi come sottostringhe, rendendolo il terzo numero di contenimento primo.

È banale capire che i primi quattro numeri di contenimento primo sono , , e , ma poi diventa più interessante. Poiché il primo primo è 11, il prossimo numero di contenimento del primo non è , ma è poiché è definito come il numero più piccolo con la proprietà.2232352357235711112357

Tuttavia, la vera sfida arriva quando si supera l'11. Il prossimo numero di contenimento primo è . Si noti che in questo numero, le sottostringhe e si sovrappongono. Il numero si sovrappone anche al numero .1132571113313

È facile dimostrare che questa sequenza sta aumentando, poiché il numero successivo deve soddisfare tutti i criteri del numero precedente e avere una sottostringa in più. Tuttavia, la sequenza non è strettamente crescente, come dimostrato dai risultati di n=10e n=11.

Ingresso

Un unico numero intero n>0(suppongo che potresti anche averlo indicizzato 0, quindi facendo n>=0)

Produzione

O il nnumero di contenimento primo o un elenco contenente i primi nnumeri di contenimento primo.

I numeri che ho trovato finora sono:

 1 =>             2
 2 =>            23
 3 =>           235
 4 =>          2357
 5 =>        112357
 6 =>        113257
 7 =>       1131725
 8 =>     113171925
 9 =>    1131719235
10 =>  113171923295
11 =>  113171923295
12 => 1131719237295

Si noti che n = 10e n = 11sono lo stesso numero, poiché 113171923295 è il numero più basso che contiene tutti i numeri [2,3,5,7,11,13,17,19,23,29] , ma contiene anche 31 .

Dato che questo è contrassegnato con il codice golf, inizia a giocare a golf! Sono consentite soluzioni di forza bruta, ma il tuo codice deve funzionare per qualsiasi input in teoria (il che significa che non puoi semplicemente concatenare i primi n numeri primi). Buon golf!

Risposte:


11

05AB1E , 8 byte

∞.ΔIÅpåP

Provalo online!

Spiegazione

           # from
∞          # a list of infinite positive integers
 .Δ        # find the first which satisfies the condition:
       P   # all
   IÅp     # of the first <input> prime numbers
      å    # are contained in the number

L' Poperatore crea una mappatura esplicita per verificare i numeri primi nel numero (anziché verificare se il numero è nella matrice dei numeri primi)? Questa è una soluzione meravigliosa, dubito che tu possa realizzare qualsiasi soluzione usando meno comandi.
massimo

@maxb Pè prodotto. In pratica moltiplica tutti i valori in un elenco. La Åpcreerà un elenco con la prima nquantità di numeri primi, dove nè l'ingresso Iin questo caso. Il åcontrollerà per ogni numero in questo elenco di numeri primi, se sono nel numero corrente della lista infinita, dove si darà1 per truthy e 0per Falsey. Quindi il prodotto controlla sostanzialmente se tutti sono veri; se tutti i numeri primi sono all'interno del numero corrente. Se uno è 0, anche il Prisultato è false. Ma se lo sono tutti 1, i Prisultati sono veritieri e il -loop si ferma.
Kevin Cruijssen,

@KevinCruijssen vedo, grazie per la spiegazione!
max

1
Ottima soluzione usando la nuova versione! Ho avuto 8 byte pure, ma nella versione precedente di 05AB1E: 1µNIÅpåP. Per coloro che non conoscono 05AB1E, una spiegazione anche per la mia: - fino a quando la variabile del contatore raggiunge 1 (inizia da 0, aumenta Ngradualmente di 1 ed esegue: NIÅpåP- controlla se tutti i primi <input> primi appaiono Ne , in tal caso, incrementa automaticamente la variabile del contatore. Restituisce il valore finale di N.
Mr. Xcoder

@ Mr.Xcoder: Quella era in realtà anche la mia prima versione (con, Xinvece 1, per ragioni), ma sono passato a questo dato che non ho mai avuto la possibilità di usarlo prima :)
Emigna,

5

Gelatina , 11 byte

³ÆN€ẇ€µẠ$1#

Provalo online!

Forza bruta semplice. Non sono completamente sicuro di come #funzioni, quindi potrebbe esserci qualche margine di miglioramento.

Come funziona

³ÆN€ẇ€µẠ$1#    Main link. Input: Index n.
         1#    Find the first natural number N that satisfies:
³ÆN€             First n primes...
    ẇ€           ...are substrings of N
      µẠ$        All of them are true

"Risolto il problema con il filtro con condizione" potrebbe funzionare invece di "condizione vera per tutti".
user202729

2
wⱮẠ¥1#ÆN€salva due byte.
Dennis,

5

Java 8, 143 byte

n->{int r=1,f=1,c,i,j,k;for(;f>0;r++)for(i=2,f=c=n;c>0;c-=j>1?1+0*(f-=(r+"").contains(j+"")?1:0):0)for(j=i++,k=2;k<j;)j=j%k++<1?0:j;return~-r;}

Provalo online.
APPUNTI:

  1. Tempi sopra n=7.
  2. Dato tempo e risorse sufficienti, funziona solo fino a un massimo di a n=9causa del limite di dimensioni di int(massimo di 2,147,483,647).
    • Con +4 byte che cambiano intin along , il massimo viene aumentato a un output in basso 9,223,372,036,854,775,807(circa n=20credo?)
    • Usando java.math.BigInteger il massimo può essere aumentato a qualsiasi dimensione (in teoria), ma sarà di circa +200 byte almeno a causa della verbosità dei java.math.BigIntegermetodi di.

Spiegazione:

n->{                   // Method with integer as both parameter and return-type
  int r=1,             //  Result-integer, starting at 1
      f=1,             //  Flag-integer, starting at 1 as well
      c,               //  Counter-integer, starting uninitialized
      i,j,k;           //  Index integers
  for(;f>0;            //  Loop as long as the flag is not 0 yet
      r++)             //    After every iteration, increase the result by 1
    for(i=2,           //   Reset `i` to 2
        f=c=n;         //   Reset both `f` and `c` to the input `n`
        c>0;           //   Inner loop as long as the counter is not 0 yet
        c-=            //     After every iteration, decrease the counter by:
           j>1?        //      If `j` is a prime:
            1          //       Decrease the counter by 1
            +0*(f-=    //       And also decrease the flag by:
                   (r+"").contains(j+"")?
                       //        If the result `r` contains the prime `j` as substring
                    1  //         Decrease the flag by 1
                   :   //        Else:
                    0) //         Leave the flag the same
           :           //      Else:
            0)         //       Leave the counter the same
      for(j=i++,       //    Set `j` to the current `i`,
                       //    (and increase `i` by 1 afterwards with `i++`)
          k=2;         //    Set `k` to 2 (the first prime)
          k<j;)        //    Inner loop as long as `k` is smaller than `j`
        j=j%k++<1?     //     If `j` is divisible by `k`
           0           //      Set `j` to 0
          :            //     Else:
           j;          //      Leave `j` the same
                       //    (If `j` is unchanged after this inner-most loop,
                       //     it means `j` is a prime)
  return~-r;}          //  Return `r-1` as result

5

JavaScript (ES6),  105 ... 92  91 byte

n=>(k=1,g=(s,d=k++)=>n?k%d--?g(s,d):g(d?s:s+`-!/${n--,k}/.test(n)`):eval(s+';)++n'))`for(;`

Provalo online!

Come?

n

"-!/2/.test(n)-!/3/.test(n)-!/5/.test(n)-!/7/.test(n)-!/11/.test(n)..."

n

eval('for(;' + <conditions> + ';)++n')

Commentate

n => (                             // main function taking n
  k = 1,                           // k = current prime candidate, initialized to 1
  g = (s,                          // g = recursive function taking the code string s
          d = k++) =>              //     and the divisor d
    n ?                            // if n is not equal to 0:
      k % d-- ?                    //   if d is not a divisor of k:
        g(s, d)                    //     recursive call to test the next divisor
      :                            //   else:
        g(                         //     recursive call with s updated and d undefined:
          d ?                      //       if d is not equal to 0 (i.e. k is composite):
            s                      //         leave s unchanged
          :                        //       else (k is prime):
            s +                    //         decrement n and add to s
            `-!/${n--,k}/.test(n)` //         the next condition based on the prime k
                                   //       the lack of 2nd argument triggers 'd = k++'
        )                          //     end of recursive call
    :                              // else (n = 0):
      eval(s + ';)++n')            //   complete and evaluate the code string
)`for(;`                           // initial call to g with s = [ "for(;" ]


4

Pyth , 14 byte

n>5

f@I`M.fP_ZQ1y`

Provalo online!

f@I`M.fP_ZQ1y`     Full program. Q is the input.
f                  Find the first positive integer that fulfils the condition.
 @I`M.fP_ZQ1y`     Filtering condition, uses T to refer to the number being tested.
     .f   Q1       Starting at 1, find the first Q positive integers (.f...Q1) that
       P_Z         Are prime.
   `M              Convert all of those primes to strings.
  I                Check whether the result is invariant (i.e. doesn't change) when...
 @          y`     Intersecting this list with the powerset of T as a string.

Pyth , 15 byte

Leggermente più veloce ma 1 byte più lungo.

f.A/L`T`M.fP_ZQ

Provalo online!

f.A/L`T`M.fP_ZQ     Full program. Q is the input.
f                   Find the first positive integer that fulfils the condition.
 .A/L`T`M.fP_ZQ     Filtering condition, uses T to refer to the number being tested.
         .f   Q     Starting at 1, find the first Q positive integers (.f...Q) that
           P_Z      Are prime.
       `M           Convert all of those primes to strings.
 .A/L               And make sure that they all (.A) occur in (/L)...
     `T             The string representation of T.


3

Carbone , 42 byte

≔¹ηW‹LυIθ«≦⊕η¿¬Φυ¬﹪ηκ⊞υη»≔¹ηWΦυ¬№IηIκ≦⊕ηIη

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

≔¹ηW‹LυIθ«≦⊕η¿¬Φυ¬﹪ηκ⊞υη»

Costruisci i nprimi numeri primi per divisione di prova di tutti i numeri interi per tutti i numeri primi trovati in precedenza.

≔¹ηWΦυ¬№IηIκ≦⊕η

Scorri tutti gli interi fino a quando non ne troviamo uno che contiene tutti i numeri primi come sottostringhe.

Iη

Trasmetti il ​​risultato in stringa e stampa implicitamente.

La velocità del programma può essere raddoppiata al costo di un byte sostituendo l'ultimo ≦⊕ηcon ≦⁺²ηma è ancora troppo lento per il calcolo n>6.


3

Perl 6 , 63 59 byte

-4 byte grazie a nwellnhof

{+(1...->\a{!grep {a~~!/$^b/},(grep &is-prime,2..*)[^$_]})}

Provalo online!

Una soluzione di forza bruta che va in timeout su TIO per numeri superiori a 5, ma sono abbastanza sicuro che funzioni correttamente. Trova il primo numero positivo che contiene i primi nprimi. Ecco una soluzione che non scade n=6.

Spiegazione:

{                                                             } # Anonymous code block
 first                                                    2..*  # Find the first number
       ->\a{                                            }       # Where:
            !grep     # None of
                                                   [^$_]  # The first n
                              (grep &is-prime,2..*)       # primes
                  {a~~!/$^b/},   # Are not in the current number

Hai un modo per verificare l'output per numeri più grandi o aggiungere una spiegazione? Non sono fluente in Perl, e certamente non sono fluente in golf-Perl. Ricevo un timeout su TIO per l'ingresso 5, quindi non riesco davvero a verificare che non concatena solo i numeri primi.
max

@maxb Ho aggiunto un collegamento a una soluzione che genera in anticipo i numeri primi anziché ripetutamente e una spiegazione.
Jo King,


2

Python 2 , 91 byte

n=input();l=[]
P=k=1
while~-all(`x`in`k`for x in(l+[l])[:n]):P*=k*k;k+=1;l+=P%k*[k]
print k

Provalo online!


Se non sapessi che il tuo codice ha generato numeri primi, non sarei mai riuscito a capire che lo fosse. Ottimo lavoro!
massimo

2

SAS, 149 byte

data p;input n;z:i=1;a=0;v+1;do while(a<n);i+1;do j=2 to i while(mod(i,j));end;if j=i then do;a+1;if find(cat(v),cat(i))=0 then goto z;end;end;cards; 

L'input viene inserito seguendo la cards;frase, in questo modo:

data p;input n;z:i=1;a=0;v+1;do while(a<n);i+1;do j=2 to i while(mod(i,j));end;if j=i then do;a+1;if find(cat(v),cat(i))=0 then goto z;end;end;cards; 
1
2
3
4
5
6
7

Emette un set di dati p, con il risultatov , con una riga di output per ciascun valore di input. Dovrebbe funzionare tecnicamente per tutti i casi di test indicati (il numero intero massimo con precisione massima in SAS è 9.007.199.254.740.992), ma ho rinunciato dopo averlo lasciato riflettere per 5 minuti su n = 8.

Spiegazione:

data p;
input n; /* Read a line of input */

z: /* Jump label (not proud of this) */
    i=1; /* i is the current value which we are checking for primality */
    a=0; /* a is the number of primes we've found so far */
    v+1; /* v is the final output value which we'll look for substrings in */ 

    do while(a<n); /* Loop until we find the Nth prime */
        i+1; 
        do j=2 to i while(mod(i,j));end; /* Prime sieve: If mod(i,j) != 0 for all j = 2 to i, then i is prime. This could be faster by only looping to sqrt(i), but would take more bytes */
        if j=i then do; /* If i is prime (ie, we made it to the end of the prime sieve)... */
            a+1;
            if find(cat(v),cat(i))=0 then goto z; /* If i does not appear as a substring of v, then start all over again with the next v */
        end;
    end;

/* Input values, separated by newlines */
cards; 
1
2
3
4
5
6
7

1

Haskell , 102 byte

import Data.List
f n|x<-[2..n*n]=[a|a<-[2..],all(`isInfixOf`show a).take n$show<$>x\\((*)<$>x<*>x)]!!0

Provalo online!

Spiegazione / Non golf

Dato che abbiamo già Data.Listimportato, potremmo anche usarlo: al posto del buon vecchio take n[p|p<-[2..],all((>0).mod p)[2..p-1]]possiamo usare un altro modo di generare tutti i numeri primi di cui abbiamo bisogno. Vale a dire, generiamo una quantità sufficiente di compositi e li usiamo insieme a (\\):

[2..n*n] \\ ( (*) <$> [2..n*n] <*> [2..n*n] )

L'uso è n*nsufficiente perchéπ(n)<n2log(n2). Il resto è solo una semplice comprensione dell'elenco:

[ a | a <- [2..], all (`isInfixOf` show a) . take n $ enoughPrimes ] !!0

1

Japt, 20 18 byte

Lontano dal mio miglior lavoro, sono stato felice di farlo funzionare dopo il giorno che ho avuto. Sono sicuro che finirò per toccarlo più tardi nel bar!

_õ fj ¯U e!øZs}aUÄ

Provalo - ci vogliono 13 secondi per eseguire un input di 7, dopo un po 'traballante (la versione aggiornata si spegne 5per me, ma potrebbe essere solo il mio telefono).


@Oliver, Hmm ... anche a me. Stava decisamente funzionando quando l'ho pubblicato. Ho appena eseguito un test F.h()da solo e sembra essere rotto; ETH deve aver cambiato qualcosa.
Shaggy,

@Oliver, no, l'ultimo commit è stato 2 giorni fa, quindi non è cambiato nulla da quando l'ho pubblicato. Strano!
Shaggy,

Sta lavorando adesso! ¯ \ _ (ツ) _ / ¯
Oliver

@Oliver, non funziona ancora per me. Weirderer e weirderer!
Shaggy,

Funziona per me da quando sono passato dal mio computer di lavoro al mio computer di casa. Strano davvero!
Oliver,
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.