나는 'Redivosite'번호입니까?


26

레디 보 사이트는이 도전의 목적을 위해 고안된 포트만 토어입니다. Reduction, Division 및 Composite이 혼합되어 있습니다.

정의

주어진 정수 N> 6 :

  • 경우 N은 소수, N은 Redivosite 수 없습니다.
  • N 이 복합 인 경우 :
    • N ' 이 소수가 될 때까지 N'= N / d + d + 1을 반복적으로 계산합니다 . 여기서 d 는 1보다 큰 N 의 가장 작은 제수입니다.
    • 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 Number가 아닙니다
  • N = 32 : 32/2 + 3 = 19; 19는 제수 또는 32가 아니므로 32는 Redivosite Number가 아닙니다
  • N = 260 : 260/2 + 3 = 133, 133/7 + 8 = 27, 27/3 + 4 = 13; 13은 제수 또는 260이므로 260은 Redivosite Number입니다.

당신의 작업

  • 정수 N이 주어지면, Redivosite Number이면 참 값을, 그렇지 않으면 거짓 값을 반환합니다. (일관된 한 두 개의 고유 한 값을 출력 할 수도 있습니다.)
  • 입력은 6 보다 커야 합니다.
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다!

13
저는 특정 속성을 가진 일련의 숫자 인 이러한 "숫자 순서"도전이 결정 문제로 요구되기를 정말로 바랍니다. 나는 이것을 직접 생성 할 수있는 방법이 있는지 의심 스럽기 때문에 가능한 유일한 해결책은 결정 문제를 해결 한 다음이 속성을 만족시키는 N 번째 또는 첫 번째 N 또는 모든 정수를 찾는 루프로 감싸는 것입니다.
Martin Ender

3
나는 일반적으로 의사 결정 문제 가 아닌 시퀀스 문제를 좋아 하지만, 이것에 대해 의사 결정 문제 가 더 적합 할 것이라고 생각합니다 . 나는 n 번째 또는 첫 번째 n 을 영리하게 인쇄하는 용어 사이에 아무런 관계 없으므로 n 을 입력으로 사용하고 그것이 redivosite 인지 확인 하도록 허용 할 수 있습니까?
Mr. Xcoder

1
@MartinEnder & Mr.Xcoder 그것은 나의 첫 번째 의도 (따라서 롤백 한 원래 타이틀)이었고 마음이 바뀌 었습니다. 나는 이것이 당신이 말한 이유로 WIP 솔루션을 망치지 않아야한다고 생각하므로 그것을 편집했습니다.
Arnauld

5
@ Mr.Xcoder 그래, 그게 내가 의미 한 바야. 실제로 시퀀스로 의미가있는 시퀀스 문제는 신경 쓰지 않습니다 ( a(n)직접 계산할 수 있거나 이전 항목에서 용어를 계산할 수 있기 때문에). 도전에 변화를 준 Arnauld에게 감사합니다. :)
Martin Ender

답변:


9

하스켈, 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 -3, @BMO 덕분 바이트 @ H.PWiz 및 덕분에 바이트 -5 Ørjan 요한센 @ -6 바이트 감사




@ ØrjanJohansen : 다시 감사합니다.
nimi

6

껍질 , 14 바이트

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

온라인으로 사용해보십시오!

H.PWiz 덕분에 -3 .


내부에 더 깨끗한 기능을 가진 14 바이트Ω
H.PWiz

@ H.PWiz는 이해할 수 없습니다 Γ...
Outgolfer Erik

여기 Γ에 [a, b, c ...] 목록이 주어지면 and에 적용 ~+→Π됩니다 . 에 추가 합니다 . 가장 작은 제수 는a[b,c...]~+→Πa+1product[b,c...]aproduct[b,c...]N/d
H.PWiz

@ H.PWiz 그리고 나는 주요 요소를 사용하려고 생각했습니다 ...
Outgolfer Erik

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

파이썬 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 (값)으로 바꿉니다. 그만큼
                 || 시작 값이 입력입니다.
    tPH || 첫 번째 함수 A. 단일 인수 H를 사용합니다.
     PH || .. H의 주요 요인
    t || .. 꼬리 (첫 번째 요소 제거). 진실한 반면 (H는 합성) :
       h + / ZKhPZK || 두 번째 함수 B. 단일 인수 Z를 취합니다.
         / Z || .. Z를 다음과 같이 나눕니다.
           KhP || .. 가장 낮은 소인수를 K에 할당합니다.   
       h || .. 증가.
        + K || 그리고 K를 추가하십시오.
iI || 결과 (마지막 값)가 입력을 나누는 지 확인하십시오.

그리고 처음 4 바이트 ( <P_Q)는 입력이 소수가 아닌지 확인합니다.

Emigna의 도움으로 3 바이트를 절약 할 수있었습니다.


1보다 큰 최소 제수가 항상 소수이므로 부품 head(P)대신 비슷한 것을 사용할 수 있습니까 fiITZ2?
Emigna

@Emigna Ninja'd, 고정 및 감사합니다!
Mr. Xcoder

2

파이썬 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.
  • 처음에는 배열 sN+10 으로 초기화 됩니다 (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.
  • 마지막 두 줄은 n//s[n]-~s[n]==를 제외하고 간단 (n // s[n]) + s[n] + 1합니다.


파이썬 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)시간 복잡성 에서 실행되며 , 파이썬 슬라이스의 합리적인 구현을 가정합니다)


동등한 전체 프로그램은 117 바이트 입니다.


149 바이트 n//s[n]-~s[n]대신 사용할 수 있습니다 n//s[n]+s[n]+1.
Mr. Xcoder

@ Mr.Xcoder 감사합니다!
user202729

또한 나는 생각 or p될 수있다|p
씨 Xcoder

@ Mr.Xcoder 아니요, or p논리 또는 |p비트 단위 또는 비트 단위 를 수행합니다. 즉, a or b이다 b if a == 0 else a.
user202729

슬라이스 대신 다른for 것을 사용for 하도록 외부 를 수정할 수 있습니다 . 가 range낮은 인덱스가 큰 사람을 덮어하고있는 슬라이스를 시작 있도록, 반대로 2*p당신은 대체하지 않습니다 s[0]s[p].
Rod




1

apt, 25 24 바이트

나는 이것으로 잘못된 방향으로 나아 갔을 까 두려워하지만 다른 접근법을 시도하기에는 시간이 부족합니다.

0false 또는 1true로 출력 합니다.

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

시도 해봐


0

펄 5 , 291 + 1 (-a) = 292 바이트

기본 프라임 검사기가없는 Darn Perl.

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:)^:_

온라인으로 사용해보십시오!

첫 번째 주요 요소 인 최소 제수는 @Dennis의 Jelly 솔루션에서 도난당했습니다 (이전에는을 사용했습니다 <./@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

Pyt , 44 바이트

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

설명은 아래 코드를 참조하십시오. 유일한 차이점은 (1) 루프 시작시 증분을 설명하기 위해 N이 감소하고 (2) OR 대신 NOR을 사용한다는 것입니다.

온라인으로 사용해보십시오!



나는 질문을 다시 읽기 전에 이것을 만들고 그것이 참 / 거짓만을 원한다는 것을 알았습니다.

Pyt, 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)


온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.