Чи можуть навіть числа стати простими?


24

Послідовність

Всім відомо, що єдине парне число є простим 2. Хо-гул. Але, є певні парні числа 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

1
Чому ви повинні це робити в зворотному порядку? cQuents не має такого режиму :(
Stephen

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

ТІО не для мене, можливо, воно просто повернулося?
Conor O'Brien

1
Виправлено станом на 2 хвилини тому :)
Джонатан Аллан

Гарний! Та zip(head(), pop())хитрість справді класна. :)
DJMcMayhem

У якому кодуванні є 7 байт?
kylefinn

1
@kylefinn Jelly має власну кодову сторінку, натисніть посилання байтів у заголовку, щоб побачити її.
Джонатан Аллан

8

Хаскелл , 80 75 70 байт

5 байт економте завдяки Лайконі

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можна зробити більш коротким методом, але я чомусь не думав про складну карту.
Пшеничний майстер

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 

Чи можете ви просто скинути 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'є простим.
Erik the Outgolfer

5

Лушпиння , 13 11 10 байт

1-індексний розчин:

#ȯṗdS¤+d←ḣ

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

Безголів / пояснення

         ḣ -- 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

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.

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


Гах! Чому я маю таку сліпу для Æі Ç?! Спасибі, @Oliver; Я оновлю, коли повернусь до комп’ютера.
Кудлатий

2o+X(із заднім простором) буде працювати замість [XXÉ], хоча, якщо я коли-небудь обійдусь []дужками автоматичного врівноваження, ваше рішення буде на байт коротшим. (Насправді 2, оскільки ви могли потім зробити õ_ZÉ]¬nÃèj)
ETHproductions

@ETHproductions: У ці дні найпершим, що я роблю при роботі з масивом, є перевірка, чи додано автоматичне врівноваження []! : D
Shaggy

Я думаю, чомусь крапки з комою повністю перестали працювати, тому спробую це виправити. Не думаю, що я матиму шанс до завтра вдень, хоча.
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 */
}

2

Піт , 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
Містер Xcoder

@ Mr.Xcoder Моєю першою версією було те lfTmP_s+`d`tdS, що прикро, що я тоді не знайшов твою хитрість :)
Jim


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

Залежно від компілятора, ви можете зберегти деякі байти, скориставшись 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, не оптимізуючи -00, він працює, а інші оптимізаційні прапори - не. Цікаво, що -O1 -O2 і -O3 він повертає 0, при -Os повертає 1, при -Og повертає n-1.
algmyr

Ви завжди можете вказати у своїй відповіді, як слід складати вашу програму.
Conor O'Brien

Гадаю, відчуває себе трохи дешево. Але я можу додати альтернативу.
algmyr

Я розумію, але мені не було б погано робити це-- це - це одна з підказок щодо гольфу в C
Conor O'Brien


1

Математика, 77 байт

Position[Select[Range@#,PrimeQ@FromDigits[Join@@IntegerDigits/@{#,#-1}]&],#]&

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

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-посилання має читабельну версію коду.


0

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

Використовує -rprime -n прапори. 1-індексований.

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

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

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




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

Стакс , 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.