Найти сумму первых n оживленных чисел

19

терминология

Увеличивающееся число равно единице, где каждая цифра больше или равна всем цифрам слева от нее (например, 12239)

Уменьшающееся число - это число, где каждая цифра меньше или равна всем цифрам слева от нее (например, 95531)

Надувное число - это любое число, которое не увеличивается или не уменьшается. Поскольку для этого требуется как минимум 3 цифры, первое оживленное число - 101

Задание

Дано целое число n, большее или равное 1, найти сумму первых n оживленных чисел

правила

  • Это код гольф, поэтому ответ с кратчайшим количеством байтов выигрывает
  • Если ваш язык имеет ограничения на целочисленный размер (например, 2 ^ 32-1), n ​​будет достаточно маленьким, чтобы сумма помещалась в целое число
  • Входные данные могут быть в любой разумной форме (стандартный, файл, параметр командной строки, целое число, строка и т. Д.)
  • Вывод может быть в любой разумной форме (стандартный вывод, файл, графический пользовательский элемент, отображающий число и т. Д.)

Контрольные примеры

1 > 101
10 > 1065
44701 > 1096472981
avern
источник
3
Я не уверен, что понимаю ваши ограничения. Могу ли я sortузнать номера и проверить, совпадают ли они с исходным номером? Это использует встроенный ( sort), но это не совсем встроенный, чтобы проверить, увеличивается ли он. Ознакомьтесь с ненаблюдаемыми требованиями к программе и делайте X без Y в нашей мета-публикации «Что нужно избегать».
AdmBorkBork
5
Привет, добро пожаловать в PPCG! Хотя это хороший первый пост (+1), у меня есть некоторые небольшие предложения: Нет встроенные команды , что проверка , если число увеличивается , может использоваться , Нет встроенные команды , которые проверяют , является ли строка лексический увеличением может быть использована (запрещая встроенные команды) это вещь , чтобы избежать проблем при написании ; у нас есть Песочница для Предложенных задач , где вы можете поделиться своей идеей поста перед отправкой, чтобы получить отзывы и рекомендации :)
Mr. Xcoder
Я обновил ограничения, чтобы они лучше соответствовали категории «Исключения» по ссылке, которую вы разместили
до
4
Я до сих пор не вижу смысла в таком ограничении. Конечно, решать вам, сохранять это или нет, но запрещение встроенных программ - это, как правило, плохая практика. Если вы чувствуете, что встроенные модули упрощают задачу, вы должны заметить, что простое их ограничение не делает решение задачи более интересным, а скорее добавляет шаблон. Не могли бы вы рассмотреть возможность снятия этого ограничения? (кстати, это все еще подпадает под Do X без Y ) В противном случае, мне очень нравится идея, и я не хотел бы, чтобы слегка субъективное ограничение отвлекало от реальной задачи.
Мистер Кскодер
10
Однако я снял это ограничение, так как ясно, что таким образом сообщество будет более приятным, и буду доверять руководящим принципам и лучшим практикам, обеспечивающим наилучшее качество
испытаний

Ответы:

8

Желе , 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.
Деннис
источник
4
+1 ṚƬочень аккуратно ...
Мистер Xcoder
6

Pyth , 10 байт

s.f!SI#_B`

Попробуй это здесь!

Как это устроено?

sf! SI # _B` - Полная программа. Принимает целое число Q из STDIN и выводит в STDOUT.
 .f - Найти первые Q натуральных чисел, которые удовлетворяют определенному условию.
   ! SI # _B - Состояние. Возвращает true только для оживленных номеров.
       _B` - Приведите число в строку и разделите (попарно) его обратным порядком.
      # - Фильтр-сохранить эти ...
     Я - Это инвариант под ...
    S - сортировка.
           - Чтобы уточнить, я (инвариант) является оператором Pyth, который принимает два входа, 
             Функция и значение и проверяет, является ли функция (значение) == значение, так
             это технически не встроенный.
   ! - Логично, что нет. Пустой список отображается на true, другие значения на false.
с - сумма.
Мистер Xcoder
источник
4

К (нгн / к) , 37 байт

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

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

{ } это функция с аргументом x

x{ }\0применяется {}на 0 xвремя, сохраняя при этом промежуточные результаты

(1+) является функцией-преемником

{ }(1+)/x+1применяет функцию-преемник начиная с x+1тех пор, пока не {}вернет true

10\x десятичные цифры x

a: назначить в a

|\ максимальное сканирование (частичные максимумы) a

&\ аналогично, мин-скан

a~|\aэто aсоответствует его максимальному сканированию?

| или

a~&\a его минимальное сканирование?

+/ сумма

СПП
источник
4

JavaScript (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
Arnauld
источник
3

Python 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:]))
mbomb007
источник
Вы можете сравнивать символы напрямую. На самом деле, ваше заданное понимание может стать set(map(cmp,`x`[:-1],`x`[1:])).
Якоб
@ Якоб Спасибо. Я всегда забываю, что ты можешь использовать mapэтот способ.
mbomb007
1
x=s=0\nwhile n:b={-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]));s+=x*b;n-=b;x+=1сохраняет 3 байта
Mr. Xcoder
3

Сетчатка , 93 байта

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

Попробуйте онлайн! Объяснение:

K`:

