Дивизор Богатые и бедные числа


18

Вступление

В странном мире целых чисел делители подобны активам, и они используют, чтобы называть «богатыми» числа, имеющие больше делителей, чем их обращение, в то время как они называют «бедными» те, у которых меньше делителей, чем их обращение.

Например, число имеет пять делителей: , а его обращение - только четыре: . Таким образом, называется богатым числом, а - бедным числом.24011,7,49,343,240110421,2,521,1042
240110421042

Учитывая это определение, мы можем создать следующие две целочисленные последовательности богатых и бедных чисел:

(here we list the first 25 elements of the sequences)

 Index | Poor | Rich
-------|------|-------
     1 |   19 |   10
     2 |   21 |   12
     3 |   23 |   14
     4 |   25 |   16
     5 |   27 |   18
     6 |   29 |   20
     7 |   41 |   28
     8 |   43 |   30
     9 |   45 |   32
    10 |   46 |   34
    11 |   47 |   35
    12 |   48 |   36
    13 |   49 |   38
    14 |   53 |   40
    15 |   57 |   50
    16 |   59 |   52
    17 |   61 |   54
    18 |   63 |   56
    19 |   65 |   60
    20 |   67 |   64
    21 |   69 |   68
    22 |   81 |   70
    23 |   82 |   72
    24 |   83 |   74
    25 |   86 |   75
   ... |  ... |  ...

Примечания :

  • под «обращением» числа мы подразумеваем его цифровую реверсию , то есть перестановку цифр в базе-10. Это означает , что номера , оканчивающиеся с одним или несколькими нулями будут иметь «короткий» разворот: например, реверсирование 1900является , 0091следовательно ,91
  • мы намеренно исключаем целые числа, имеющие то же количество делителей, что и их обращение, т.е. те, которые принадлежат OEIS: A062895

Вызов

Учитывая две последовательности, определенные выше, ваша задача - написать программу или функцию, которая при заданном целом числе n(вы можете выбрать 0 или 1-индексированный) возвращает n-е бедное и n-е богатое число.

вход

  • Целое число ( >= 0если 0 или >= 11)

Выход

  • 2-целые числа, одно для плохой последовательности и одно для богатой последовательности, в том порядке, который вы предпочитаете, если это соответствует

Примеры :

INPUT          |   OUTPUT
----------------------------------
n (1-indexed)  |   poor    rich
----------------------------------
1              |   19      10
18             |   63      56
44             |   213     112
95             |   298     208
4542           |   16803   10282
11866          |   36923   25272
17128          |   48453   36466
22867          |   61431   51794
35842          |   99998   81888

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • Стандартные правила применяются к вашему ответу с правилами ввода / вывода по умолчанию , поэтому вам разрешено использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода (например, TIO ).
  • Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.

2
Гипотеза: е бедное число всегда больше, чем е богатое число. Если кто-то может доказать это, он, вероятно, сбрит байты со многих ответов. нnn
Робин Райдер

@RobinRyder: Я подозреваю, что это правда, но доказательство того, что это совсем другая история :)
digEmAll

@RobinRyder Учтите, что несколько чисел могут отображаться на одни и те же обратные числа из-за начальных нулей (например, 51, 510, 5100 все отображаются на 15). Для каждого числа будет бесконечное число более богатых соответствующих обращенных чисел с конечными нулями (с дополнительными коэффициентами 10 и т. Д.), В то время как только конечное количество более обращенных обращенных чисел. Я не думаю, что это полностью доказывает это (возможно, есть где-то везучая цепочка плохих чисел), но это по крайней мере указывает, что богатых чисел гораздо больше, чем бедных. 10 , 100 , 1000n10,100,1000
Джо Кинг

2
@JoKing "... гораздо больше богатых, чем бедных." Возможно, хочу уточнить это утверждение; как написано, это можно интерпретировать как высказывание о том, что множество богатых чисел имеет большую мощность, чем множество плохих чисел. Но, конечно, оба множества счетно бесконечны (ни одна последовательность не заканчивается): достаточно доказать, что существует бесконечно много простых чисел, первая цифра которых - a 2. Для этого, см следствие 1.4 в конце следующей статье, с nравным 19, 199, 1999, ...: m-hikari.com/ijcms-password/ijcms-password13-16-2006/...
mathmandan

Ответы:


9

05AB1E , 16 байтов

∞.¡ÂÑgsÑg.S}¦ζsè

Попробуйте онлайн!


0-индексированный [богатый, бедный]:

∞                # Push infinite list.
 .¡        }     # Split into three lists by...
   ÂÑgsÑg.S      # 1 if rich, 0 if nothing, -1 if poor.
            ¦ζ   # Remove list of nothings, and zip rich/poor together.
              sè # Grab nth element.

