Фактори Анаграми


19

У недавньому епізоді QI перші 5 кратних 142857 були описані як анаграми вихідного числа. Звичайно, кожен, хто має більше знань про це число, буде знати, що ці числа насправді є циклічними, а не лише анаграмами. Але це задумало мене.

Будь ласка, напишіть програму або функцію, яка виводить усі числа з шести або менше цифр, які мають належний коефіцієнт, що є анаграмою. Список повинен починатися з таких номерів:

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 байти

Дякую ngenisis, що посилили цей байт!

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

Sort/@IntegerDigits@Divisors@#виробляє відсортований список цифр для кожного дільника його аргументу; вхідне число саме по собі є дільником, тому його відсортований список цифр є останнім. Most@#~MemberQ~Lastвиявляє, чи відображається цей останній відсортований список цифр у списку до останнього елемента. І Select[Range[10!],...]зберігає лише ті цілі числа до 3 628 800, які проходять цей тест (цю межу вибрали, оскільки на один байт коротше 10 6 ). Він працює близько 5 хвилин на моєму комп’ютері, отримуючи список із 494 номерів, найбільший з яких 3,427,191; існує 362 числа до 10 6 , велика частина яких 989901.


Ну, це не так цікаво: 857142 і 571428 - це два числа, обидва з двома очевидними правильними ділограмами.
Ніл

Насправді, 857142 має три належні аналоги дільника, чи не так?
Ніл

схоже, ти маєш рацію!
Грег Мартін

Ви можете зберегти байт за допомогою IntegerDigits@Divisors@#.
ngenisis

3

Желе , 12 байт

ÆḌṢ€ċṢ
ȷ6ÇÐf

Спробуйте в Інтернеті! (використовує п'ять або менше цифр через часовий ліміт TIO)

Визначення

$ 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
Завдяки цьому коментарю ви можете зробити ще повільніше ÆḌṢ€ċṢµȷ#на 10. Витратили ~ 27 хвилин, щоб працювати на ядрі i7 (не на Unix, не приємно time); найбільший результат був 6671928.
Джонатан Аллан

Я починаю думати, що ви змінюєте Jelly за кожним питанням 😏
Альберт Реншо

3

Брахілог , 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 не раз, і автор сказав, що це заборонено. Я думаю, що програмі потрібно десь вирізати, ймовірно, додавши три символи.

Додавання 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-розрядних цілих чисел, кожне співвідношення від 2до 9між согласующим цілим числом 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використовуються лише двічі для 911736та 931176).
Арнольд


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
}

Спробуйте в Інтернеті!

(Ця програма досить швидка - для проходження всіх 6-значних цифр на моєму MacBook знадобилося всього 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

Це коротше, ніж чистий баш-версія, але зовсім трохи повільніше, імовірно, завдяки своїй частці всім розгортанням.


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?
Ніл

Так дякую.
Trelzevir

1
Я думаю, що x%i==0може бути просто так x%i<1.
Yytsi

0

05AB1E , 12 10 байт

Час вичерпується на TIO через нескінченний цикл.
Збережено 2 байти, оскільки ми могли вивести більше 6-значних чисел відповідно до коментаря ОП.

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

Повільно. Як і в, займає більше дня, щоб закінчити на моєму ПК. Пояснення: cпідпрограма розділяє свої перші два аргументи. Якщо залишок дорівнює нулю, він обчислює хеш результату, обчислюючи суму n-ї потужності 8 для кожної цифри. Ця хеш-функція, викрадена з баш-відповіді, стикається лише в анаграмах. (Це працювало б для семизначних чисел, але я не маю всіх два тижні.) Третій аргумент віднімається, і підпрограма виходить з результатом трити, якщо це нуль. nПідпрограма викликає cпідпрограму один раз , щоб обчислити хеш, потім ще вісім разів , щоб порівняти хеш; якщо він виявить зіткнення, він надрукує nта виходить з підпрограми рано.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.