Могут ли чётные числа стать простыми?

24

Последовательность

Все знают , что только даже простое число 2. Ho-гул. Но есть определенные четные числа, nгде при объединении n-1они становятся простым числом.

Для начала, 1не в списке, потому что 10не является основным. Аналогично с 2( 21) и 3( 32). Тем не менее, 4работает, потому что 43это простое число, так что это первое число в последовательности a(1) = 4. Следующее число, которое работает (ни 6( 65), ни 8( 87) не работает 10, это потому, что 109это простое число a(2) = 10. Тогда мы пропускаем кучу больше, пока 22, потому что 2221простое, так a(3) = 22. И так далее.

Очевидно, что все члены в этой последовательности являются четными, потому что любое нечетное число nпри объединении n-1становится четным (как 3превращается в 32), которое никогда не будет простым.

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

Соревнование

Если задан входной номер, nкоторый вписывается где-то в эту последовательность (т. nЕ. Соединен с n-1простым), выведите его положение в этой последовательности. Вы можете выбрать 0- или 1-индексированный, но, пожалуйста, укажите, какой в ​​вашем представлении.

правила

  • Можно предположить, что ввод и вывод соответствуют целочисленному типу вашего языка.
  • Ввод и вывод может быть дан в любом удобном формате .
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Примеры

Приведенные ниже примеры 1-проиндексированы.

n = 4
1

n = 100
11

n = 420
51
AdmBorkBork
источник
1
Почему вы должны сделать это в обратном порядке? У cQuents такого режима нет :(
Стивен
4
@StepHen Просто для изменения темпа; нечто отличное от обычного.
AdmBorkBork
9
Я чувствую, что это будет намного лучше, как решение проблемы.
Пшеничный волшебник
4
Не только 2 является единственным простым числом, делимым на 2, 3 также является единственным простым числом, делимым на 3, и 5 является единственным простым числом, делимым на 5. В общем, простое число nвсегда является единственным простым числом, делимым на n. Это не особенное - просто так работают простые числа.
Esolanging Fruit

Ответы:

11

Желе ,  8  7 байт

ḊżṖVÆPS

Монадическая ссылка, принимающая член последовательности и возвращающая его индекс в последовательности.

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

Как?

ḊżṖVÆPS - Link: number, n
Ḋ       - dequeue (implicit range) = [ 2   , 3   , 4   ,... ,              n         ]
  Ṗ     - pop (implicit range)     = [   1 ,   2 ,   3 ,... ,                  n-1   ]
 ż      - zip                      = [[2,1],[3,2],[4,3],... ,             [n , n-1]  ]
   V    - evaluate as Jelly code   = [ 21  , 32  , 43  ,... ,         int("n"+"n-1") ]
    ÆP  - is prime? (vectorises)   = [  0  ,  0  ,  1  ,... , isPrime(int("n"+"n-1"))]
      S - sum
Джонатан Аллан
источник
TIO не для меня, может быть, он только что вернулся?
Конор О'Брайен
1
Исправлено 2 минуты назад :)
Джонатан Аллан
Прекрасный! Этот zip(head(), pop())трюк действительно крутой. :)
DJMcMayhem
В какой кодировке это 7 байтов?
kylefinn
1
@kylefinn Jelly имеет свою собственную кодовую страницу, нажмите на ссылку байтов в заголовке, чтобы увидеть ее.
Джонатан Аллан
8

Haskell , 80 75 70 байт

5 байтов сэкономить благодаря Laikoni

p x=all((>0).mod x)[2..x-1]
g n=sum[1|x<-[4..n],p$read$show=<<[x,x-1]]

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

Мастер пшеницы
источник
1
Я думаю, что вы можете использовать более короткое простое испытание, p x=all((>0).mod x)[2..x-1]которое не выполняется в течение 1, но в этом случае это не должно иметь значения.
Лайкони
1
Также show x++show(x-1)может быть сокращено до show=<<[x,x-1].
Лайкони
@Laikoni Спасибо за советы! Я думал, что это showможно сделать более коротким способом, но по какой-то причине я не думал о карте concat.
Пшеничный волшебник
6

Желе , 12, 10 , 8 байтов

;’VÆPµ€S

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

