Anagram Faktörleri


19

Son bölümünün üzerinde QI , 142857 ilk 5 katları orijinal sayının anagrams olarak tanımlandı. Tabii ki, bu sayının geçen bilgisinden daha fazlasına sahip olan herkes, bu sayıların sadece anagramlar değil, aslında döngüsel olduğunu bilecektir. Ama bu beni düşündürdü.

Lütfen altı veya daha az basamaklı, kendi başına bir anagram olan uygun bir faktöre sahip tüm sayıları çıkaran bir program veya işlev yazın. Liste aşağıdaki numaralarla başlamalıdır:

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)

İsterseniz, sayının uygun bir faktörü olan bir anagramı olan sayıları bulabilirsiniz, ancak önde gelen sıfırları anagramlarınızdan hariç tutmaya dikkat edin.

Bu kod golf, bu nedenle standart boşluklar kesen baytlar içinde en kısa kod kazanır.


Yeterli zaman verilirse, programlarımız 6 basamaktan fazla sayı çıkarabilir mi?
Mavi

1
Listeyi gönderebilir misiniz?
xnor

@muddyfish Evet, herhangi bir sayıyı atlamadıkça veya yanlış sayılar çıkmadığı sürece kabul edilebilir.
Neil

@xnor Aslında tüm listeyi hesaplama zahmetine girmedim, ancak üzerinde herhangi bir anlaşmazlık beklemiyorum.
Neil

1
(Umarım doğru) çıktımdan bir çöp kutusu yaptım .
Greg Martin

Yanıtlar:


6

Mathematica (REPL ortamı), 75 74 bayt

Bunu bir bayt ile sıkıştırdığı için ngenisis'e teşekkürler!

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

Sort/@IntegerDigits@Divisors@#argümanının her böleni için sıralı bir rakam listesi üretir; giriş numarasının kendisi bir bölen olduğundan, sıralı basamak listesi sonuncudur. Most@#~MemberQ~Lastson sıralanan basamak listesinin, son öğeden önceki listede de görünüp görünmediğini algılar. Ve Select[Range[10!],...](o 10'dan bir byte daha kısa olduğu için seçilen sınırın bu testi geçmek 3,628,800 kadar sadece bu tamsayılar korur 6 ). Bilgisayarımda yaklaşık 5 dakika içinde çalışır ve en büyüğü 3.427.191 olan 494 numaradan oluşan bir liste verir; 10 362 sayı kadar orada 6 989.901 olan larget olan,.


Bu o kadar da meraklı değil: 857142 ve 571428, ikisi de iki belirgin doğru bölen anagramı olan iki sayı.
Neil

Aslında, 857142'nin üç uygun bölen anagramı vardır, değil mi?
Neil

haklısın gibi görünüyor!
Greg Martin

Tuşunu kullanarak bir bayt kaydedebilirsiniz IntegerDigits@Divisors@#.
ngenisis

3

Jöle , 12 bayt

ÆḌṢ€ċṢ
ȷ6ÇÐf

