Divisor Rich and Poor Numbers


18

introduzione

Nello strano mondo dei numeri interi, i divisori sono come beni e usano per chiamare "ricchi" i numeri che hanno più divisori della loro inversione, mentre chiamano "poveri" quelli che hanno meno divisori della loro inversione.

Ad esempio, il numero 2401 ha cinque divisori: 1,7,49,343,2401 , mentre la sua inversione, 1042 , ne ha solo quattro: . Quindi è chiamato un numero ricco , mentre un numero scarso .1,2,521,1042
24011042

Data questa definizione, possiamo creare le seguenti due sequenze intere di numeri ricchi e poveri:

(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
   ... |  ... |  ...

Appunti :

  • come "inversione" di un numero intendiamo il suo inverso digitale , cioè con le sue cifre in base 10 invertite. Ciò significa che i numeri che terminano con uno o più zeri avranno un'inversione "più breve": ad esempio, l'inversione di 1900è 0091quindi91
  • escludiamo intenzionalmente i numeri interi che hanno lo stesso numero di divisori della loro inversione, cioè quelli appartenenti a OEIS: A062895

Sfida

Considerando le due sequenze sopra definite, il tuo compito è scrivere un programma o una funzione che, dato un numero intero n(puoi scegliere 0 o 1-indicizzato), restituisca l'ennesimo numero scarso e l'ennesimo numero ricco.

Ingresso

  • Un numero intero ( >= 0se indicizzato 0 o >= 1se indicizzato 1)

Produzione

  • 2 numeri interi, uno per la sequenza scadente e uno per la sequenza ricca, nell'ordine che preferisci purché sia ​​coerente

Esempi:

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

Regole generali:

  • Questo è , quindi vince la risposta più breve in byte.
    Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione.
  • Per la tua risposta valgono regole standard con regole I / O predefinite , quindi puoi usare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
  • Sono vietate le scappatoie predefinite .
  • Se possibile, aggiungi un link con un test per il tuo codice (ad es. TIO ).
  • Inoltre, si consiglia vivamente di aggiungere una spiegazione per la risposta.

2
Congettura: il ° numero di poveri è sempre maggiore del n ° numero di ricchi. Se qualcuno può dimostrarlo, probabilmente eliminerà i byte da molte risposte.nn
Robin Ryder,

@RobinRyder: sospetto che sia vero, ma dimostrarlo è una storia completamente diversa :)
digEmAll

@RobinRyder Considera che più numeri possono essere mappati sugli stessi numeri invertiti a causa di zero iniziali (es. 51, 510, 5100 tutti mappati su 15). Per ogni numero , ci sarà un numero infinito di numeri inversi corrispondenti più ricchi con zero finali (con fattori aggiuntivi di 10 , 100 , 1000 , ecc.), Mentre solo una quantità finita di numeri invertiti più poveri. Non penso che questo lo provi completamente (forse c'è una catena fortunata di numeri poveri da qualche parte lungo la linea), ma almeno specifica che ci sono numeri molto più ricchi che poveri. n10,100,1000
Jo King,

2
@JoKing "... numeri molto più ricchi che poveri." Potrebbe voler chiarire questa affermazione; come scritto potrebbe essere interpretato nel dire che l'insieme di numeri ricchi ha una cardinalità maggiore rispetto all'insieme di numeri poveri. Ma ovviamente entrambi gli insiemi sono numerabili infiniti (nessuna sequenza termina): è sufficiente dimostrare che ci sono infiniti numeri primi la cui prima cifra è a 2. Per questo, vedere Corollary 1.4 alla fine del seguente documento, con nuguale a 19, 199, 1999, ...: m-hikari.com/ijcms-password/ijcms-password13-16-2006/…
mathmandan

Risposte:


9

05AB1E , 16 byte

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

Provalo online!


0 indicizzato [ricco, scarso]:

∞                # 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.

Forse qualcuno può spiegare perché questa versione non sembra terminare, ma quando faccio clic su "annulla esecuzione" su TIO termina con la risposta corretta o se aspetti 60 secondi ottieni la risposta corretta. Per una versione che termina "correttamente" è possibile utilizzare: T+nL.¡ÂÑgsÑg.S}¦ζsè+3 byte


Split-by non sembra funzionare molto bene con infiniti elenchi.
Emigna

@Emigna personalmente, non ho idea di come siano possibili elenchi infiniti.
Magic Octopus Urn

Valutazione pigra. Non calcolare il numero che non ti serve. Quindi ∞n5ècalcolerebbe solo i primi 6 numeri. Penso che quando entrano in gioco questi tipi di costrutti loop / raggruppamento / scissione, il pigro eval fallisce e cerca di calcolare tutti gli oggetti prima di tornare.
Emigna

1
Penso ancora che dovrebbe esserci un built-in a 1 byte per €g.. L'ho usato così spesso. Avrebbe salvato un byte qui con l'alternativa (ora uguale byte) ‚рgÆ.±. Bella risposta però! Ottimo utilizzo di !
Kevin Cruijssen

@KevinCruijssen un altro 2 byte per quello è δglol.
Magic Octopus Urn

6

JavaScript (ES6),  121 115 113  111 byte

L'input è 1 indicizzato. Uscite come[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)]

Provalo online!

Commentate

