Основные номера содержания (издание для гольфа)


21

Это последовательность A054261 .

- е простое число сдерживания является наименьшим числом , которое содержит первые простых чисел как подстрок. Например, число - это наименьшее число, которое содержит первые 3 простых числа в качестве подстрок, что делает его третьим основным номером содержания.NN235

Нетрудно понять, что первые четыре простых числа локализации - это , , и , но тогда это становится более интересным. Поскольку следующее простое число равно 11, следующее простое число не , но это так как оно определено как наименьшее число со свойством.2232352357235711112357

Однако настоящая проблема возникает, когда вы выходите за пределы 11. Следующее простое число сдерживания - . Обратите внимание, что в этом номере подстроки и перекрываются. Номер также совпадает с номером .1132571113313

Легко доказать, что эта последовательность увеличивается, так как следующее число должно соответствовать всем критериям числа перед ним и иметь еще одну подстроку. Однако последовательность строго не увеличивается, как показывают результаты для n=10и n=11.

вход

Одно целое число n>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

Так как это обозначено кодом гольф, получите гольф! Разрешены грубые решения, но ваш код должен работать для любого ввода в теории (это означает, что вы не можете просто объединить первые n простых чисел). Удачного игры в гольф!

Ответы:


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 P- это продукт. Это в основном умножает все значения в списке. ÅpСоздаст список с первым nколичеством простых чисел, где nнаходится вход Iв данном случае. åБудет проверять для каждого номера в этом списке простых чисел , если они находятся в текущем количестве бесконечного списка, где он даст 1для truthy и 0для falsey. Таким образом, продукт в основном проверяет, правдивы ли все; если все простые числа находятся внутри текущего числа. Если они равны 0, Pрезультат также будет равен фальси. Но если все так 1, Pрезультаты получаются правдоподобными, и -loop останавливается.
Кевин Круйссен

@KevinCruijssen Понятно, спасибо за объяснение!
Макс

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

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

5

Желе , 11 байт

³ÆN€ẇ€µẠ$1#

Попробуйте онлайн!

Простая грубая сила. Не совсем уверен, как #работает Arity, поэтому может быть что-то для улучшения.

Как это устроено

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

«Исправлено под фильтром с условием» может работать вместо «условие верно для всех».
user202729

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 байтами, изменяющими на intalong , максимум увеличивается до выхода ниже 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(;`

Попробуйте онлайн!

Как?

N

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

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

Pyth , 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.

Pyth , 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

У вас есть какой-нибудь способ проверить вывод для больших чисел или добавить объяснение? Я не бегло говорю на Perl, и, конечно, я не бегу в гольф-Perl. Я получаю тайм-аут на TIO для ввода 5, поэтому я не могу убедиться, что он не просто объединяет простые числа.
максимум

@maxb Я добавил ссылку на решение, которое генерирует простые числа заранее, а не многократно, и объяснение.
Джо Кинг


2

Python 2 , 91 байт

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

Попробуйте онлайн!


Если бы я не знал, что ваш код генерирует простые числа, я бы никогда не смог понять, что он сделал. Отличная работа!
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

Попробуйте онлайн!

Объяснение / Ungolfed

Поскольку мы уже 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π(n)<n2log(n2)

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

1

Japt, 20 18 байт

Далеко от моей лучшей работы, я был просто счастлив заставить ее работать после того дня, который у меня был. Я уверен, что в итоге постучу по нему вниз по пуху!

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

Попробуйте - для запуска требуется 13 секунд, 7после этого выдает колебание (обновленная версия выдает 5меня, но это может быть только мой телефон).


@ Оливер, Хм ... я тоже. Это определенно работало, когда я отправил это. Просто запустил тест F.h()самостоятельно, и он, похоже, не работает; ETH должно быть что-то изменило.
лохматый

@ Оливер, нет, последний коммит был 2 дня назад, так что ничего не изменилось с тех пор, как я это опубликовал. Weird!
лохматый

Теперь работает! ¯ \ _ (ツ) _ / ¯
Оливер

@ Оливер, все еще не работает для меня. Странник и странник!
Лохматый

Это работает для меня, так как я перешел с моего рабочего компьютера на мой домашний компьютер. Действительно странно!
Оливер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.