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


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 цифрами?
Blue

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!],...]сохраняет только те целые числа до 3628800, которые проходят этот тест (эта граница выбрана, потому что она на один байт короче 10 6 ). Он запускается на моем компьютере примерно за 5 минут, в результате получается список из 494 номеров, самое большое из которых - 3427191; Есть 362 номера до 10 6 , наибольшая из которых составляет 989 901.


Ну, это не так любопытно: 857142 и 571428 - это два числа с двумя очевидными собственными анаграммами делителя.
Нил

На самом деле, 857142 имеет три правильные анаграммы делителей, не так ли?
Нил

похоже ты прав!
Грег Мартин

Вы можете сохранить байт с помощью IntegerDigits@Divisors@#.
ngenisis

3

Желе , 12 байт

ÆḌṢ€ċṢ
ȷ6ÇÐf

Попробуйте онлайн! (использует пять или меньше цифр из-за ограничения по времени TIO)

Verfication

$ 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.
Джонатан Аллан

Я начинаю думать, что вы модифицируете желе по каждому вопросу Al
Альберт Реншоу

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 байт короче. К сожалению, все делители от 2to 9требуются ( 8используются только дважды для 911736и 931176).
Арно


2

Perl 6 , 59 байт

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

Ужасно медленное решение для перебора.

Он возвращает ленивую последовательность, поэтому я мог проверить первые несколько результатов, но он не достигнет всех результатов в разумные сроки. (Должен ли я отметить его как не конкурирующий?)


2

Pure Bash , 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

Это короче, чем версия для чистого 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

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 для каждой цифры. Эта хэш-функция, украденная из ответа bash, сталкивается только с анаграммами. (Это будет работать для семизначных чисел, но у меня не будет всех двух недель.) Третий аргумент вычитается, и подпрограмма завершается с достоверным результатом, если это ноль. nПодпрограмма вызывает cподпрограмму один раз , чтобы вычислить хэш, затем еще восемь раз , чтобы сравнить хэш; если он обнаруживает столкновение, он печатает nи выходит из подпрограммы заранее.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.