Funzione di aiuto

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

Principale

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

Gelatina , 22 byte

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

Provalo online!

Un programma completo con 1 indicizzaton su stdin e restituisce un elenco di n-esimi interi poveri e ricchi in quell'ordine.

Spiegazione

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

(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)&

Provalo online!

Se la congettura è vera, allora funziona anche questa soluzione di 140 byte

(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)&   

Provalo online!

Qui c'è trama povera vs ricca

inserisci qui la descrizione dell'immagine


Qual è quel punto in cui si avvicinano davvero?
Jo King,

1
@JoKing Credo di sia(27635)= {70003, 65892}
J42161217

1
Grande! A proposito, questa è probabilmente una delle poche soluzioni (forse l'unica) in grado di raggiungere n = 35842 su TIO :)
digEmAll

3

Perl 6 , 81 byte

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

Provalo online!

  • * > *è una funzione anonima che restituisce true se il suo primo argomento è maggiore del secondo. Allo stesso modo per * < *. Il primo selezionerà i numeri che appartengono alla sequenza ricca, il secondo selezionerà quelli che appartengono alla sequenza scadente.
  • (* > *, * < *).map(-> &c { ... }) produce una coppia di sequenze infinite, ognuna basata su una delle funzioni di confronto: la sequenza ricca e la sequenza scarsa, in quell'ordine.
  • »[$_]indicizza entrambe le sequenze usando $_, l'argomento alla funzione di livello superiore, restituendo un elenco di due elementi contenente il $_th membro della sequenza rich e il $_th membro della sequenza poveri.
  • grep $_ %% *, 1..$_produce un elenco dei divisori di $_.
  • map { grep $_ %% *, 1..$_ }, $_, .flipproduce un elenco di due elementi dei divisori di $_, e i divisori di $_con le sue cifre invertite ("capovolto").
  • [[&c]]riduce quell'elenco di due elementi con la funzione di confronto &c(maggiore o minore di), producendo un valore booleano che indica se questo numero appartiene alla sequenza ricca della sequenza scadente.

1..$_può essere ^$_. Puoi anche spostare la [$_]funzione all'interno della mappa. 78 byte
Jo King,

3

Python 2 , 142 141 byte

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

Provalo online!



Alternativa non ricorsiva (molto simile alle altre risposte di Python)

Python 2 , 143 byte

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]

Provalo online!


3

Python 2 , 158 153 byte

-2 byte grazie a shooqie

n=input()
p=[];r=[];c=1
while min(len(p),len(r))<=n:[[],r,p][cmp(*[sum(x%-~i<1for i in range(x))for x in c,int(str(c)[::-1])])]+=[c];c+=1
print p[n],r[n]

Provalo online!

L'input è indicizzato 0. Uscite come poor rich.


Sarebbe +=[c]invece di .append(c)lavoro?
shooqie,

@shooqie Sarebbe
Grimmy

2

Rubino , 128 byte

L'input è a zero . Output come [poveri, ricchi].

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

Spiegazione

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

Provalo online!


2

Perl 6 , 76 byte

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

Provalo online!

Non ho visto la risposta Perl 6 di Sean , ma questo funziona in modo diverso. Nota che ho hardcoded il upperbound come n*3+99, che probabilmente non è strettamente corretto. Tuttavia, potrei sostituire il *3con ³senza byte extra, il che renderebbe il programma molto meno efficiente, se più corretto.



2

Icona , 180 175 byte

procedure f(n)
a:=[];b:=[];k:=1
while{s:=t:=0 
i:=1to k+(m:=reverse(k))&(k%i=0&s+:=1)|(m%i=0&t+:=1)&\x
s>t&n>*a&push(a,k)
s<t&n>*b&push(b,k)
k+:=1;n>*a|n>*b}
return[!b,!a];end

Provalo online!


2

APL (Dyalog Unicode) , 34 byte

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

Provalo online!

Grazie ad Adám e ngn per avermi aiutato a golf questa mostruosità.

TIO va in timeout per gli indici più grandi (che richiedono ⍳1e5o ⍳1e6), ma, dato il tempo e la memoria sufficienti, la funzione termina correttamente.


2

R , 152 137 byte

-12 byte grazie a Giuseppe -3 byte grazie a 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

Provalo online!

Tè l'intero attualmente in fase di prova; gli ultimi numeri poveri e ricchi sono memorizzati nel vettore F.

Il modo più breve che ho trovato di invertire un numero intero è stato convertirlo in cifre in base 10 con aritmetica modulare, quindi riconvertirlo con poteri di 10 invertiti, ma mi aspetto di essere superato su questo e altri fronti.

Spiegazione (della versione precedente e simile):

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 byte ; non ho idea di quale sia la risposta di digEmAll
Giuseppe,

@Giuseppe Grazie! Adoro l'uso di nchar.
Robin Ryder,

142 byte ; Ho avuto problemi con la precedenza dell'operatore prima, ma perplesso.
Giuseppe,


2
@digEmAll 138 byte che ritornano a log10!
Giuseppe,

1

JavaScript (Node.js) ,190 180 byte

Uscite come [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}

Provalo online!

Spiegazione

d(n) Funzione

Questo aiutante trova il numero di fattori che un numero ha.

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
};

Funzione principale

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.