Я номер "Redivosite"?


26

Redivosite - слово портманто, придумане єдиною метою цього виклику. Це поєднання скорочення, поділу та композиту.

Визначення

Дано ціле число N> 6 :

  • Якщо N є простим, N не є числом Redivosite.
  • Якщо N складений:
    • багаторазово обчислюйте N '= N / d + d + 1, поки N' є простим, де d - найменший дільник N, більший за 1
    • N - число Redivosite тоді і лише тоді, коли кінцеве значення N ' - дільник N

Нижче наведено 100 перших номерів Redivosite (без запису OEIS на момент публікації):

14,42,44,49,66,70,143,153,168,169,176,195,204,260,287,294,322,350,414,462,518,553,572,575,592,629,651,702,726,735,775,806,850,869,889,891,913,950,1014,1023,1027,1071,1118,1173,1177,1197,1221,1235,1254,1260,1302,1364,1403,1430,1441,1554,1598,1610,1615,1628,1650,1673,1683,1687,1690,1703,1710,1736,1771,1840,1957,1974,2046,2067,2139,2196,2231,2254,2257,2288,2310,2318,2353,2392,2409,2432,2480,2522,2544,2635,2640,2650,2652,2684,2717,2758,2760,2784,2822,2835

Приклади

  • N = 13 : 13 є простим, тому 13 не є числом Redivosite
  • N = 32 : 32/2 + 3 = 19; 19 не є дільником або 32, тому 32 не є числом повторних сайтів
  • N = 260 : 260/2 + 3 = 133, 133/7 + 8 = 27, 27/3 + 4 = 13; 13 - дільник або 260, тому 260 - це число Redivosite

Ваше завдання

  • Враховуючи ціле число N , поверніть триєдне значення, якщо це число Redivosite або фальшиве значення в іншому випадку. (Ви також можете виводити будь-які два різних значення, якщо вони несуперечливі.)
  • Гарантований вхід буде більшим за 6 .
  • Це , тому найкоротша відповідь у байтах виграє!

13
Я дійсно бажаю, щоб усі ці виклики "послідовності чисел", які є лише послідовностями чисел із певним властивістю, просто задавалися б як проблеми з рішенням. Я дуже сумніваюся, що існує який-небудь спосіб їх генерування безпосередньо, тому єдино можливим рішенням є вирішення проблеми рішення, а потім загортання в цикл, який знаходить Nth або перший N або всі цілі числа, які задовольняють цю властивість.
Мартін Ендер

3
Мені подобаються послідовність викликів, які взагалі не є проблемами вирішення , але для цього я думаю, що проблема рішення була б краще підходить. Я не бачу зв'язку між термінами, такими, що ви друкуєте n- й чи перший n влучно , тож, можливо, дозвольте взяти n як введення та перевірити, чи він є повторним ?
Містер Xcoder

1
@MartinEnder & Mr.Xcoder Це був мій початковий намір (звідси оригінальна назва, до якої я щойно відмовився), і я передумав. Напевно, це не повинно погіршити жодне рішення WIP (з тих причин, якими ви говорите), тому я його відредагував.
Арнольд

5
@ Mr.Xcoder Так, саме це я мав на увазі. Я не проти викликів послідовності, які насправді мають сенс як послідовності (або тому, що ви можете обчислити a(n)безпосередньо, або тому, що ви можете обчислити термін з попередніх). Дякую, Арнольд, що змінив виклик. :)
Мартін Ендер

Відповіді:


9

Haskell, 91 85 83 80 75 74 байт

n#m=([n#(div m d+d+1)|d<-[2..m-1],mod m d<1]++[mod n m<1&&m<n])!!0
f x=x#x

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

