私は「Redivosite」番号ですか?


26

Redivositeは、この課題の唯一の目的のために考案されたポルトマン語です。リダクション、ディビジョン、コンポジットの組み合わせです。

定義

整数N> 6が与えられた場合:

  • Nが素数の場合、NはRedivosite番号ではありません。
  • Nが複合の場合:
    • N 'が素数になるまでN' = N / d + d + 1を繰り返し計算します。dNの 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はRedivosite番号ではありません
  • N = 260:260/2 + 3 = 133、133 / 7 + 8 = 27、27 / 3 + 4 = 13; 13は除数または260なので、260はRedivosite番号です

あなたのタスク

  • 整数Nを指定すると、それがRedivosite Numberである場合は真実の値を返し、そうでない場合は偽の値を返します。(一貫性がある限り、2つの異なる値を出力することもできます。)
  • 入力は6より大きいことが保証されています。
  • これはなので、バイト単位の最短回答が勝ちです!

13
特定の特性を備えた単なる数字のシーケンスであるこれらの「数字のシーケンス」チャレンジが、決定問題として求められることを本当に望んでいます。これらを直接生成する方法があることは非常に疑わしいので、唯一の可能な解決策は、決定問題を解決してから、このプロパティを満たすN番目または最初のNまたはすべての整数を見つけるループにラップすることです。
マーティンエンダー

3
私は一般に決定問題ではないシーケンスの課題が好きですが、これには決定問題の方が適していると思います。n番目または最初のnを賢い方法で印刷するような用語の関係ありませんので、入力としてnを取り、それがredivositeであるかどうかを確認することを許可するかもしれません?
Xcoder氏18年

1
@MartinEnder&Mr.Xcoderそれが私の最初の意図であったため(元のタイトルにロールバックしたばかりです)、私は考えを変えました。これは(あなたが言う理由で)WIPソリューションを台無しにしないはずなので、編集しました。
アーナウルド

5
@ Mr.Xcoderええ、それは私が意図したことです。シーケンスとして実際に理にかなっているシーケンスの課題は気にしません(a(n)直接計算できるため、または前のものから項を計算できるため)。Arnauld、チャレンジを変えてくれてありがとう。:)
マーティン・エンダー

回答:


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

編集:@BMOのおかげで-2バイト、@ H.PWizのおかげで-3バイト、@ØrjanJohansenのおかげで-5 -6バイト




@ØrjanJohansen:どうもありがとう。
-nimi

6

、14バイト

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

オンラインでお試しください!

-3 H.PWizに感謝します


内部にクリーナー関数を含む14バイトΩ
-H.PWiz

H.PWiz @ただ理解できないΓ...
エリックOutgolfer

ここでΓ、与えられたリスト[a、b、c ...]はとに適用~+→Πa[b,c...]ます。~+→Πに追加a+1product[b,c...]ます。a、最小の除数されてproduct[b,c...]いるN/d
H.PWiz

H.PWizそして、私は素因数を使用するのでは思いました@ ...
エリックOutgolfer

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

パイソン297の 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

05AB1E17 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の2つの関数を取ります。
                 || A(値)は真実ですが、値をB(値)に変換します。の
                 || 開始値は入力です。
    tPH || 最初の関数、A。単一の引数、Hを取ります。
     PH || .. Hの素因数因子
    t || ..テール(最初の要素を削除)。真実ながら(Hは合成):
       h + / ZKhPZK || 2番目の関数Bは、単一の引数Zを取ります。
         / Z || .. Zの除算:
           KhP || ..その最小素因数、およびKに割り当てます。   
       h || ..インクリメント。
        + K || Kを追加します
iI || 結果(最後の値)が入力を分割するかどうかを確認します。

そして、最初の4バイト(<P_Q)は、入力が素数でないかどうかだけをチェックします。

Emignaの助けを借りて、3バイトを節約できました。


1より大きい最小の除数が常に素数になるため、部品のhead(P)代わりに何かを使用できますfiITZ2か?
エミグナ

@Emigna Ninja'd、修正、ありがとう!
Xcoder氏18年

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、およびふるいの代わりにfor N > 7 prange(2,N)使用できることが証明できますrange(2,N+1)
  • ///リストインデックスのため、機能しません。使用する必要があります。
  • range残念ながら、別の変数に保存しても役に立ちません。

説明:

  • -~N== N+1
  • 最初に、配列sN+1ゼロで初期化されます(Pythonはインデックスが0なので、インデックスは0..N
  • 初期化後、if が素数であり、if が複合である場合に除算する最小素数であるs[n]ことが期待されます。そして、値は重要ではありません。0nppnns[0]s[1]
  • p範囲内のそれぞれについて[2 .. N-1]

    • もしs[p] < 1(すなわち、s[p] == 0)、次いでp、素数であり、それぞれのためqの複数であるps[q] == 0割り当てますs[q] = p
  • n//s[n]-~s[n]== を除いて、最後の2行は簡単(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バイトです。


149バイトのn//s[n]-~s[n]代わりに使用できn//s[n]+s[n]+1ます。
Xcoder氏18年

@ Mr.Xcoderありがとう!
user202729

また、私は考えるor pことができる|p
氏Xcoder

@ Mr.Xcoderいいえ、or p論理OR を|p実行しますが、ビット単位OR を実行します。つまり、a or bですb if a == 0 else a
user202729

代わりに別のスライスfor使用forするように外部を変更できますrange下のインデックスが大きいものを上書きして、でスライスを開始しますので、逆転された2*pあなたは置き換えることはありませんs[0]s[p]
ロッド




1

Japt、25 24バイト

私はこれで間違った方向に進んだのではないかと恐れていますが、別のアプローチを試すために時間を使い果たしました。

0falseまたは1trueの出力。

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

それを試してみてください


0

Perl 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を使用することです。

オンラインでお試しください!



質問を読み直す前にこれを作成し、true / falseのみが必要であることに気付きました。

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.