Может быть, кто-то может объяснить, почему эта версия, похоже, не заканчивается, но когда я нажимаю «отменить выполнение» на TIO, она заканчивается с правильным ответом, или если вы подождите 60 секунд, вы получите правильный ответ. Для версии, которая завершается «правильно», вы можете использовать: T+nL.¡ÂÑgsÑg.S}¦ζsè+3 байта


Кажется, что Split-by не очень хорошо работает с бесконечными списками.
Эминья

@ Emigna лично, я понятия не имею, как бесконечные списки возможны.
Волшебная Урна Осьминога

Ленивая оценка. Не рассчитывайте количество, которое вам не нужно. Так ∞n5èчто будет рассчитывать только первые 6 чисел. Я думаю, когда эти типы конструкций зацикливания / группировки / разбиения вступают в игру, ленивый eval терпит неудачу, и он пытается вычислить все элементы перед возвратом.
Эминья

1
Я все еще думаю, что должен быть 1-байтовый встроенный для €g.. Я использовал его так часто. Сохранял бы здесь байт с (теперь равным байтом) альтернативой ‚рgÆ.±. Хороший ответ, хотя! Отличное использование !
Кевин Круйссен

@KevinCruijssen еще 2 байта для этого, δgлол.
Волшебная Урна Осьминога

6

JavaScript (ES6),  121 115 113  111 байт

Ввод 1-индексирован. Выходы как [poor, rich].

x=>[(s=h=(n,i=x)=>i?h(++n,i-=(g=(n,k=n)=>k&&!(n%k)*~-s+g(n,k-1))(n)>g([...n+''].reverse().join``)):n)``,h(s=2)]

Попробуйте онлайн!

комментарии

Вспомогательная функция

g = (n,                   // g is a helper function taking n and returning either the
        k = n) =>         // number of divisors or its opposite; starting with k = n
  k &&                    // if k is not equal to 0:
    !(n % k)              //   add either 1 or -1 to the result if k is a divisor of n
    * ~-s                 //   use -1 if s = 0, or 1 if s = 2
    + g(n, k - 1)         //   add the result of a recursive call with k - 1

Основной

x => [                    // x = input
  ( s =                   // initialize s to a non-numeric value (coerced to 0)
    h = (n,               // h is a recursive function taking n
            i = x) =>     // and using i as a counter, initialized to x
      i ?                 // if i is not equal to 0:
        h(                //   do a recursive call ...
          ++n,            //     ... with n + 1
          i -=            //     subtract 1 from i if:
            g(n)          //       the number of divisors of n (multiplied by ~-s within g)
            >             //       is greater than
            g(            //       the number of divisors of the reversal of n obtained ...
              [...n + ''] //         ... by splitting the digits
              .reverse()  //             reversing them
              .join``     //             and joining back
            )             //       (also multiplied by ~-s within g)
        )                 //   end of recursive call
      :                   // else:
        n                 //   we have reached the requested term: return n
  )``,                    // first call to h for the poor one, with n = s = 0 (coerced)
  h(s = 2)                // second call to h for the rich one, with n = s = 2
]                         // (it's OK to start with any n in [0..9] because these values
                          // are neither poor nor rich and ignored anyway)

4

Желе , 22 байта

ṚḌ;⁸Æd
Ç>/$Ɠ©#żÇ</$®#Ṫ

Попробуйте онлайн!

Полная программа, принимающая 1-индексированное на стандартном вводе и возвращающая список n-го числа с плохим и богатым порядком в этом порядке.n

объяснение

ṚḌ;⁸Æd | Helper link: take an integer and return the count of divisors fof its reverse and the original number in that order

Ṛ      | Reverse
 Ḍ     | Convert back from decimal digits to integer
  ;⁸   | Concatenate to left argument
    Æd | Count divisors


Ç>/$Ɠ©#żÇ</$®#Ṫ | Main link

    Ɠ©          | Read and evaluate a line from stdin and copy to register
   $  #         | Find this many integers that meet the following criteria, starting at 0 and counting up
Ç               | Helper link
 >/             | Reduce using greater than (i.e. poor numbers)
       ż        | zip with
           $®#  | Find the same number of integers meeting the following criteria
        Ç       | Helper link
         </     | Reduce using less than (i.e. rich numbers)
              Ṫ | Finally take the last pair of poor and rich numbers

4

Wolfram Language (Mathematica) , 152 байта

