Різноманітні та бідні числа


18

Вступ

У дивному світі цілих чисел дільники схожі на активи, і вони називають "багаті" числа, що мають більше дільників, ніж їх перевернення, тоді як "бідні" називають меншими дільниками, ніж їх переворот.

Наприклад, число має п'ять дільників: , тоді як його зворот, , має лише чотири: . Так називають багатим числом, а - бідним числом.24011,7,49,343,240110421,2,521,1042
24011042

З огляду на це визначення, ми можемо створити дві цілі послідовності множинних і бідних чисел:

(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 або >= 1якщо 1-індексується)

Вихід

  • 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
Концепція: е бідне число завжди більше, ніж е багате число. Якщо хтось може це довести, він, ймовірно, оббрине байти з багатьох відповідей. нн
Робін Райдер

@RobinRyder: Я підозрюю, що це правда, але доведення це зовсім інша історія :)
digEmAll

@RobinRyder Поміркуйте, що декілька чисел можуть відображати однакові перевернуті числа через провідні нулі (наприклад, 51, 510, 5100, все відображення до 15). Для кожного числа буде нескінченна кількість багатших відповідних обернених чисел з нулями (з додатковими тощо), тоді як лише кінцева кількість бідніших перевернутих чисел. Я не думаю, що це повністю доводить це (можливо, є щасливий ланцюжок бідних чисел десь внизу лінії), але він принаймні вказує, що там набагато більше багатих, ніж бідних. n10,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 байти для цього є δglol.
Чарівна восьминога

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
Ç>/$Ɠ©#żÇ</$®#Ṫ

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

н

Пояснення

ṚḌ;⁸Æ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

Мова Вольфрама (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 { ... }) створює пару нескінченних послідовностей, кожна заснована на одній із функцій порівняння: багатою послідовністю і поганою послідовністю в такому порядку.
  • »[$_]індексує обидві ці послідовності, використовуючи $_аргумент функції верхнього рівня, повертаючи двоелементний список, що містить $_третій член багатої послідовності та $_третій член бідної послідовності.
  • 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

Ruby , 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, що, мабуть, не є строго правильним. Тим НЕ менше, я міг би замінити *3з ³для яких - небудь додаткових байт, які зробили б програму набагато менш ефективна, якщо більш правильно.


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}

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

Дякую Адаму та ngn за те, що допомагали мені гольф у цій жахливості.

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


2

R , 152 137 байт

-12 байт завдяки Giuseppe -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
@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.