f x=x#x                           -- call # with x for both parameters
n#m               
         |d<-[2..m-1],mod m d<1   -- for all divisors d of m
    [n#(div m d+d+1)           ]  -- make a list of recursive calls to #,
                                  -- but with m set to m/d+d+1
   ++ [mod n m<1&&m<n]            -- append the Redivosite-ness of n (m divides n,
                                  -- but is not equal to n)
                           !!0    -- pick the last element of the list
                                  -- -> if there's no d, i.e. m is prime, the
                                  --    Redivosite value is picked, else the
                                  --    result of the call to # with the smallest d

Редагувати: -2 байти завдяки @BMO, -3 байти завдяки @ H.PWiz і -5 -6 байт завдяки @ Ørjan Johansen




@ ØrjanJohansen: Ще раз дякую.
німі

6

Лушпиння , 14 байт

?¬Ṡ¦ΩṗoΓ~+→Πpṗ

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

-3 завдяки H.PWiz .


14 байт із функцією очищення всерединіΩ
H.PWiz

@ H.PWiz просто не можу зрозуміти Γ...
Erik the Outgolfer

Тут Γнаведений список [a, b, c ...] застосовуватиметься ~+→Πдо aта [b,c...]. ~+→Πдодає a+1до product[b,c...]. aце найменший дільник, product[b,c...]цеN/d
H.PWiz

@ H.PWiz І я думав про використання основних факторів ...
Ерік Аутгольфер

6

C (gcc) , 94 89 байт

m,n;o(k){for(m=1;m++<k;)if(k%m<1)return m;}
F(N){for(n=N;m=o(n),m-n;n=n/m-~m);N=m<N>N%n;}

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

Пояснення

m,n;                  // two global integers
o(k){                 // determine k's smallest divisor
 for(m=1;m++<k;)      // loop through integers 2 to n (inclusive)
  if(k%m<1)return m;} // return found divisor
F(N){                 // determine N's redivosity
 for(n=N;             // save N's initial value
  m=o(n),             // calculate n's smallest divisor (no name clash regarding m)
  m-n;                // loop while o(n)!=n, meaning n is not prime
                      //  (if N was prime, the loop will never be entered)
  n=n/m-~m);          // redivosite procedure, empty loop body
 N=m<N>N%n;}          // m<N evaluates to 0 or 1 depending on N being prime,
                      //  N%n==0 determines whether or not N is divisible by n,
                      //  meaning N could be redivosite => m<N&&N%n==0
                      //  <=> m<N&&N%n<1 <=> m<N&&1>N%n <=> (m<N)>N%n <=> m<N>N%n

4

Желе , 14 байт

ÆḌḊ
Ç.ịS‘µÇ¿eÇ

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

Як це працює

ÆḌḊ         Helper link. Argument: k

ÆḌ          Yield k's proper (including 1, but not k) divisors.
  Ḋ         Dequeue; remove the first element (1).


Ç.ịS‘µÇ¿eÇ  Main link. Argument: n

     µ      Combine the links to the left into a chain.
      Ç¿    While the helper link, called with argument n, returns a truthy result,
            i.e., while n is composite, call the chain to the left and update n.
Ç             Call the helper link.
 .ị           At-index 0.5; return the elements at indices 0 (last) and 1 (first).
              This yields [n/d, d].
   S          Take the sum.
    ‘         Increment.
        Ç   Call the helper link on the original value of n.
       e    Test if the result of the while loop belongs to the proper divisors.

4

Python 2 , 97 91 байт

r=0;e=d=i=input()
while r-e:e=i;r=[j for j in range(2,i+1)if i%j<1][0];i=i/r-~r
d%e<1<d/e<q

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

Виводи за допомогою коду виходу.

Безголівки:

r = 0                             # r is the lowest divisor of the current number,
                                  # initialized to 0 for the while loop condition.
e = d = i = input()               # d remains unchanged, e is the current number
                                  # and i is the next number.
while r != e:                     # If the number is equal to its lowest divisor,
                                  # it is prime and we need to end the loop.
    e = i                         # current number := next number
    r = [j for j in range(2, i+1) # List all divisors of the number in the range [2; number + 1)
         if i%j < 1][0]           # and take the first (lowest) one.
    i = i/r+r+1                   # Calculate the next number.
                                  # We now arrived at a prime number.
print d%e == 0 and d != e         # Print True if our current number divides the input
                                  # and is distinct from the input.
                                  # If our current number is equal to the input,
                                  # the input is prime.

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


3

05AB1E , 17 16 байт

[Dp#Òć©sP+>]Ö®p*

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

Пояснення

[                  # start loop
 Dp#               # break if current value is prime
    Ò              # get prime factors of current value
     ć©            # extract the smallest (d) and store a copy in register
       sP          # take the product of the rest of the factors
         +>        # add the smallest (d) and increment
           ]       # end loop
            Ö      # check if the input is divisible by the resulting prime
             ®p    # check if the last (d) is prime (true for all composite input)
               *   # multiply

2

Pyth , 20 байт

<P_QiI.WtPHh+/ZKhPZK

Спробуйте тут!

Як це працює

iI.WtPHh + / ZKhPZK || Повна програма.

  .W || Функціональний час. Він виконує дві функції як аргументи, A і B.
                 || Поки A (значення) є правдоподібним, перетворіть це значення на B (значення). The
                 || вихідне значення - це вхід.
    tPH || Перша функція, А. Бере єдиний аргумент, Н.
     PH || .. Основні фактори чинників H.
    t || .. Хвіст (видаліть перший елемент). У той час як truthy (H є композиційним):
       h + / ZKhPZK || Друга функція, B. Бере єдиний аргумент, Z:
         / Z || .. Розділіть Z на:
           ХП || .. Найнижчий простий коефіцієнт, і призначте його К.   
       h || .. Приріст.
        + К || І додамо К.
iI || Перевірте, чи ділиться результат (останнє значення).

І перші 4 байти ( <P_Q) просто перевірте, чи вхід не є простим.

За допомогою Еміньї мені вдалося зберегти 3 байти.


Чи можете ви використовувати щось на зразок head(P)замість fiITZ2частини, оскільки найменший дільник, більший за 1, завжди буде простим?
Емінья

@Emigna Ninja'd, виправлено і дякую!
Містер Xcoder

2

Python 3 , 149 байт

def f(N):
	n=N;s=[0]*-~N
	for p in range(2,N):
		if s[p]<1:
			for q in range(p*p,N+1,p):s[q]=s[q]or p
	while s[n]:n=n//s[n]-~s[n]
	return s[N]>1>N%n

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

Використання ситового підходу. Має бути швидким ( O(N log log N)= складність часу сито Ератосфена) навіть з великими N(але зберігає O(N)цілі числа в пам'яті)

Примітка:

  • Можна довести, що всі проміжні значення nне перевищують N, а для N > 7 pможуть бути range(2,N)замість range(2,N+1)просіювання.
  • /не працює, його //потрібно використовувати через індекс списку.
  • На rangeжаль, зберігання в іншій змінній не допомагає.

Пояснення:

  • -~N== N+1.
  • Спочатку масив sініціалізується N+1нулями (Python - 0-індексація, значить, індекси 0..N)
  • Після ініціалізації, s[n]як очікується, буде 0чи nце просте, і pдля pмінімального штриха , який ділить nякщо nє складовим. s[0]а s[1]значення не важливі.
  • Для кожного pв діапазоні [2 .. N-1]:

    • Якщо s[p] < 1(тобто s[p] == 0), то pце просто, і для кожного, qщо є кратним pі s[q] == 0, призначити s[q] = p.
  • Останні 2 рядки є прямими, крім цього n//s[n]-~s[n]== (n // s[n]) + s[n] + 1.


Python 3 , 118 байт

def f(N):
	n=N;s=[0]*-~N
	for p in range(N,1,-1):s[2*p::p]=(N-p)//p*[p]
	while s[n]:n=n//s[n]-~s[n]
	return s[N]>1>N%n

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

Ціною трохи гіршої продуктивності. (Це працює у O(N log N)часовій складності, припустимо розумну реалізацію фрагментів Python)


Еквівалентна повна програма - 117 байт .


Ви можете використовувати n//s[n]-~s[n]замість n//s[n]+s[n]+1149 байт.
Містер Xcoder

@ Mr.Xcoder Дякую!
користувач202729

Також я думаю, що or pможе бути|p
містер Xcoder

@ Mr.Xcoder Ні, or pвиконує логічне або, під час |pвиконання порозрядних або. Тобто a or bє b if a == 0 else a.
користувач202729

Ви можете змінити зовнішній, forщоб використовувати фрагмент замість іншогоfor . Зворотний range, тому нижчі індекси замінять більші, і запуск фрагмента у 2*pвас не замінить s[0]або s[p].
Стержень




1

Japt, 25 24 байт

Я боюся, що я, можливо, пішов у неправильному напрямку з цим, але мені не вистачило часу, щоб спробувати інший підхід.

Виходи 0для помилкових або 1для істинних.

j ?V©vU :ßU/(U=k g)+°UNg

Спробуй це


0

Perl 5 , 291 + 1 (-a) = 292 байт

Дарн Перл за те, що він не мав місцевої шашки.

use POSIX;&r($_,$_);
sub p{$n=shift;if($n<=1){return;}if($n==2||$n==3){return 1;}if($n%2==0||$n%3==0){return;}for(5..ceil($n/2)){if($n%$_==0){return;}}return 1;}
sub r{$n=shift;$o=shift;if(&p($n)){print $o%$n==0&&$n!=$o?1:0;last;}for(2..ceil($n/2)){if($n%$_==0){&r(($n/$_)+$_+1, $o);last;}}}

Безгольова версія,

use POSIX;
&r($_,$_);
sub p{
    my $n=shift;
    if($n<=1){
        return;
    }
    if($n==2||$n==3){
        return 1;
    }
    if($n%2==0||$n%3==0){
        return;
    }
    for(5..ceil($n/2)){
        if($n%$_==0){
            return;
        }
    }
    return 1;
}
sub r{
    my $n=shift;
    my $o=shift;
    if(&p($n)){
        print $o%$n==0&&$n!=$o ? 1 : 0;
        last;
    }
    for(2..ceil($n/2)){
        if($n%$_==0){
            &r(($n/$_)+$_+1, $o);
            last;
        }
    }
}

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




0

J , 35 байт

(~:*0=|~)(1+d+]%d=.0{q:)^:(0&p:)^:_

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

Мінімальний дільник, який був першим простим фактором, був викрадений з розчину Jelly @ Dennis (раніше я використовував) <./@q: ).

Має бути кращий спосіб зробити ітерацію, але я не можу її знайти. Я думав уникати робити тест на первинність ( ^:(0&p:)) і замість цього використовувати несприятливі, але здається, що це буде трохи довше, оскільки вам знадобиться_2{ деякі зміни, які можуть не призвести до чистого зменшення.

Я дійсно відчуваю, що повинен бути спосіб уникнути наявності паренів навколо перевірки первинності.

Пояснення (розширене)

(~: * 0 = |~)(1 + d + ] % d =. 0 { q:) ^: (0&p:) ^:_ Input: N
             (1 + d + ] % d =. 0 { q:) ^: (0&p:) ^:_ Find the final N'
                                       ^:        ^:_  Do while
                                           0&p:       N is not prime
                                   q:                 Get prime factors (in order)
                               0 {                    Take first (smallest divisor)
                          d =.                        Assign this value to d
             1 + d + ] %  d                           Compute (N/d) + 1 + d
(~: * 0 = |~)                                        Is it redivosite?
      0 = |~                                          N = 0 (mod N'), i.e. N'|N
    *                                                 And
 ~:                                                   N =/= N', i.e. N is not prime

0

APL NARS, 43 символи, 85 байт

{(⍵≤6)∨0π⍵:0⋄⍵{1=⍴t←π⍵:0=⍵|⍺⋄⍺∇1+↑t+⍵÷↑t}⍵}

(сподіваючись, що він збіжиться на всі числа> 6) тест:

h←{(⍵≤6)∨0π⍵:0⋄⍵{1=⍴t←π⍵:0=⍵|⍺⋄⍺∇1+↑t+⍵÷↑t}⍵}
v←⍳100     
v,¨h¨v
   1 0  2 0  3 0  4 0  5 0  6 0  7 0  8 0  9 0  10 0  11 0
   12 0  13 0  14 1  15 0  16 0  17 0  18 0  19 0  20 0  
   21 0  22 0  23 0  24 0  25 0  26 0  27 0  28 0  29 0  
   30 0  31 0  32 0  33 0  34 0  35 0  36 0  37 0  38 0  
   39 0  40 0  41 0  42 1  43 0  44 1  45 0  46 0  47 0  
   48 0  49 1  50 0  51 0  52 0  53 0  54 0  55 0  56 0  
   57 0  58 0  59 0  60 0  61 0  62 0  63 0  64 0  65 0  
   66 1  67 0  68 0  69 0  70 1  71 0  72 0  73 0  74 0  
   75 0  76 0  77 0  78 0  79 0  80 0  81 0  82 0  83 0  
   84 0  85 0  86 0  87 0  88 0  89 0  90 0  91 0  92 0  
   93 0  94 0  95 0  96 0  97 0  98 0  99 0  100 0  

Ідея використання 2-х анонімних функцій я потрапляю до іншого рішення Apl.

 {(⍵≤60)∨π⍵:0⋄ -- if arg ⍵ is prime or <=6 return 0
  ⍵{1=⍴t←π⍵:0=⍵|⍺⋄ -- if list of factors ⍵ has length 1 (it is prime)
                    -- then return ⍺mod⍵==0
  ⍺∇1+↑t+⍵÷↑t}⍵}   -- else recall this function with args ⍺ and 1+↑t+⍵÷↑t

0

Піт , 44 байти

←⁻0`ŕ⁺ĐĐϼ↓Đ3Ș⇹÷+⁺Đṗ¬⇹⁻⇹łŕáĐ0⦋Đ↔ĐŁ⁻⦋⁺|¬⇹ṗ⇹3Ș⊽

Дивіться код нижче для пояснення - єдиними відмінностями є (1), що N зменшується раніше для обліку приросту на початку циклу, і (2) він використовує NOR замість АБО.

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



Я зробив це ще до того, як перечитав питання і помітив, що воно хоче лише правдивого / хибного.

Піт, 52 байти

60`ŕ⁺ĐĐϼ↓Đ3Ș⇹÷+⁺Đṗ¬⇹⁻⇹łŕáĐ0⦋Đ↔ĐŁ⁻⦋⁺|¬⇹Đṗ⇹3Ș∨ł⇹Đƥ⇹ŕ1ł

Друкує нескінченний список номерів Redivosite.

Пояснення:

6                                                            Push 6
 0                                                           Push unused character
  `                   ł                     ł      ł         Return point for all three loops
   ŕ                                                         Remove top of stack
    ⁺                                                        Increment top of stack (n)
     ĐĐ                                                      Triplicate top of stack (n)
       ϼ↓                                                    Get smallest prime factor of n (returns 1 if n is prime) 
         Đ                                                   Duplicate top of stack
          3Ș⇹                                                Manipulate stack so that the top is (in descending order): [d,(N,N'),d]
             ÷+⁺                                             Calculates N'=(N,N')/d+d+1
                Đṗ¬                                          Is N' not prime?
                   ⇹⁻⇹                                       Decrement N' (so the increment at the beginning doesn't change the value), and keep the boolean on top - end of innermost loop (it loops if top of stack is true)
                       ŕ                                     Remove top of stack
                        á                                    Convert stack to array
                         Đ                                   Duplicate array
                          0⦋Đ                                Get the first element (N)
                             ↔ĐŁ⁻⦋                           Get the last element ((final N')-1)
                                  ⁺                          Increment to get (final N')
                                   |¬                        Does N' not divide N?
                                     ⇹Đṗ                     Is N prime?
                                        ⇹3Ș∨                 Is N prime or does N' not divide N? - end of second loop (loops if top of stack is true)
                                             ⇹Đƥ⇹ŕ           Print N, and reduce stack to [N]
                                                  1          Push garbage (pushes 1 so that the outermost loop does not terminate)


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

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