アナグラムの要因


19

QIの最近のエピソードでは、142857の最初の5倍数が元の数のアナグラムとして説明されました。もちろん、その数について十分な知識を持っている人は、アナグラムだけでなく、それらの数が実際に周期的であることを知っています。しかし、それは私に考えさせられました。

それ自体のアナグラムである適切なファクターを持つ6桁以下の数字をすべて出力するプログラムまたは関数を作成してください。リストは次の番号で始まる必要があります。

3105    (divisible by 1035)
7128    (divisible by 1782)
7425    (divisible by 2475)
8316    (divisible by 1386)
8712    (divisible by 2178)
9513    (divisible by 1359)
9801    (divisible by 1089)

必要に応じて、アナグラムが適切な要因である数字を見つけることができますが、アナグラムから先行ゼロを除外するように注意してください。

これはコードゴルフであるため、標準の抜け穴を壊さないバイト単位の最短コードが優先されます。


十分な時間が与えられた場合、プログラムは6桁以上の数字を出力できますか?
ブルー

1
リストを投稿してもらえますか?
xnor

@muddyfishはい、数字を省略したり、間違った数字を出力しない限り、それは受け入れられます。
ニール

@xnor私は実際にリスト全体を計算することをまだ気にしていませんが、それについての論争は予想していません。
ニール

1
(できれば正しい)出力のペーストビンを作成しました。
グレッグマーティン

回答:


6

Mathematica(REPL環境)、75 74バイト

これを1バイト強化したngenisisに感謝します!