Инициализировать s=i=0. ( sчисло #s до :, iчисло #s после.)

"$+"{
...
)`

Повторите nраз.

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

Повторять пока iне бодро.

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

Увеличьте iи сделайте копию в десятичном виде.

\d
*_;

Преобразовать цифры копии в одинарные. Тест на бодрость использует унарную копию, поэтому он работает только один раз, iно был увеличен хотя бы один раз.

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

Добавить iк sи удалить копию одинарных цифр, так что для следующего прохода внутреннего цикла тест bounciness терпит неудачу , и iполучает приращение по крайней мере один раз.

\G#

Преобразовать sв десятичную.

121-байтовая версия рассчитывается в десятичном формате, поэтому может работать для больших значений n:

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

Попробуйте онлайн! Объяснение:

K`0:0

Initialise s=i=0 .

"$+"{
...
)`

Повторите nраз.

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

Повторять пока iне бодро.

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

Увеличить iи сделать копию.

+`;\d
;$&*_;

Преобразовать цифры копии в одинарные. Тест на бодрость использует унарную копию, поэтому он работает только один раз, iно был увеличен хотя бы один раз.

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

Добавить iк sи удалить копию одинарных цифр, так что для следующего прохода внутреннего цикла тест bounciness терпит неудачу , и iполучает приращение по крайней мере один раз.

:.*

Удалить i.

Нил
источник
3

05AB1E , 12 байтов

µN{‚Nå_iNO¼

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

объяснение

µ              # loop over increasing N until counter equals input
     Nå_i      # if N is not in
 N{‚          # the pair of N sorted and N sorted and reversed
         NO    # sum N with the rest of the stack
           ¼   # and increment the counter
Emigna
источник
3

Java 8, 114 112 байт

n->{int i=0,s=0;for(;n>0;++i)s+=(""+i).matches("0*1*2*3*4*5*6*7*8*9*|9*8*7*6*5*4*3*2*1*0*")?0:--n*0+i;return s;}

Использует регулярное выражение для проверки, увеличивается или уменьшается число. Попробуйте это онлайн здесь .

Ungolfed:

n -> { // lambda
    int i = 0, // the next number to check for bounciness
        s = 0; // the sum of all bouncy numbers so far
    for(; n > 0; ++i) // iterate until we have summed n bouncy numbers, check a new number each iteration
        s += ("" + i) // convert to a String
             .matches("0*1*2*3*4*5*6*7*8*9*" // if it's not an increasing  number ...
             + "|9*8*7*6*5*4*3*2*1*0*") ? 0 // ... and it's not a decreasing number ...
             : --n*0 // ... we have found another bouncy number ...
               + i; // ... add it to the total.
    return s; // return the sum
}
OOBalance
источник
2

Python 2, 250 байт

n=input()
a=0
b=0
s=0
while a<n:
    v=str(b)
    h=len(v)
    g=[int(v[f])-int(v[0]) for f in range(1,h) if v[f]>=v[f-1]]
    d=[int(v[f])-int(v[0]) for f in range(1,h) if v[f]<=v[f-1]]
    if len(g)!=h-1 and len(d)!=h-1:
       a+=1
       s+=b
    b+=1
print s
драники
источник
Добро пожаловать! Вы можете просмотреть эту страницу для Советы по игре в гольф на Python
mbomb007
1
Я предлагаю использовать ;для размещения как можно больше операторов в одной строке, удаляя пробелы и определяя функцию для 2 очень длинных строк, которые очень похожи, так что вы можете повторно использовать часть кода. Также вы можете сделать a=b=s=0и len(g)!=h-1!=len(d).
mbomb007
Спасибо за советы. Я должен идти. но я поработаю над этим позже.
Hashbrowns
0

Красный , 108 байт

func[n][i: s: 0 until[t: form i
if(t > u: sort copy t)and(t < reverse u)[s: s + i n: n - 1]i: i + 1
0 = n]s]

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

Более читабельно:

f: func [ n ] [
    i: s: 0
    until [
       t: form i  
       if ( t > u: sort copy t ) and ( t < reverse u ) [
            s: s + i
            n: n - 1
       ]
       i: i + 1
       0 = n
    ]
    s
]

Хорошая возможность использования form- form iна 5 байт корочеto-string i

Гален Иванов
источник
0

MATL , 31 30 байт

l9`tVdZS&*0<a?wQtG>?.]y]QT]xvs

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

l       % Initialize counter to 1
9       % First value to check for being bouncy
`       % Start do-while loop
  tV    % duplicate the current number and convert to string
        % (let's use the iteration where the number is 1411)
        % stack: [1, 1411, '1411']
  d     % compute differences between the characters
        %  For non-bouncy numbers, this would be either all 
        %  positive values and 0, or all negative values and 0
        % stack: [1, 1411, [3 -3 0]]
  ZS    % keep only the signs of those differences
        % stack: [1, 1411, [1 -1 0]]
  &*    % multiply that array by its own transpose, so that
        %  each value is multiplied by every other value
        %  for non-bouncy numbers, all products will be >=0
        %  since it would have had only all -1s or all 1 (other than 0s)
        % stack: [1, 1411, [1 -1  0
                            -1  1 0
                            0  0  0]]
  0<a?  % if any value in the matrix is less than 0
    wQ    % switch the counter to top, increment it
          % stack: [1411, 2]
    tG>?  % duplicate it, check if it's gotten greater than the input limit
      .]    % if so, break out of loop
  y]    % else, duplicate bouncy number from inside stack,
        %  keeping a copy to be used for summing later
        % stack: [1411, 2, 1411]
  QT    % increment number, push True to continue loop
]     % loop end marker
x     % if we've broken out of loop, remove counter from stack
v     % concatenate the bouncy numbers we've collected in stack and 
s     % sum them
sundar - Восстановить Монику
источник
0

R , 96 байт

function(n){while(n){y=diff(T%/%10^(0:log10(T))%%10);g=any(y<0)&any(y>0);F=F+T*g;n=n-g;T=T+1};F}

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

Пояснение:

while(n){                         # while n > 0

        T%/%10^(0:log10(T))%%10   # split T into digits(T==TRUE==1 at the 1st loop)
y=diff(                         ) # compute the diff of digits i.e. digits[i] - digits[i+1]

g=any(y<0)&any(y>0)               # if at least one of the diff is < 0 and 
                                  # at least one is > 0 then T is "bouncy"

F=F+T*g                           # if bouncy increment F (F==FALSE==0 at the 1st loop)

n=n-g                             # decrement n by 1 if bouncy

T=T+1}                            # increment T by 1 and loop

F}                                # return F
digEmAll
источник
0