Çevrimiçi deneyin! (TIO'nun zaman sınırı nedeniyle beş veya daha az basamak kullanır)

doğrulaması ise

$ 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

Nasıl çalışır

ȷ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
Bu yorum nedeniyle ÆḌṢ€ċṢµȷ#10 için daha da yavaş yapabilirsiniz . Bir i7 çekirdeği üzerinde çalıştırmak için ~ 27 dakika sürdü (unix üzerinde değil, hoş değil time); en büyük sonuç oldu 6671928.
Jonathan Allan

Jelly'i soru bazında değiştirdiğinizi düşünmeye başlıyorum
Albert

3

Brachylog , 12 bayt

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

Çevrimiçi deneyin!

Bu, herhangi bir şey yazdırmadan önce zaman aşımına uğrayabilir (ve eğer değilse, sadece 3105 yazdıracaktır).

açıklama

Yazarın, programın 6 basamaktan büyük sayıları basabileceğini kabul ettiği gibi, bu sayıları süresiz olarak yazdırır.

Bu çok yavaş; daha büyük sayılardan yazdırmaya başlamak için bu programı kullanabilirsiniz (ve 8300herhangi birini değiştirebilirsiniz 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'ün işaret ettiği gibi, birkaç faktörünün permütasyonları olması durumunda, bir kaç kez birden fazla yazdırmaktan kaçınmamız gerekir.


Taslak olarak kaydedilmiş çok benzer bir cevabım var. Ne yazık ki, işe yaradığını sanmıyorum çünkü 857142 gibi sayıları bir kereden fazla basacak ve yazar buna izin verilmediğini söyledi. Programın bir yerde bir kesime ihtiyacı olduğunu düşünüyorum, muhtemelen üç karakter ekliyor.

Aslında 4 karakter ekleyerek ... teşekkürler, unutmuşum.
Şubat'ta

3

JavaScript (ES6), 10396 94 bayt

Eşleşen tamsayılar dizisini döndüren anonim bir işlev.

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

Biçimlendirilmiş ve yorumlanmış

_ =>                                // 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
  )                                 //

Bölen istatistikleri

6 haneli tamsayıları için, her oran 2için 9eşleşen bir tamsayı arasında nve anagrama kez en az karşılaşılmaktadır. Ancak bazıları sadece birkaç kez ortaya çıkıyor:

 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

Ölçek

Aşağıdaki test aralıkla sınırlıdır, [1 ... 39999]böylece tamamlanması fazla zaman almaz.


Versiyon Çok daha hızlı, ancak biraz daha uzun: _=>[...Array(1e6).keys()].filter(n=>n&&![...Array(9)].every(_=>n%++i||(F=i=>[...i+''].sort()+'')(n/i)!=F(n),i=1)).
Neil

@Neil Öneriniz bana çok daha hızlı ve 1 byte daha kısa güncellenmiş versiyona ilham verdi. Ne yazık ki, tüm bölenler 2için 9gerekli olan ( 8sadece iki kez kullanılıyor 911736ve 931176).
Arnauld


2

Perl 6 , 59 bayt

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

Çok yavaş kaba kuvvet çözümü.

Tembel bir dizi döndürür, bu yüzden ilk birkaç sonucu kontrol edebilirim, ancak tüm sonuçlara makul sürede ulaşmaz. (Rakip olmayan olarak işaretlemeli miyim?)


2

Saf Bash , 128 126 122 121 120 bayt

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
}

Çevrimiçi deneyin!

(Bu program oldukça hızlı - MacBook'umdaki tüm 6 basamaklı sayıları çalıştırmak sadece 14 dakika sürdü. Ne yazık ki TIO zaman aşımına uğradı, çünkü 1 dakikalık bir çalışma süresi sınırı getiriyor, bu da sadece geçmek için yeterli zaman 5 basamaklı sayılar vb.)

Bash + Unix yardımcı programları, 117 bayt

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

Bu saf bash versiyonundan daha kısa, ancak muhtemelen tüm çatalın devam etmesinden dolayı biraz daha yavaş.


1

05AB1E , 15 bayt

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

Açıklama:

[               # 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

Çevrimiçi deneyin! (bu işe yaramaz, zaman aşımına uğrar)


1

Japt , 23 bayt

L³o f_ì á ¤fg mì f!vZ l

Çevrimiçi deneyin! TIO'da 1e6 zaman aşımına uğradığından, bağlı kodun yalnızca 1e4'e kadar hesapladığını unutmayın.


0

Python 2, 98 bayt

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)])

Olmamalı mı 10**6?
Neil

Evet teşekkür ederim.
Trelzevir

1
Bence x%i==0sadece olabilir x%i<1.
Yytsi

0

05AB1E , 12 10 bayt

Sonsuz döngü nedeniyle TIO'da zaman aşımına uğradı.
OP yorumuna göre 6 basamaktan fazla sayı çıkarabildiğimiz için 2 bayt kaydedildi.

[NѨ€{N{å–

Çevrimiçi deneyin!

açıklama

[            # 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

Toplu, 263 bayt

@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%

Yavaş. Olduğu gibi, benim PC bitirmek için bir gün sürer. Açıklama: caltyordam ilk iki argümanını böler. Kalan sıfır ise, her basamak için 8'inci nci gücün toplamını hesaplayarak sonucun karmasını hesaplar. Bash cevabından çalınan bu hash fonksiyonu, sadece anagramlarda çarpışır. (Yedi basamaklı sayı için işe yarayacaktı, ancak iki haftada bir sürem yok.) Üçüncü argüman çıkarıldı ve alt rutin, bu sıfırsa doğru bir sonuçla çıkar. Alt nprogram c, karmayı hesaplamak için alt programı bir kez, daha sonra hash'ı karşılaştırmak için sekiz kez daha çağırır ; bir çarpışma bulursa n, alt rutini erken basar ve çıkar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.