反復除数ツイスト


13

定義

ましょうmn正の整数です。私たちは、すなわちmある除数のねじれn整数が存在するかの1 < a ≤ bようにn = a*bm = (a - 1)*(b + 1) + 1。ゼロまたはそれ以上の除数ツイストをそれに適用するmことで取得できる場合、はの子孫です。すべての数字はそれ自身の子孫であることに注意してください。nmn

たとえば、検討してくださいn = 16。私たちは、選択することができますa = 2し、b = 8以来、2*8 = 16。それから

(a - 1)*(b + 1) + 1 = 1*9 + 1 = 10

これ10はの約数のねじれであることを示しています16。とa = 2b = 5、私たちは、その参照7の除数ねじれです10。したがって7、はの子孫です16

タスク

正の整数nを指定すると、の子孫をn、重複することなく昇順でリストします。

ルール

数値の約数を計算する組み込み操作を使用することはできません。

完全なプログラムと関数の両方が受け入れられ、コレクションデータ型(何らかの種類のセットなど)を返すことは、並べ替えられ、重複がない限り許可されます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。

テストケース

1 ->  [1]
2 ->  [2] (any prime number returns just itself)
4 ->  [4]
16 -> [7, 10, 16]
28 -> [7, 10, 16, 25, 28]
51 -> [37, 51]
60 -> [7, 10, 11, 13, 15, 16, 17, 18, 23, 25, 28, 29, 30, 32, 43, 46, 49, 53, 55, 56, 60]

@Zgarbは、0の除数ねじれのチェーンを許可する場合、すべての数字が他の数字の子孫ではないのはどうしてですか?
-rorlork

3
@rcrmnゼロ操作のチェーンとは、アイデンティティー操作を意味します。したがって、ゼロ除数のねじれを許可することは、すべての数値がそれ自体の子孫であることを意味するだけです。
ズガルブ

@Zgarb OK、定義を変更して表現する必要があります。そうでない場合、私が知る限り、任意の数字は他のすべての数字の子孫と見なされます。なぜ反射性が必要なのか分かりません。説明してもらえますか?
ロルク

@rcrmn言葉遣いをわずかに変更しましたが、今では明確ですか?
ズガルブ

@Zgarb申し訳ありませんが、いいえ、それは操作ではありません。数値間の関係を定義しています。<自然数の関係を定義すると、nごとに、それよりも小さいがそれ自体ではないすべての数が得られます。これは似たようなものであるべきだと思います。このように、4つだけがそれ自身の子孫になると思います(ただし、それについてはわかりません)。
ロルク

回答:


9

Python 2、109 98 85 82バイト

f=lambda n:sorted(set(sum(map(f,{n-x+n/x for x in range(2,n)if(n<x*x)>n%x}),[n])))

以来(a-1)*(b+1)+1 == a*b-(b-a)b >= a、子孫は常に未満であるか、または元の数に等しいです。したがって、最初の数から始めて、残りがなくなるまで厳密に小さい子孫を生成し続けることができます。

条件の(n<x*x)>n%xチェック1における二つのもの-それn<x*xn%x == 0

(基本ケースから3バイトを取得してくれた@xnorに感謝します)

Pyth、32バイト

LS{s+]]bmydm+-bk/bkf><b*TT%bTr2b

s空のリストで合計()しようとするとPythが窒息するように見えるという事実を除き、上記の直接翻訳。

これは、次のように末尾にy追加することy<number>で呼び出すことができる関数を定義します(オンラインで試してください):

LS{s+]]bmydm+-bk/bkf><b*TT%bTr2by60

CJam、47 45バイト

{{:X_,2>{__*X>X@%>},{_X\/\-X+}%{F}%~}:F~]_&$}

また、いくつかの変更を加えて、同じ方法を使用します。比較のためにCJamを試してみたかったのですが、残念ながら私はCJamの方がPyth / Pythonよりもはるかに悪いので、おそらく改善の余地がたくさんあります。

上記は、intを取り込んでリストを返すブロック(基本的には名前のない関数のCJamのバージョン)です。次のようにテストできます(オンラインで試してください):

{{:X_,2>{__*X>X@%>},{_X\/\-X+}%{F}%~}:F~]_&$}:G; 60 Gp

私はPythonの専門家ではありませんがset()、そこに必要な理由はありますか?ソートされたリストを返すことはできませんか?
アレックスA.

@Alex set()は重複を削除します:)
Sp3000