1-2 байта сохранены благодаря @ nmjmcman101, и 2 байта сохранены благодаря @Dennis!

Объяснение:

     µ€   # For N in range(input()):
;         #   Concatenate N with...
 ’        #   N-1
  V       #   And convert that back into an integer
   ÆP     #   Is this number prime?
       S  # Sum that list 
DJMcMayhem
источник
Вы можете просто отбросить R и использовать неявный диапазон?
nmjcman101
@ nmjcman101 Я совершенно не знал, что это была вещь. Благодарность!
DJMcMayhem
5

05AB1E , 9 8 7 байт

Код

ƒNN<«pO

Использует кодировку 05AB1E . Попробуйте онлайн!

объяснение

ƒ          # For N in [0 .. input]..
 NN<«      #   Push n and n-1 concatenated
     p     #   Check for primality
      O    #   Sum the entire stack (which is the number of successes)
Аднан
источник
Конечно, это использует тот факт, что 05AB1E игнорирует ошибки ... потому что я не думаю, что вы можете проверить, '0-1'является ли простое число.
Эрик Outgolfer
5

Шелуха , 13 11 10 байт

1-индексированный раствор:

#ȯṗdS¤+d←ḣ

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

Ungolfed / Пояснение

         ḣ -- in the range [1..N]
#          -- count the number where the following predicate is true
        ←  --   decrement number,
    S  d   --   create lists of digits of number and decremented 
     ¤+    --   concatenate,
   d       --   interpret it as number and
 ȯṗ        --   check if it's a prime number

Спасибо @Zgarb за -3байты!

ბიმო
источник
1
£İpэквивалентно . Кроме того, вы можете сохранить байт #…ḣвместо £f…N.
Згарб
4

Python 2 , 87 байт

-2 байта благодаря @officialaimm . 1-индексироваться.

lambda n:sum(all(z%v for v in range(2,z))for i in range(4,n+1)for z in[int(`i`+`i-1`)])

Тестирование.

Мистер Xcoder
источник
Я играю в гольф как можно скорее. Предложения приветствуются.
г-н Xcoder
87 байт
officialaimm
4

Pyth , 12 байт

smP_s+`d`tdS

Попробуйте онлайн! или Проверьте все тестовые случаи.


Как?

smP_s+`d`tdSQ  -> Full Program. Takes input from Standard Input. Q means evaluated input
                  and is implicit at the end.

 m         SQ  -> Map over the Inclusive Range: [1...Q], with the current value d.
    s+`d`td    -> Concatenate: d, the current item and: td, the current item decremented. 
                  Convert to int.
  P_           -> Prime?
s              -> Sum, counts the occurrences of True.
Мистер Xcoder
источник
4

Japt , 15 14 12 11 9 8 байт

1-индексироваться.

ÇsiZÄÃèj

Попытайся

Ç            :Map each Z in the range [0,input)
 s           :  Convert to string
  i          :    Prepend
   ZÄ        :    Z+1
     Ã       :End map
      è      :Count
       j     :  Primes
мохнатый
источник
1
11 байт
Оливер
Г! Почему у меня такая слепая точка для Æи Ç?! Спасибо, @Oliver; Я обновлю, когда вернусь к компьютеру.
Лохматый
2o+X(с завершающим пробелом) будет работать вместо [XXÉ], хотя, если я когда-нибудь найду автоматическую балансировку []скобок, ваше решение будет на байт короче. (На самом деле 2, так как вы могли бы это сделать õ_ZÉ]¬nÃèj)
ETHproductions
@ETHproductions: В настоящее время первое, что я делаю при работе с массивом, это проверка, добавлена ​​ли автоматическая балансировка []! : D
Лохматый
По некоторым причинам я думаю, что точки с запятой также полностью перестали работать, поэтому я попытаюсь это исправить. Не думай, что у меня будет шанс до завтрашнего дня.
ETHproductions
3

Рёда , 73 байта

{seq 3,_|slide 2|parseInteger`$_2$_1`|{|i|[1]if seq 2,i-1|[i%_!=0]}_|sum}

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

1-индексироваться. Он использует поток для ввода и вывода.

Объяснение:

