Номери основних номерів (видання для гольфу)


21

Це послідовність A054261 .

n - е просте число стримування є найменшим числом , яке містить перші n простих чисел як подстрок. Наприклад, число 235 є найменшим числом, яке містить перші 3 прайми в якості підрядків, що робить його 3-м простим номером стримування.

Неважливо зрозуміти, що перші чотири прості числа обмежень складають 2 , 23 , 235 і 2357 , але потім стає цікавіше. Оскільки наступного простого числа - 11, наступний номер 235711 не є 235711 , але це 112357 оскільки він визначається як найменше число з властивістю.

Однак справжній виклик виникає, коли ви виходите за межі 11. Наступний номер основного стримування - 113257 . Зверніть увагу, що в цьому числі підрядки 11та 13перекриваються. Кількість3 також перекривається числом 13.

Неважко довести, що ця послідовність збільшується, оскільки наступному номеру необхідно виконати всі критерії числа до нього та мати ще одну підрядку. Однак послідовність не суворо зростає, як показують результати за n=10і n=11.

Вхідні дані

Єдине ціле число n>0(я думаю, ви також могли мати його 0-індексованим, тоді роблячи n>=0)

Вихідні дані

Або перший nпростий номер стримування, або список, що містить перші nпрості номери стримування.

Я знайшов поки що цифри:

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

Зауважимо, що це n = 10і n = 11те саме число, оскільки 113171923295 - найменше число, яке містить усі числа [2,3,5,7,11,13,17,19,23,29] , але воно також містить 31 .