(a=b=k=1;m=n={};p=AppendTo;While[a<=#||b<=#,#==#2&@@(s=0~DivisorSigma~#&/@{k,IntegerReverse@k++})||If[#<#2&@@s,m~p~k;a++,n~p~k;b++]];{m[[#]],n[[#]]}-1)&

Попробуйте онлайн!

Если гипотеза верна, то это 140-байтовое решение также работает

(a=k=1;m=n={};p=AppendTo;While[a<=#,#==#2&@@(s=0~DivisorSigma~#&/@{k,IntegerReverse@k++})||If[#<#2&@@s,m~p~k;a++,n~p~k]];{m[[#]],n[[#]]}-1)&   

Попробуйте онлайн!

Вот плохой против богатого сюжета

введите описание изображения здесь


Что это за точка, где они действительно сближаются?
Джо Кинг

1
@ JoKing Я верю, что этоa(27635)= {70003, 65892}
J42161217

1
Большой! Кстати, это, вероятно, одно из немногих решений (возможно, единственное), способных достичь n = 35842 на TIO :)
digEmAll

3

Perl 6 , 81 байт

{(*>*,* <*).map(->&c {grep
{[[&c]] map {grep $_%%*,1..$_},$_,.flip},1..*})»[$_]}

Попробуйте онлайн!

  • * > *является анонимной функцией, которая возвращает истину, если ее первый аргумент больше, чем ее второй. Аналогично для * < *. Первый выберет числа, которые принадлежат богатой последовательности, второй выберет те, которые принадлежат плохой последовательности.
  • (* > *, * < *).map(-> &c { ... }) создает пару бесконечных последовательностей, каждая из которых основана на одной из функций компаратора: обогащенная последовательность и плохая последовательность в этом порядке.
  • »[$_]индексирует обе эти последовательности, используя $_аргумент функции верхнего уровня, возвращая двухэлементный список, содержащий $_th-й элемент обогащенной последовательности и $_th-й член плохой последовательности.
  • grep $_ %% *, 1..$_производит список делителей $_.
  • map { grep $_ %% *, 1..$_ }, $_, .flipсоздает двухэлементный список делителей $_и делителей $_с перевернутыми цифрами («перевернутый»).
  • [[&c]]сокращает этот двухэлементный список с помощью функции сравнения &c(больше или меньше), создавая логическое значение, указывающее, принадлежит ли это число к обогащенной последовательности с плохой последовательностью.

1..$_может быть ^$_. Вы также можете переместить [$_]внутрь карты. 78 байт
Джо Кинг

3

Python 2 , 142 141 байт

f=lambda i,n=1,a=[[],[]]:zip(*a)[i:]or f(i,n+1,[a[j]+[n]*(cmp(*[sum(x%y<1for y in range(1,x))for x in int(`n`[::-1]),n])==1|-j)for j in 0,1])

Попробуйте онлайн!



Нерекурсивная альтернатива (очень похожая на другие ответы Python)

Python 2 , 143 байта

i=input()
a=[[],[]];n=1
while~i+len(zip(*a)):([[]]+a)[cmp(*[sum(x%i<1for i in range(1,x))for x in int(`n`[::-1]),n])]+=n,;n+=1
print zip(*a)[i]

Попробуйте онлайн!



2

Рубин , 128 байт

Ввод нулевой индексации . Выходы как [бедные, богатые].

->n,*a{b=[];i=0;d=->z{(1..z).count{|e|z%e<1}};(x=d[i+=1];y=d[i.digits.join.to_i];[[],b,a][x<=>y]<<i)until a[n]&b[n];[a[n],b[n]]}

объяснение

->n,*a{                             # Anonymous function, initialize poor array
       b=[];i=0;                    # Initialize rich array and counter variable
    d=->z{(1..z).count{|e|z%e<1}};  # Helper function to count number of factors
    (                               # Start block for while loop
     x=d[i+=1];                     # Get factors for next number
     y=d[i.digits.join.to_i];       # Factors for its reverse
                                    # (digits returns the ones digit first, so no reversing)
     [[],b,a][x<=>y]                # Fetch the appropriate array based on
                                    #  which number has more factors
                    <<i             # Insert the current number to that array
    )until a[n]&b[n];               # End loop, terminate when a[n] and b[n] are defined
    [a[n],b[n]]                     # Array with both poor and rich number (implicit return)
}                                   # End function

Попробуйте онлайн!


2

Perl 6 , 76 байт

{classify({+(.&h <=>h .flip)},^($_*3+99)){-1,1}[*;$_]}
my&h={grep $_%%*,^$_}

Попробуйте онлайн!

Я не видел ответа Шона по Perl 6 , но это работает по-другому. Обратите внимание, что я жестко закодировал верхний предел как n*3+99, что, вероятно, не совсем правильно. Тем не менее, я мог бы заменить *3with ³без лишних байтов, что сделало бы программу гораздо менее эффективной, если бы она была более правильной.


2

Python 2 , 152 байта

def f(n):
 a,b=[],[];i=1
 while not(a[n:]and b[n:]):[[],b,a][cmp(*[sum(m%-~i<1for i in range(m))for m in i,int(`i`[::-1])])]+=[i];i+=1
 return a[n],b[n]

Попробуйте онлайн!

В конечном итоге это очень похоже на ответ Рода . Возвращает нулевой проиндексированный nбедный, богатый кортеж.




2

APL (Dyalog Unicode) , 34 байта

{⍵⌷⍉1↓⊢⌸{×-/{≢∪⍵∨⍳⍵}¨⍵,⍎⌽⍕⍵}¨⍳1e3}

Попробуйте онлайн!

Спасибо Adám и ngn за помощь в игре этого чудовища.

Время ожидания TIO для больших индексов (которые требуют ⍳1e5или ⍳1e6), но при достаточном времени и памяти функция завершится правильно.


2

R , 152 137 байт

-12 байт благодаря Джузеппе -3 байт благодаря digEmAll

n=scan()
F=i=!1:2
`?`=sum
while(?n>i)if(n==?(i[s]=i[s<-sign((?!(r=?rev((T=T+1)%/%(e=10^(0:log10(T)))%%10)*e)%%1:r)-?!T%%1:T)]+1))F[s]=T
F

Попробуйте онлайн!

Tцелое число, которое в настоящее время пробуется; последние бедные и богатые числа хранятся в векторе F.

Самый короткий способ, которым я мог найти обращение целого числа, это преобразование его в цифры в базе 10 с модульной арифметикой, а затем обратное преобразование с инвертированными степенями 10, но я ожидаю, что меня обгонят на этом и других фронтах.

Объяснение (предыдущей, аналогичной версии):

n=scan() # input
i=0*1:3  # number of poor, middle class, and rich numbers so far
S=sum
while(S(n>i)){ # continue as long as at least one of the classes has less than n numbers
  if((i[s]=i[
    s<-2+sign(S(!(           # s will be 1 for poor, 2 for middle class, 3 for rich
      r=S((T<-T+1)%/%10^(0:( # reverse integer T with modular arithmetic
        b=log10(T)%/%1       # b is number of digits
        ))%%10*10^(b:0)) 
      )%%1:r)-               # compute number of divisors of r
      S(!T%%1:T))            # computer number of divisors of T
    ]+1)<=n){                # check we haven't already found n of that class
    F[s]=T
  }
}
F[-2] # print nth poor and rich numbers

146 байт ; Понятия не имею, что ответ DigEmAll
Джузеппе

@ Giuseppe Спасибо! Я люблю использование nchar.
Робин Райдер

142 байта ; У меня были проблемы с приоритетом оператора, но я его озадачил.
Джузеппе

2
Прекрасная работа! 140 меняем обратную стратегию
digEmAll

2
@digEmAll 138 байтов возвращаются log10!
Джузеппе

1

JavaScript (Node.js) ,190 180 байт

Выходы как [poor, rich].

n=>{let p,r,f=h=i=0;while(f<n){k=d(i),e=d(+(i+"").split``.reverse().join``);if(k<e){p=i;f++}if(k>e&&h<n){r=i;h++}i++}return[p,r]}
d=n=>{c=0;for(j=1;j<=n;j++)if(n%j==0)c++;return c}

Попробуйте онлайн!

объяснение

d(n) функция

Этот помощник находит количество факторов, которые имеет число.

d=n=>{              // Equivalent to `function d(n) {
  c=0;              // Counter
  for(j=1;j<=n;j++) // Check every integer from 1 to n
    if(n%j==0)c++;  // If the number is a factor, add 1 to the counter
  return c
};

Основная функция

n=>{ 
  let p,r,f=h=i=0; // p -> the poor number, r -> the rich number, f -> the number of poor numbers found, h -> the number of rich numbers found, i -> the current number being checked
  while(f<n){ // While it's found less than n poor numbers (assumes that it will always find the rich number first)
    k=d(i),        // k -> number of factors of i
    e=d(+((i+"").split``.reverse().join``)); // e -> number of factors of reversed i
    if(k<e){p=i;f++}  // If it hasn't found enough poor numbers and i is poor, save it and count it
    if(k>e&&h<n){r=i;h++}  // If it hasn't found enough rich numbers and i is rich, save it and count it
    i++
  };
  return[p,r]
}

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