ああ、大丈夫。きちんとした。よくやった!
アレックスA.

あなたはおそらく行うことができます[n]+sum(...,[])ようsum(...,[n])
xnor

@xnorあ、はい、できます。[]集計リストのベースケースとして以外は使用したことがないため、完全に忘れてしまいました。
Sp3000

6

Java、148 146 104バイト

ゴルフバージョン:

import java.util.*;Set s=new TreeSet();void f(int n){s.add(n);for(int a=1;++a*a<n;)if(n%a<1)f(n+a-n/a);}

ロングバージョン:

import java.util.*;
Set s = new TreeSet();
void f(int n) {
    s.add(n);
    for (int a = 1; ++a*a < n;)
        if (n%a < 1)
            f(n + a - n/a);
}

だから私はこのプログラムでPPCGでデビューしていますが、これはTreeSetGeobitsのプログラムに似たa (幸いなことに自動的にソートする)と再帰を使用しますが、異なる方法でnの倍数をチェックしてから次の機能。これは初めての人にとってはかなり公平なスコアだと思います(特にJavaでは、この種のことをするのに最も理想的な言語ではないようです)。


PPCGへようこそ!9行目に変更a*bすると、カップルを節約できますn
。-ジオビット

歓迎と提案をありがとう!ええ、これらの小さなものを見つけるにはしばらく時間がかかります。すべてのバイトがカウントされます!再度、感謝します!
TNT

c=n+a-b内部に置くことで、さらに2つ節約することもできadd()ます。または、c完全に削除して、n+a-b同じ2バイトの両方の場所で使用することもできます。
ジオビット

そういえば、add二度使う必要はないと思う。しばらくお待ちください
TNT

しかし、全体として2番目のループは必要ありません。あなたが持っている場合はa、あなたが分裂を知っていることをnきれいに、あなたはループを見つけるためにはならないb、それだけですn/a。その時点で、それは私のものに近づき始めます;)
Geobits

4

Java、157 121

以下は、の各子孫の子孫を取得する再帰関数ですnTreeSetデフォルトでソートされるを返します。

import java.util.*;Set t(int n){Set o=new TreeSet();for(int i=1;++i*i<n;)o.addAll(n%i<1?t(n+i-n/i):o);o.add(n);return o;}

いくつかの改行あり:

import java.util.*;
Set t(int n){
    Set o=new TreeSet();
    for(int i=1;++i*i<n;)
        o.addAll(n%i<1?t(n+i-n/i):o);
    o.add(n);
    return o;
}

2

オクターブ、107 96

function r=d(n)r=[n];a=find(!mod(n,2:sqrt(n-1)))+1;for(m=(a+n-n./a))r=unique([d(m) r]);end;end

プリティプリント:

function r=d(n)
  r=[n];                          # include N in our list
  a=find(!mod(n,2:sqrt(n-1)))+1;  # gets a list of factors of a, up to (not including) sqrt(N)
  for(m=(a+n-n./a))               # each element of m is a twist
    r=unique([d(m) r]);           # recurse, sort, and find unique values
  end;
end

1
Octaveはand だけendでなくブロックを終了できることは私の理解です。これで11バイト節約できます。endforendfunction
アレックスA.

ねえ、あなたは正しいです!私が言語を学んだ方法ではなく、それが実現できるとは決して思いませんでした。複数のゴルフをした後、これを最初に指摘したのはなぜですか?
dcsohl

私は最近、別の質問で他の人のゴルフでそれを見た後にそれを調べたので、それを知っていました。Octaveを使用したことはありません。Matlabを使用してから何年も経ちます。私の推測では、PPCGには多くのアクティブなOctaveユーザーがいるわけではありませんが、間違っている可能性があります。
アレックスA.

それを指摘してくれてありがとう。
dcsohl

私は喜んで、助けてくれてうれしいです。いい解決策。
アレックスA.

1

Haskell、102100バイト

import Data.List
d[]=[]
d(h:t)=h:d(t++[a*b-b+a|b<-[2..h],a<-[2..b],a*b==h])
p n=sort$nub$take n$d[n]

使用法:p 16どの出力[7,10,16]

この関数dは、すべての子孫を再帰的に計算しますが、重複をチェックしません。そのため、たとえばd [4]4sの無限リストを返すなど、多くが複数回出現します。関数pは、nこのリストから最初の要素を取得し、重複を削除してリストを並べ替えます。ほら。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.