Рубин (123 байта)

o=0
x=["0"]
while n>0 do x=(x.join.to_i+1).to_s.split('')
(x.sort!=x&&x.sort!=x.reverse ? (n-=1;o+=x.join.to_i):'')
end
p o

Выглядит довольно уродливо для меня. Bounciness определяется в этом блокеx.sort!=x&&x.sort!=x.reverse

ааааа говорит восстановить монику
источник
0

C (gcc), 104 байта

f(b,o,u,n,c,y){for(o=u=0;b;u+=y?0:o+0*--b,++o)for(n=o,y=3;n/10;)c=n%10,n/=10,y&=(c-=n%10)<0?:c?2:y;b=u;}

Попробуйте это онлайн здесь .

Ungolfed:

f(n, // function: return type and type of arguments defaults to int;
     // abusing extra arguments to declare variables
  i,   // number currently being checked for bounciness
  s,   // sum of the bouncy numbers
  j,   // copy of i to be used for checking bounciness in a loop
  p,   // used for investigating the last digit of j
  b) { // whether i is not bouncy; uses the two least significant bits to indicate increasing/decreasing
    for(i = s = 0; // check numbers from zero up; initial sum is zero
        n; // continue until we have n bouncy numbers
        s += b ? 0 // not bouncy, no change to the sum
        : i + 0* --n, // bouncy, add it to the sum and one less bouncy number to go
        ++i) // either way, move to the next number
        for(j = i, b = 3; j/10; ) // make a copy of the current number, and truncate it from the right until there is just one digit left
        // bounciness starts as 0b11, meaning both increasing and decreasing; a value of 0 means bouncy
            p = j % 10, // get the last digit
            j /= 10, // truncate one digit from the right
            b &= // adjust bounciness:
                 (p -= j % 10) // compare current digit to the next
                 < 0 ? // not an increasing number, clear second to least significant bit
                 : p ? 2 // not a decreasing number, clear least significant bit
                 : b; // keep it the same
    n = s; // gcc shortcut for return s
}
OOBalance
источник
Предлагаю u+=!y?--b,o:0,++oвместо u+=y?0:o+0*--b,++o, ;y&=(c-=n%10)<0?:c?2:y)c=n%10,n/=10;а не;)c=n%10,n/=10,y&=(c-=n%10)<0?:c?2:y;
потолок кошка