첫 n 탄력 번호의 합을 구합니다 숫자는 각 숫자가 왼쪽의

술어

증가하는 숫자는 각 숫자가 왼쪽의 모든 숫자보다 크거나 같은 숫자입니다 (예 : 12239).

감소하는 숫자는 각 숫자가 왼쪽의 모든 숫자보다 작거나 같은 숫자입니다 (예 : 95531).

탄력 번호는 증가하거나 감소하지 않는 숫자입니다. 최소 3 자리 숫자가 필요하기 때문에 첫 번째 탄력 번호는 101입니다.

작업

정수 n이 1보다 크거나 같으면 첫 번째 n 탄력 숫자의 합을 찾으십시오.

규칙

  • 이것은 코드 골프이므로 가장 짧은 바이트 수의 답이 이깁니다.
  • 언어에 정수 크기 (예 : 2 ^ 32-1)에 대한 제한이있는 경우, 합계가 정수에 맞을만큼 충분히 작습니다.
  • 입력은 합리적인 형식 (stdin, 파일, 명령 행 매개 변수, 정수, 문자열 등) 일 수 있습니다.
  • 출력은 합리적인 형식 (stdout, 파일, 숫자를 표시하는 그래픽 사용자 요소 등) 일 수 있습니다.

테스트 사례

1 > 101
10 > 1065
44701 > 1096472981



답변

젤리 , 10 8 바이트

ṢeṚƬ¬µ#S

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

작동 원리

ṢeṚƬ¬µ#S  Main link. No arguments.

      #   Read an integer n from STDIN and call the chain to the left with argument
          k = 0, 1, 2, ... until n of them return a truthy result.
          Yield the array of successful values of k.
     µ    Monadic chain. Argument: k (integer)
Ṣ           Sort, after promoting k to its digit array.
  ṚƬ        Reverse 'til the results are no longer unique and yield unique results.
            Calling Ṛ on k promotes it to its digit array. If k = 14235, the
            result is [14235, [5,3,2,4,1], [1,4,2,3,5]].
 e          Check if the result to the left appears in the result to the right.
    ¬       Negate the resulting Boolean.
       S  Take the sum.


답변

Pyth , 10 바이트

s.f!SI#_B`

여기 사용해보십시오!

어떻게 작동합니까?

sf! SI # _B` – 전체 프로그램. STDIN에서 정수 Q를 가져 와서 STDOUT으로 출력합니다.
 .f – 특정 조건을 만족하는 첫 번째 Q 양의 정수를 찾습니다.
   ! SI # _B – 조건. 탄력 번호에 대해서만 true를 리턴합니다.
       _B` – 숫자를 문자열로 캐스트하고 그 반대로 뒤집습니다.
      # – 필터 유지 ...
     나는 – 그것은 변하지 않는 ...
    S – 정렬.
           – 명확히하기 위해, I (불변)는 두 개의 입력을받는 Pyth 연산자입니다.
             함수와 값을 확인하고 function (value) == value인지 확인합니다.
             이것은 기술적으로 내장 된 것이 아닙니다.
   ! – 논리적이 아닙니다. 빈 목록은 true로, 다른 값은 false로 매핑됩니다.
s – 합계


답변

K (ngn / k) , 37 바이트

{+/x{{(a~&\a)|a~|\a:10\x}(1+)/x+1}\0}

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

{ } 인수가있는 함수입니다 x

x{ }\0중간 결과를 유지하면서 정시 {}에 적용0 x

(1+) 후속 기능입니다

{ }(1+)/x+1x+1이후에 {}true를 리턴 할 때까지 후속 함수를 적용 합니다.

10\x 십진수입니다 x

a: 할당하다 a

|\ 최대 스캔 (부분 최대 값) a

&\ 마찬가지로, 최소 스캔입니다

a~|\a않습니다 a자사의 최대 스캔 일치?

| 또는

a~&\a 최소 스캔?

+/ 합집합


답변

자바 스크립트 (ES6), 77 바이트

f=(i,n=0,k,p)=>i&&([...n+''].map(x=>k|=x<p|2*(p<(p=x)))|k>2&&i--&&n)+f(i,n+1)

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

댓글

f = (                     // f = recursive function taking:
  i,                      //   i = number of bouncy numbers to find
  n = 0,                  //   n = current value
  k,                      //   k = bitmask to flag increasing/decreasing sequences
  p                       //   p = previous value while iterating over the digits
) =>                      //
  i && (                  // if there's still at least one number to find:
    [...n + '']           //   turn n into a string and split it
    .map(x =>             //   for each digit x in n:
      k |=                //     update k:
        x < p |           //       set bit #0 if x is less than the previous digit
        2 * (p < (p = x)) //       set bit #1 if x is greater than the previous digit
                          //       and update p
    )                     //   end of map()
    | k > 2               //   if both bits are set (n is bouncy):
    && i--                //     decrement i
    && n                  //     and add n to the total
  ) + f(i, n + 1)         //   add the result of a recursive call with n + 1


답변

파이썬 2, 110 92 89 바이트

n=input()
x=s=0
while n:b={-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]));s+=x*b;n-=b;x+=1
print s

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

이 함수는 숫자가 탄력적인지 여부를 결정합니다.

lambda x:{-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]))


답변

파이썬 2 , 84 바이트

i=s=0
n=input()
while n:b=`i`>`sorted(`i`)`[2::5]<`i`[::-1];n-=b;s+=b*i;i+=1
print s

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.


답변

망막 , 93 바이트

K`:
"$+"{/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`:(#*).*
:$1#;$.($1#
)`\d
*_;
)`:(#+).*
$1:$1
\G#

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

K`:

초기화합니다 s=i=0. ( s#의 앞에 있는 수이고 :, 뒤에 i있는 수입니다 #.)

"$+"{
...
)`

n시간을 반복하십시오 .

/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`
...
)`

i탄력이없는 동안 반복하십시오 .

:(#*).*
:$1#;$.($1#

증분 i하고 10 진수로 복사합니다.

\d
*_;

사본의 자릿수를 단항으로 변환하십시오. 바운스 테스트는 단항 사본을 사용하므로 한 번만 i증분 된 경우에만 작동합니다 .

:(#+).*
$1:$1

추가 is내부 루프의 다음 패스의 bounciness 테스트가 실패하고 그래서, 및 단항 숫자의 사본을 삭제 i한 번에 적어도 증가됩니다.

\G#

s십진수로 변환 합니다.

121 바이트 버전은 10 진수로 계산하므로 더 큰 값을 사용할 수 있습니다 n.

K`0:0
"$+"{/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`:(\d+).*
:$.($1*__);$.($1*__)
)+`;\d
;$&*_;
)`\d+:(\d+).*
$.(*_$1*):$1
:.*

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

K`0:0

초기화합니다 s=i=0.

"$+"{
...
)`

n시간을 반복하십시오 .

/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`
...
)

i탄력이없는 동안 반복하십시오 .

:(\d+).*
:$.($1*__);$.($1*__)

증분 i하고 사본을 만듭니다.

+`;\d
;$&*_;

사본의 자릿수를 단항으로 변환하십시오. 바운스 테스트는 단항 사본을 사용하므로 한 번만 i증분 된 경우에만 작동합니다 .

\d+:(\d+).*
$.(*_$1*):$1

추가 is내부 루프의 다음 패스의 bounciness 테스트가 실패하고 그래서, 및 단항 숫자의 사본을 삭제 i한 번에 적어도 증가됩니다.

:.*

삭제 i.