제수 부자와 가난한 숫자


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에 속하는 정수를 의도적으로 배제합니다 :

도전

위에서 정의한 두 시퀀스를 고려하면, 정수 n(0 또는 1- 인덱스를 선택할 수 있음)에서 n 번째 불량 및 n 번째 리치 수를 리턴 하는 프로그램 또는 함수를 작성 해야합니다.

입력

  • 정수 ( >= 00- 인덱스 또는 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

일반 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙기본 I / O 규칙으로 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 반환 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트와 링크를 추가하십시오 (예 : TIO ).
  • 또한 답변에 대한 설명을 추가하는 것이 좋습니다.

2
결론 : 번째 불량 번호는 항상 n 번째 리치 번호 보다 큽니다 . 누군가 이것을 증명할 수 있다면 아마도 많은 대답에서 바이트를 깎을 것입니다.
로빈 라이더

@RobinRyder : 나는 그것이 사실이라고 생각하지만 그것이 완전히 다른 이야기임을 증명합니다 :)
digEmAll

@RobinRyder 앞의 0으로 인해 여러 숫자가 동일한 역 숫자로 매핑 될 수 있습니다 (예 : 51, 510, 5100은 모두 15로 매핑). 모든 수 , 후행 0 (추가 인자 10 , 100 , 1000 등)을 갖는 무한한 수의 풍부한 대응 역수가있을 수 있으며 , 한정된 양의 역수는 한정되지 않습니다. 나는 이것이 완전히 그것을 증명한다고 생각하지는 않지만 (어쩌면 어딘가에 가난한 숫자의 행운의 사슬이있을 수 있습니다), 그러나 적어도 가난한 사람들보다 훨씬 많은 부자가 있다고 지정합니다. 10,100,1000
조 왕

2
@JoKing "... 빈민보다 훨씬 더 많은 숫자." 이 진술을 분명히하고 싶을 수도 있습니다. 기록 된 바와 같이, 이것은 일련의 풍부한 숫자가 불량한 숫자의 세트보다 더 큰 카디널리티를 가지고 있다고 해석 될 수있다. 그러나 물론 두 세트 모두 셀 수없이 무한합니다 (시퀀스가 종료되지 않음). 첫 번째 숫자가 소수 인 무한히 많은 소수가 있음을 증명하면 충분합니다 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

@Emigna 개인적으로, 나는 무한 목록조차도 가능한지 전혀 모른다.
매직 문어 항아리

게으른 평가. 필요하지 않은 숫자를 계산하지 마십시오. 따라서 ∞n5è처음 6 개의 숫자 만 계산합니다. 이러한 유형의 루핑 / 그룹화 / 분할 구조가 재생되면 게으른 평가가 실패하고 반환하기 전에 모든 항목을 계산하려고합니다.
Emigna

1
나는 아직도 1 바이트 내장이 있어야한다고 생각합니다 €g.. 너무 자주 사용했습니다. (지금 같은 바이트) 대안으로 여기에 바이트를 저장했을 것 ‚рgÆ.±입니다. 그래도 좋은 답변입니다! 좋은 사용법 !
Kevin Cruijssen

@KevinCruijssen 다른 2 바이트는 δglol입니다.
매직 문어 항아리

6

자바 스크립트 (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

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
큰! BTW,이 : 아마 도달 할 수 (어쩌면 유일한) 몇 가지 솔루션 중 하나 N TIO에 = 35842입니다
digEmAll

3

펄 6 , 81 바이트

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

온라인으로 사용해보십시오!

  • * > *첫 번째 인수가 두 번째 인수보다 큰 경우 true를 반환하는 익명 함수입니다. 마찬가지로 * < *. 전자는 리치 시퀀스에 속하는 숫자를 선택하고 후자는 빈 시퀀스에 속하는 숫자를 선택합니다.
  • (* > *, * < *).map(-> &c { ... }) 각각 하나의 비교 함수 중 하나를 기반으로하는 한 쌍의 무한 시퀀스를 생성합니다. 즉, 리치 시퀀스와 불량 시퀀스입니다.
  • »[$_]$_는 최상위 함수에 대한 인수 인을 사용하여 두 시퀀스 모두에 인덱스 $_하여 리치 시퀀스의 $_th 멤버와 가난한 시퀀스 의 th 멤버를 포함하는 두 개의 요소 목록을 리턴합니다 .
  • grep $_ %% *, 1..$_의 제수 목록을 생성합니다 $_.
  • map { grep $_ %% *, 1..$_ }, $_, .flip의 제수로 구성된 요소를 2 요소로 나열 하고 숫자가 거꾸로 된 $_제수 $_( "flipped")를 생성합니다.
  • [[&c]]비교 함수 &c(보다 크거나 작음)를 사용하여 두 요소 목록을 줄이고이 숫자가 불량 시퀀스의 풍부한 시퀀스에 속하는지 여부를 나타내는 부울 값을 생성합니다.

1..$_일 수 있습니다 ^$_. [$_]지도 기능 내부로을 이동할 수도 있습니다. 78 바이트
Jo King

3

파이썬 (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])

온라인으로 사용해보십시오!



비 재귀 대안 (다른 파이썬 답변과 매우 유사)

파이썬 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 바이트

입력 값이 0 입니다. [나쁨, 부자]로 출력합니다.

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

펄 6 , 76 바이트

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

온라인으로 사용해보십시오!

나는 Sean의 Perl 6 답변을 보지 못했지만 이것은 다른 방식으로 작동합니다. 나는 상한을로 하드 코딩했습니다 n*3+99. 아마 엄격하게 정확하지는 않습니다. 그러나, 나는 대체 할 수 *3³더 정확한 경우, 프로그램이 훨씬 덜 효율적으로 만들 것입니다 별도의 바이트합니다.




2

APL (Dyalog Unicode) , 34 바이트

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

온라인으로 사용해보십시오!

이 괴물을 도와 주신 Adám과 ngn에게 감사드립니다.

TIO는 더 큰 인덱스 ( ⍳1e5또는 필요 ⍳1e6)에 대해 시간 초과 되지만 시간과 메모리가 충분하면 함수가 올바르게 종료됩니다.


2

R , 152 137 바이트

Giuseppe 덕분에 -12 바이트 digEmAll 덕분에 -3 바이트

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

자바 스크립트 (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]
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.