Select[Range[10!],Most@#~MemberQ~Last@#&[Sort/@IntegerDigits@Divisors@#]&]

Sort/@IntegerDigits@Divisors@#引数の除数ごとにソートされた数字のリストを作成します。入力番号自体が除数なので、ソートされた数字のリストは最後の数字です。Most@#~MemberQ~Last最後にソートされた数字のリストが、最後の要素の前のリストにも表示されるかどうかを検出します。そして、Select[Range[10!],...]このテストに合格する3,628,800までの整数(10 6より1バイト短いために選択された境界)のみを保持します。私のコンピューターでは約5分で実行され、494個の数字のリストが生成されます。最大の数は3,427,191です。10 6個までの362個の番号があり、そのうち最大のものは989,901です。


さて、それはそれほど奇妙ではありません:857142と571428は、2つの適切な除数アナグラムを持つ2つの数値です。
ニール

実際、857142には3つの適切な除数アナグラムがありますか?
ニール

あなたは正しいようです!
グレッグマーティン

を使用してバイトを保存できますIntegerDigits@Divisors@#
ngenisis

3

ゼリー、12バイト

ÆḌṢ€ċṢ
ȷ6ÇÐf

オンラインでお試しください!(TIOの時間制限により5桁以下を使用します)

検証

$ time jelly eun 'ÆḌṢ€ċṢ¶ȷ6ÇÐf'
[3105, 7128, 7425, 8316, 8712, 9513, 9801, 30105, 31050, 37125, 42741, 44172, 67128, 70416, 71208, 71253, 71280, 71328, 71928, 72108, 72441, 74142, 74250, 74628, 74925, 78912, 79128, 80712, 81816, 82755, 83160, 83181, 83916, 84510, 85725, 86712, 87120, 87132, 87192, 87912, 89154, 90321, 90801, 91152, 91203, 93513, 94041, 94143, 95130, 95193, 95613, 95832, 98010, 98091, 98901, 251748, 257148, 285174, 285714, 300105, 301050, 307125, 310284, 310500, 321705, 341172, 342711, 370521, 371142, 371250, 371628, 371925, 372411, 384102, 403515, 405135, 410256, 411372, 411723, 415368, 415380, 415638, 419076, 419580, 420741, 421056, 423711, 425016, 427113, 427410, 427491, 428571, 430515, 431379, 431568, 435105, 436158, 441072, 441720, 449172, 451035, 451305, 458112, 461538, 463158, 471852, 475281, 501624, 502416, 504216, 512208, 512820, 517428, 517482, 517725, 525771, 527175, 561024, 562104, 568971, 571428, 571482, 581124, 589761, 615384, 619584, 620379, 620568, 623079, 625128, 641088, 667128, 670416, 671208, 671280, 671328, 671928, 672108, 678912, 679128, 681072, 691872, 692037, 692307, 704016, 704136, 704160, 704196, 705213, 705321, 706416, 711342, 711423, 712008, 712080, 712503, 712530, 712800, 713208, 713280, 713328, 713748, 714285, 716283, 717948, 719208, 719253, 719280, 719328, 719928, 720108, 720441, 721068, 721080, 721308, 721602, 723411, 724113, 724410, 724491, 728244, 730812, 731892, 732108, 741042, 741285, 741420, 742284, 742500, 744822, 746280, 746928, 749142, 749250, 749628, 749925, 753081, 754188, 755271, 760212, 761082, 761238, 761904, 771525, 772551, 779148, 783111, 786912, 789120, 789132, 789192, 789312, 790416, 791208, 791280, 791328, 791928, 792108, 798912, 799128, 800712, 806712, 807120, 807132, 807192, 807912, 814752, 816816, 818160, 818916, 820512, 822744, 823716, 824472, 825174, 825714, 827550, 827658, 827955, 829467, 830412, 831117, 831600, 831762, 831810, 831831, 839160, 839181, 839916, 840510, 841023, 841104, 843102, 845100, 845910, 847422, 851148, 851220, 851742, 852471, 857142, 857250, 857628, 857925, 862512, 862758, 862947, 865728, 866712, 867120, 867132, 867192, 867912, 871200, 871320, 871332, 871425, 871920, 871932, 871992, 874125, 879120, 879132, 879192, 879912, 888216, 891054, 891540, 891594, 891723, 892755, 894510, 895725, 899154, 900801, 901152, 903021, 903210, 903231, 904041, 908010, 908091, 908901, 909321, 910203, 911043, 911358, 911520, 911736, 911952, 912030, 912093, 912303, 916083, 920241, 920376, 923076, 923580, 925113, 925614, 930321, 931176, 931203, 933513, 934143, 935130, 935193, 935613, 935832, 940410, 940491, 941430, 941493, 941652, 943137, 943173, 951300, 951588, 951930, 951993, 952380, 956130, 956193, 956613, 958032, 958320, 958332, 958392, 958632, 958716, 959832, 960741, 962037, 962307, 970137, 971028, 980100, 980910, 980991, 989010, 989091, 989901]

real    2m10.819s
user    2m10.683s
sys     0m0.192s

使い方

ȷ6ÇÐf   Main link. No arguments.

ȷ6      Yield 1e6 = 1,000,000.
  ÇÐf   Filter; keep numbers in [1, ..., 1e6] for which the helper link returns
        a truthy value.


ÆḌṢ€ċṢ  Helper link. Argument: n

ÆḌ      Compute all proper divisors of n.
  Ṣ€    Sort each proper divisor's digits.
     Ṣ  Sort n's digits.
   ċ    Count the occurrences of the result to the right in the result to the left.

1
このコメントあなたも遅く行うことができますÆḌṢ€ċṢµȷ#i7のコア(ないUNIX、無素敵上で実行するために10時間かかった〜27分間time)。最大の結果はでした6671928
ジョナサンアラン

私は😏あなたが質問ごとにゼリーを修正する考え始めています
アルバート・レンショウ

3

Brachylog、12バイト

ℕf{k∋p.!}?ẉ⊥

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

ただし、これは何かを印刷する前にタイムアウトする可能性があります(そうでない場合は、3105だけが印刷されます)。

説明

作成者がプログラムが6桁を超える数字を印刷することは容認できると述べたので、これはそれらの数字を無期限に印刷します。

これは遅すぎる方法です。このプログラムを使用し(および8300任意に変更してN)、より大きい数値から印刷を開始できNます。

ℕ               Natural number: The Input is a natural number
 f              Factors: compute the factors of the Input
  {     }?      Call a predicate with the main Input as its output and the factors as Input
   k            Knife: remove the last factor(which is the Input itself)
    ∋           In: take one of those factors
     p.         Permute: the Output is a permutation of that factor
       !        Cut: ignore other possible permutations
         ?ẉ     Writeln: write the Input to STDOUT, followed by a line break
           ⊥    False: backtrack to try another value for the Input

@ ais523が指摘したように、その要因のいくつかがその順列である場合、複数回印刷することを避けるためにカットが必要です。


私は非常によく似た答えをドラフトとして保存しています。残念ながら、857142のような数字を2回以上印刷するため、機能するとは思われません。著者は、それは許可されないと言っています。プログラムはどこかにカットが必要だと思います。おそらく3つのキャラクターを追加するでしょう。

実際に4文字を追加しています...ありがとう、忘れてしまいました。
致命的

3

JavaScript(ES6)、10396 94バイト

一致する整数の配列を返す無名関数。

_=>[...Array(1e6).keys(F=i=>[...i+''].sort()+0)].filter(n=>n*(R=i=>F(n/i--)==F(n)||R(i)%i)(9))

書式設定およびコメント化

_ =>                                // main function, takes no input
  [...Array(1e6).keys(              // define an array of 1,000,000 entries
    F = i => [...i + ''].sort() + 0 // define F: function used to normalize a string by
  )]                                // sorting its characters
  .filter(n =>                      // for each entry in the array:
    n * (                           // force falsy result for n = 0
      R = i =>                      // define R: recursive function used to test if
        F(n / i--) == F(n) ||       // n/i is an anagram of n, with i in [1 … 9]
        R(i) % i                    // F(n/1) == F(n) is always true, which allows to stop
    )                               // the recursion; but we need '%i' to ignore this result
    (9)                             // start recursion with i = 9
  )                                 //

除数統計

6桁の整数の、からの各比29一致する整数の間にn、そのアナグラムが少なくとも一度遭遇します。しかし、それらのいくつかはほんの数回表示されます:

 divisor | occurrences | first occurrence
---------+-------------+---------------------
    2    |    12       | 251748 / 2 = 125874
    3    |    118      | 3105   / 3 = 1035
    4    |    120      | 7128   / 4 = 1782
    5    |    4        | 714285 / 5 = 142857
    6    |    34       | 8316   / 6 = 1386
    7    |    49       | 9513   / 7 = 1359
    8    |    2        | 911736 / 8 = 113967
    9    |    23       | 9801   / 9 = 1089

テスト

以下のテストは範囲に制限されている[1 ... 39999]ため、完了までに時間がかかりすぎません。


より高速なバージョンですが、やや長いバージョンです_=>[...Array(1e6).keys()].filter(n=>n&&![...Array(9)].every(_=>n%++i||(F=i=>[...i+''].sort()+'')(n/i)!=F(n),i=1))
ニール

@Neilあなたの提案は、はるかに高速で1バイト短い更新版を私にインスパイアしました。悲しいことに、から2までのすべての除数9が必要です(と8に対して2回だけ使用されます)。911736931176
アーナルド


2

Perl 6、59バイト

{grep {grep .comb.Bag===*.comb.Bag,grep $_%%*,2..^$_}

ひどく遅いブルートフォースソリューション。

遅延シーケンスを返すため、最初のいくつかの結果を確認できましたが、妥当な時間内にすべての結果に到達するわけではありません。(非競合としてマークする必要がありますか?)


2

純粋バッシュ128の 126 122 121 120バイト

for((;n<6**8;)){
c=0
for((j=++n;j;j/=10)){((c+=8**(j%10)));}
for k in ${a[c]};{((n%k))||{ echo $n;break;};}
a[c]+=\ $n
}

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

(このプログラムはかなり高速です。MacBookの6桁の数字をすべて実行するのに14分しかかかりませんでした。残念なことに、TIOは1分という実行時間制限を課しているためタイムアウトします。 5桁の数字など)。

Bash + Unixユーティリティ、117バイト

for n in {1..999999}
{
c=$(bc<<<0`sed 's/\(.\)/+8^\1/g'<<<$n`)
for k in ${a[c]};{((n%k))||echo $n;}
a[c]+=\ $n
}|uniq

これは純粋なbashバージョンよりも短くなりますが、かなり遅くなります。これはおそらく、すべての分岐が進行しているためと思われます。


1

05AB1E、15バイト

[¼¾œJv¾Ñ¨Dyåi¾,

説明:

[               # Start of infinite loop
 ¼              # Increase counter_variable by 1
  ¾œJv          # Loop through all the permutations of counter_variable
      ¾Ñ¨Dyå    # Check if a divisor of counter_variable is a permutation of counter_variable
            i¾, # If so, print counter_variable

オンラインでお試しください!(これは機能せず、タイムアウトします)



0

Python 2、98バイト

s=sorted;print filter(None,[[x for i in range(x)if s(`x`)==s(`i`)and x%i<1]for x in range(10**6)])

そうじゃない10**6
ニール

はい、ありがとうございます。
トレルゼビル

1
x%i==0はちょうどできると思いますx%i<1
Yytsi

0

05AB1E12 10バイト

無限ループが原因でTIOがタイムアウトしました。
OPコメントに従って6桁以上の数字を出力できるため、2バイトを節約しました。

[NѨ€{N{å–

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

説明

[            # infinite loop with iteration index N
 NÑ          # get a list of all divisors of N
   ¨         # remove N from that list
    €{       # sort each entry in the list of divisors
      N{     # sort N
        å–   # output N if N is in the list

0

バッチ、263バイト

@echo off
set e=exit/b
for /l %%n in (1,1,999999)do call:n %%n
%e%
:n
call:c %1 1 0
for /l %%f in (2,1,9)do call:c %1 %%f %c%&&echo %1&&%e%
%e%
:c
set/ar=%1%%%2,d=%1/%2,c=-%3
if %r% gtr 0 %e%1
:l
set/ac+=1^<^<d%%10*3,d/=10
if %d% gtr 0 goto l
%e%%c%

スロー。のように、私のPCで完了するには1日以上かかります。説明:cサブルーチンは最初の2つの引数を分割します。剰余がゼロの場合、各桁の8のn乗の合計を計算することにより、結果のハッシュを計算します。bashの回答から盗まれたこのハッシュ関数は、アナグラムでのみ衝突します。(7桁の数字で機能しますが、2週間はありません。)3番目の引数が減算され、これがゼロの場合、サブルーチンは真の結果で終了します。nサブルーチンを呼び出しc、ハッシュを計算した後、サブルーチンを、その後8回以上のハッシュを比較します。衝突が見つかった場合n、サブルーチンを出力して早期に終了します。

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