Оскільки це позначено кодом гольфу, займіться гольфу! Рішення грубої сили дозволені, але ваш код повинен працювати для будь-якого введення теоретично (це означає, що ви не можете просто об'єднати перші п-прайси). Щасливого гольфу!

Відповіді:


11

05AB1E , 8 байт

∞.ΔIÅpåP

Спробуйте в Інтернеті!

Пояснення

           # 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

Чи Pстворює оператор явне відображення, щоб перевірити наявність простих чисел у номері (замість того, щоб перевірити, чи є число у масиві простих чисел)? Це прекрасне рішення, я сумніваюся, ви могли б прийняти будь-яке рішення, використовуючи менше команд.
maxb

@maxb P- продукт. В основному він множує всі значення в списку. ÅpСтворить список з першим nкількістю простих чисел, де nзнаходиться вхід Iв даному випадку. åПеревірятиме для кожного номера в цьому списку простих чисел , якщо вони знаходяться в поточну кількість нескінченного списку, де він дасть 1для truthy і 0для falsey. Таким чином, продукт в основному перевіряє, чи всі вони правдиві; якщо всі праймери знаходяться всередині поточного числа. Якщо такі є 0, Pрезультати також у фальси. Але якщо всі є 1, Pрезультати в трибунах, і -loop припиняється.
Кевін Кройсейсен

@KevinCruijssen Бачу, дякую за пояснення!
maxb

1
Дуже приємне рішення з використанням нової версії! У мене також було 8 байт, але в застарілій версії 05AB1E : 1µNIÅpåP. Для тих, хто не знає 05AB1E, пояснення також для мого: - до змінної лічильника, що досягне 1 (вона починається з 0, збільшуйте Nпоступово на 1 і виконайте: NIÅpåP- перевірте, чи з’являються всі перші <input> праймери в Nі , якщо так,
збільшуйте

@ Mr.Xcoder: Насправді це була і моя перша версія (із Xзамість того 1, щоб бути причиною), але я перейшов до цього, оскільки ніколи раніше не мав можливості використовувати :)
Emigna

5

Желе , 11 байт

³ÆN€ẇ€µẠ$1#

Спробуйте в Інтернеті!

Проста груба сила. Не зовсім впевнений, як #працює арітія, тому може бути поле для вдосконалення.

Як це працює

³Æ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

"Виправлено під фільтром з умовою" може працювати замість "умова, що відповідає всім".
користувач202729

2
wⱮẠ¥1#ÆN€економить два байти.
Денніс

5

Java 8, 143 байти

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

Спробуйте в Інтернеті.
ПРИМІТКИ:

  1. Часи з вище n=7.
  2. Враховуючи достатньо часу та ресурсів, він працює лише максимум n=9 рахунок обмеження розміру int(максимум 2,147,483,647).
    • З +4 байтами, що змінюються intна аlong , максимум збільшується до виходу нижче 9,223,372,036,854,775,807(про що n=20я думаю?)
    • Використовуючи java.math.BigIntegerмаксимум, можна збільшити до будь-якого розміру (теоретично), але він буде приблизно +200 байт принаймні за рахунок багатослівностіjava.math.BigInteger російських методів ..

Пояснення:

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 байт

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(;`

Спробуйте в Інтернеті!

Як?

н

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

н

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

Прокоментував

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

Піт , 14 байт

n>5

f@I`M.fP_ZQ1y`

Спробуйте в Інтернеті!

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.

Піт , 15 байт

Трохи швидше, але на 1 байт довше.

f.A/L`T`M.fP_ZQ

Спробуйте в Інтернеті!

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

Вугілля деревне , 42 байти

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

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

Створіть перші nпрості числа шляхом пробного поділу всіх цілих чисел на всі знайдені раніше прості числа.

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

Проведіть цикл через цілі числа, поки ми не знайдемо одне, яке містить усі прайми як підрядки.

Iη

Передайте результат на рядок і друкується неявно.

Швидкість програми можна подвоїти вартістю байта, замінивши останній ≦⊕ηна, ≦⁺²ηале це все ще занадто повільно для обчислення n>6.


3

Perl 6 , 63 59 байт

-4 байти завдяки nwellnhof

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

Спробуйте в Інтернеті!

Рішення з грубою силою, яке вичерпується на TIO для чисел вище 5, але я впевнений, що він працює правильно. Знаходить перше додатне число, яке містить перші nпраймери. Ось рішення , яке не вичерпуєтьсяn=6 .

Пояснення:

{                                                             } # 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

Чи є у вас спосіб перевірити вихід на більші числа чи додати пояснення? Я не вільно володію Перлом, і я точно не володію гольф-перлом. Я отримую тайм-аут на TIO для введення 5, тому я не можу реально перевірити, що він не просто з'єднує праймери.
maxb

@maxb Я додав посилання на рішення, яке генерує праймес заздалегідь, а не повторно, та пояснення.
Джо Кінг



2

SAS, 149 байт

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; 

Введення вводиться після cards;заяви, наприклад:

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

Виводить набір даних pіз результатомv із рядком виводу для кожного вхідного значення. Якщо технічно потрібно працювати для всіх заданих тестових випадків (максимальне ціле число з повною точністю в SAS становить 9,007,199,254,740,992), але я відмовився, давши йому думати протягом 5 хвилин на n = 8.

Пояснення:

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 байти

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

Спробуйте в Інтернеті!

Пояснення / Недозволений

Оскільки ми вже Data.Listімпортували, ми можемо також використовувати його: Замість старого доброго, take n[p|p<-[2..],all((>0).mod p)[2..p-1]]ми можемо використовувати інший спосіб отримання всіх необхідних нам простих. А саме ми генеруємо достатню кількість композитів і використовуємо їх разом із (\\):

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

Використання n*nдостатньо, тому щоπ(н)<н2журнал(н2). Решта - це просто просте розуміння списку:

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

1

Japt, 20 18 байт

Далеко від моєї найкращої роботи, я був щасливий, коли працював після закінчення дня. Я впевнений, що згодом я постукаю вниз по бугеру!

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

Спробуйте - триває 13 секунд, щоб запустити вхід 7, кидає коливання після цього (оновлена ​​версія у 5мене виходить , але це може бути просто мій телефон).


@Oliver, Хм ... я теж. Це, безумовно, працювало, коли я розміщував це. Щойно пройшов тест, використовуючи F.h()самостійно, і він, здається, зламаний; ETH, мабуть, щось змінив.
Кудлатий

@Oliver, ні, останнє зобов’язання було 2 дні тому, тому нічого не змінилося, оскільки я опублікував це. Дивно!
Кудлатий

Це працює зараз! ¯ \ _ (ツ) _ / ¯
Олівер

@Oliver, все ще не працює для мене. Weirderer і weirderer!
Shaggy

Це працює для мене з моменту переходу з робочого комп’ютера на домашній. Дивно насправді!
Олівер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.