{
seq 3,_| /* Create a stream of numbers from 3 to input */
slide 2| /* Duplicate every number except the first and the last
            to create (n-1,n) pairs */
parseInteger`$_2$_1`| /* Concatenate n and n-1 and convert to integer */
{|i| /* For every i in the stream: */
    [1]if seq 2,i-1|[i%_!=0] /* Push 1 if i is a prime
                                (not divisible by smaller numbers) */
}_|
sum /* Return the sum of numbers in the stream */
}
fergusq
источник
2

Pyth , 14 байт

lfP_Tms+`d`tdS

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

объяснение

              Q    # Implicit input
             S     # 1-indexed range
     m             # For d in range [1, Q]...
      s+`d`td      # Concatenate d and d - 1
 fP_T              # Filter on primes
l                  # Return the length of the list
Джим
источник
Вы опередили меня на несколько секунд, я опередил вас на несколько байтов: P
Mr. Xcoder
@ Mr.Xcoder Моя первая версия была lfTmP_s+`d`tdS, к сожалению, я не нашел твой трюк в то время сам :)
Джим
2

Perl 6 , 45 байт

{first :k,$_,grep {is-prime $_~.pred},1..∞}

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

grepПроизводит последовательность квалифицируя числа, то мы ищем ключ ( :k) (т.е. индекс) на firstномере в списке , что равняется входной параметр $_.

Шон
источник
30 байтов
Джо Кинг
2

C, 99 94 байта

1 проиндексировано. Мне больно писать тесты на простоту, которые в вычислительном отношении расточительны, но байты - это байты.

Если мы допустим некоторые действительно хрупкие вещи, компилируя на моей машине без оптимизации с помощью GCC 7.1.1, будут работать следующие 94 байта (спасибо @Conor O'Brien )

i,c,m,k;f(n){c=i=1;for(;++i<n;c+=m==k){for(k=m=1;m*=10,m<i;);for(m=i*m+i-1;++k<m&&m%k;);}n=c;}

в противном случае эти гораздо более надежные 99 байтов делают свою работу

i,c,m,k;f(n){c=i=1;for(;++i<n;c+=m==k){for(k=m=1;m*=10,m<i;);for(m=i*m+i-1;++k<m&&m%k;);}return c;}

Полная программа, немного более читабельная:

i,c,m,k;
f(n){
    c=i=1;
    for(;++i<n;c+=m==k){
        for(k=m=1;m*=10,m<i;);
        for(m=i*m+i-1;++k<m&&m%k;);
    }
    return c;
}

int main(int argc, char *argv[])
{
    printf("%d\n", f(atoi(argv[1])));
    return 0;
}
algmyr
источник
В зависимости от вашего компилятора, вы можете сохранить несколько байтов, используя n=c;вместо return c;:i,c,m,k;f(n){c=i=1;for(;++i<n;c+=m==k){for(k=m=1;m*=10,m<i;);for(m=i*m+i-1;++k<m&&m%k;);}n=c;}
Conor O'Brien
Я не могу сказать, что хочу использовать вещи, которые, кажется, даже меняются в зависимости от уровня оптимизации. Использование GCC без оптимизации -O0 работает, с другими флагами оптимизации - нет. Интересно, что -O1 -O2 и -O3 возвращает 0, с -Os возвращает 1, с -Og возвращает n-1.
17
Вы всегда можете указать в своем ответе, как ваша программа должна быть скомпилирована.
Конор О'Брайен
Я думаю, чувствует себя немного дешево. Но я могу добавить альтернативу.
Альгмир
Я понимаю, но я бы не чувствовал себя плохо из-за этого - это один из советов для игры в гольф в Си
Конор О'Брайен
2

JavaScript (ES6),  49 48  47 байт

1-индексироваться. Ограничено размером стека вызовов вашего движка.

f=n=>n&&f(n-2)+(p=n=>n%--x?p(n):x<2)(x=n+[--n])

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

Arnauld
источник
1

Mathematica, 77 байтов

Position[Select[Range@#,PrimeQ@FromDigits[Join@@IntegerDigits/@{#,#-1}]&],#]&
J42161217
источник
0

QBIC , 25 байтов

[:|p=p-µa*z^_l!a$|+a-1}?p

объяснение

[:|     FOR a = 1 to <n>
p=p-    Decrement p (the counter) by
µ       -1 if the following is prime, or 0 if not
        For the concatenating, we multiply 'a' by 10^LENGTH(a), then add a-1$┘p
        Example 8, len(8) = 1, 8*10^1 = 80, add 8-1=7, isPrime(87) = 0
a*z^_l!a$|+a-1
}       Close the FOR loop - this also terminates the prime-test
?p      Print p, the 0-based index in the sequence.

Для этого используется довольно сложная математическая вещь с наложенным приведением к строке. Создание версии, которая выполняет только конкатенацию на основе строк, на один байт длиннее:

[:|A=!a$+!a-1$┘p=p-µ!A!}?p
steenbergh
источник
0

PHP , 203 байта

<?php $n=($a=$argv[1]).($a-1);$p=[2];$r=0;for($b=2;$b<=$n;$b++){$x=0;if(!in_array($b,$p)){foreach($p as $v)if(!($x=$b%$v))break;if($x)$p[]=$b;}}for($b=1;$b<=$a;$b++)if(in_array($b.($b-1),$p))$r++;die $r;

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

Использует индекс на основе 1 для вывода. Ссылка TIO имеет читабельную версию кода.

Mic1780
источник
0

Рубин , 42 + 9 = 51 байт

Использует -rprime -nфлаги. 1-индексироваться.

Работает путем подсчета всех чисел, равных или меньших от входных данных, которые удовлетворяют условию (или, более технически, всех чисел, которые удовлетворяют n-1условию). Поскольку входные данные гарантированно находятся в последовательности, нет риска ошибки случайного входа 7, который не «становится простым».

p (?3..$_).count{|i|eval(i.next+i).prime?}

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

Значение чернил
источник
0

Python 2 , 85 байт

1-индексированных

lambda n:sum(all(z%v for v in range(2,z))for i in range(3,n)for z in[int(`i+1`+`i`)])

Тест

Улучшение ответа г-на Xcoder

Халвард Хаммель
источник
0

Java 8, 108 байт

n->{for(long r=0,q=1,z,i;;){for(z=new Long(q+""+~-q++),i=2;i<z;z=z%i++<1?0:z);if(z>1)r++;if(q==n)return r;}}

0 индексированные

Объяснение:

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

n->{                             // Method with integer parameter and long return-type
  for(long r=0,                  //  Result-long, starting at 0
      q=1,                       //  Loop integer, starting at 1
      z,i;                       //  Temp integers
      ;){                        //  Loop indefinitely
    for(z=new Long(q+""+~-q++),  //   Set z to `q` concatted with `q-1`
        i=2;i<z;z=z%i++<1?0:z);  //   Determine if `z` is a prime,
      if(z>1)                    //   and if it indeed is:
        r++;                     //    Increase the result-long by 1
      if(q==n)                   //   If `q` is now equal to the input integer
        return r;}}              //    Return the result
Кевин Круйссен
источник
0

Stax , 10 байт

1- Индексируется

Äm▬á┌╕|°φ♦

Запустите и отладьте его Объяснение

Rxr\{$e|pm|+         #Full program, unpacked, implicit input  (Example (4))
R                    #Create [1 to input] range  (ex [1,2,3,4] )             
 x                   #Copy value from x register (ex (4) )
  r                  #Create [0 to input-1] range (ex [0,1,2,3)
   \                 #Create array pair using the range arrays (ex [[1,0],[2,1],[3,2],[4,3]])
    {    m           #Map block
     $e|p            #To string, eval string (toNum), isPrime (ex [1,0] => "10" => 10 => 0)
          |+         #Sum the array to calculate number of truths (ex [0,0,0,1] => 1)
много
источник
0

Приборка , 33 байта

index({n:prime(n.n-1|int)}from N)

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

объяснение

Основная идея состоит в том, чтобы создать последовательность действительных чисел, а затем вернуть функцию индекса с карри.

index({n:prime(n.n-1|int)}from N)
      {n:                }from       select all numbers `n` from...
                               N     the set of natural numbers, such that:
               n.n-1                     `n` concatenated with `n-1`
                    |int                 ...converted to an integer
         prime(         )                ...is prime
index(                          )    function that returns index of input in that sequence
Конор О'Брайен
источник