Учитывая число, распечатайте его «коллективную сумму»


20

Учитывая число в качестве ввода, распечатайте его общую сумму

Что такое коллективная сумма?

Рассмотрим число 13214, вход

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

1 значит посмотрите на первую цифру и добавьте ее к сумме, sum = 1

3 значит посмотрите на «первые 3 цифры» и добавьте их к сумме, сумма = 1 + 132

2 значит посмотрите на «первые 2 цифры» и добавьте их к сумме, сумма = 1 + 132 + 13

1 значит посмотрите на первую цифру и добавьте ее к сумме, сумма = 1 + 132 + 13 + 1

4 значит посмотрите на «первые 4 цифры» и добавьте их к сумме, сумма = 1 + 132 + 13 + 1 + 1321

Общая сумма = 1468и это ваш вывод


Особые случаи:

Если мы сталкиваемся с 0, то ясно, что мы оставляем сумму одинаковой

The number 1301 would have a sum = 1 + 130 + 1 = 132

Если мы встречаем число, которое больше длины ввода, мы добавляем все это

The number 251 would have a sum = 25 + 251 + 2 = 278

Тестовые случаи:

collectiveSum(0) = 0

collectiveSum(2) = 2

collectiveSum(2315) = 23 + 231 + 2 + 2315 = 2571

Наименьшее количество байтов побеждает. Удачного игры в гольф!


6
Как часто возникает вопрос с такими задачами: можем ли мы принять список цифр в качестве ввода?
Джонатан Аллан

7
2315Тест пропускает + 2от 1и должно привести 2571.
Джонатан Аллан

Ожидаем ли мы иметь дело с входами, начинающимися с 0, кроме 0? Как программа должна справляться с этими входными данными
fəˈnɛtɪk

Похоже, что последний контрольный пример неверен; должно быть 2571.
лохматый

Я не понимаю, почему на входе должно быть число, а не список целых чисел. Это кажется излишне громоздкой формой ввода.
Пшеничный волшебник

Ответы:


7

05AB1E ,  4  3 байта

-1 благодаря Кевину Круйссену (использование избегания })

€£O

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

Как?

€£O - implicit input   e.g. 2315
€   - map with:
 £  -   head to             23, 231, 2, 2315
  O - sum                   2571

Избей меня на 13 секунд. XD
Волшебная урна осьминога

Рад, что я ждал, чтобы добавить ссылку на байты тогда: р
Джонатан Аллан

ε£}можно €£сохранить байт.
Кевин Круйссен

@KevinCruijssen был ли это вариант, когда я создал это?
Джонатан Аллан

@JonathanAllan Не совсем уверен, но я думаю, что это действительно уже было. Аднан начал писать переписанный Elixir летом 2018 года (который был выпущен в августе), и уже некоторое время был там в прежней версии 05AB1E. Он уже был там, когда я опубликовал свой самый первый ответ 05AB1E в апреле 2018 года. Возможно, он был добавлен вскоре после того, как вы опубликовали этот ответ, но я не уверен.
Кевин Круйссен

5

Python 2 , 43 байта

lambda n:sum(int('0'+n[:int(x)])for x in n)

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


К сожалению, это, кажется , вызывает a ValueErrorдля ввода 1301, или любой ввод, который имеет ноль в качестве одной из своих цифр.
Матмандан

@mathmandan Должен быть исправлен сейчас?
Только для ASCII

intФункция может принимать целое число, заменяя '0'строковый литерал только с 0должен сбрить один байт.
MooseOnTheRocks

@MooseOnTheRocks Сделал так, что мне кажется на вид менее хакерским (?), Если только я не глуп и не напутал что-то (обычно)
только ASCII

4

Python 2, 72 байта

Первая подача! Спасибо @DestructibleLemon за помощь!

import sys;d=sys.argv[1];s=0;for e in d:s+=int(d[:int(e)]);print str(s)

Точно так же вы знаете, downvote , кажется, был дан автоматически пользователем сообщества , когда я редактировал заголовок вашего поста. Сожалею. Это раздражающая, бессмысленная особенность . Хотя я не знаю, почему это произошло в этот раз, потому что, насколько я могу судить, это не было отмечено как некачественное.
Steadybox

Добро пожаловать в PPCG! Хорошая первая подача! И да, как сказал Steadybox, понижательное голосование было автоматически размещено без особой причины, в частности. Ваше сообщение получило несколько голосов "против", так что, надеюсь, на следующей работе cron автоматическое понижение должно быть удалено :)
HyperNeutrino

3

Haskell, 43 37 байт

f l=sum[read$'0':take(read[d])l|d<-l]

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

Введенный номер берется как строка.

   [        |d<-l]      -- for every digit d in the input string
        read[d]         -- convert to a number
      take     l        -- and take that many digits from l
     0:                 -- prepend a 0 (to handle 0s)
   read                 -- convert to a number
sum                     -- sum all numbers

3

Рубин , 36 байт

->n{n.sum{|x|n[0,x.to_i].join.to_i}}

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


#sumне определяется в fixnums, поэтому я предполагаю, что вы хотите nбыть строкой. Тем не менее, String#sumвычисляет not a particularly good checksumи игнорирует блок, который вы ему даете. Если вы имели в виду n.chars.sum{, Enumerable#sumне в ruby ​​stdlib, это расширение, предоставляемое rails. Пожалуйста, проверьте ваши решения, прежде чем публиковать их.
Шелваку

@Shelvacu Да, хотя я принимаю входные данные как массив ... см. Нижний колонтитул. Плюс Enumerable#sumв Ruby 2.4 , а TIO использует 2.4
только для ASCII

31 байт, если вы берете массив цифр в качестве входных данных
Asone Tuhid

@AsoneTuhid Я не думаю, что это правильная форма ввода, если вы найдете доказательства в противном случае, пожалуйста, объясните
только ASCII

Эта страница , похоже, не решает проблему, но я не вижу, что список целых чисел слишком сильно отличается от списка символов (что ваш ответ принимает в качестве входных данных)
Asone Tuhid

3

JavaScript, 42 40 байт

Спасибо @Shaggy за игру в 2 байта

f=
x=>[...x].map(y=>a+=+x.slice(0,y),a=0)|a

console.log(f("2315"))
console.log(f("0100"))
console.log(f("2"))
console.log(f("01025"))

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


40 байтов:x=>[...x].map(y=>a+=+x.slice(0,y),a=0)|a
лохматый

3

R, 57 байт

спас еще одно благодаря @Vlo

sum(strtoi(substring(i<-scan(,""),1,el(strsplit(i,"")))))

было: Сохранено 4 байта благодаря предложению @Robert Hacken.

i=scan(,"");sum(strtoi(substring(i,1,el(strsplit(i,"")))))

Простой строковый подход.


1
Вы можете сохранить 4 байта, заменив unlistна el.
Роберт Хакен

1
Сохранить 1 с встроенным назначениемsum(strtoi(substring(i<-scan(,""),1,el(strsplit(i,"")))))
Vlo



2

Октава , 56 байт

@(n)sum(str2num(['' 32+char(n.*(find(n)<=(n'-48))-32)]))

Анонимная функция, которая принимает строку в качестве входного аргумента и возвращает число в качестве выходного.

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

Более короткая версия

@(n)sum(str2num(['' char(n.*(find(n)<=(n'-48)))]))

работает в Matlab, потому что char(0)рассматривается как пространство.


2

Желе ,  7  5 байт

-2 благодаря Денису (голова векторизована>. <)

4, если мы можем взять списки цифр *

Dḣ`ḌS

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

* ḣ`ḌS

Как?

Dḣ`ḌS - Link: integer, n   e.g. 2315
D     - to decimal list         [2,3,1,5]
  `   - repeat left as right    [2,3,1,5]
 ḣ    - head                    [2,3], [2,3,1], [2], [2,3,1,5]
   Ḍ  - from decimal lists      23, 231, 2, 2315
    S - sum                     2571

2

Perl 6 , 27 байт

{sum $_ X[&substr]^«.comb}

Проверь это

Expanded:

{  # bare block lambda with implicit param 「$_」

  sum

    $_           # the input

      X[&substr] # crossed using &substr sub as if it was an infix operator

    \          # upto 「^」 for each of the following 「«」 (creates Range objects)
    .comb        # the input split into digits (implicit method call on 「$_」
}



1

Шелуха , 6 байт

ṁd´M↑d

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

объяснение

ṁd´M↑d  -- example input: 1301
     d  -- decimal digits: [1,3,0,1]
  ´M    -- map over it using it as argument (example with 3):
    ↑   -- | take: [1,3,0]
        -- : [[1],[1,3,0],[],[1]]
ṁ       -- map and then sum the result (example on [1,3,0]):
 d      -- | as decimal: 130
        -- : 1 + 130 + 0 + 1 = 132


1

Japt, 5 байт

Принимает ввод в виде строки.

¬x@¯X

Попытайся


объяснение

          :Implicit input of integer string U
¬         :Split to an array of characters/digits
  @       :Pass each X through a function
   ¯X     :Slice U from the first to the Xth character
 x        :Reduce by addition

О_о Либо Джапт действительно играет в гольф, либо я делаю что-то не так
только ASCII

2
@ ASCII-only: Japt намного более "гольфиен", чем думает большинство людей; мы выигрываем нашу справедливую долю испытаний, даже побеждая Charcoal и SOGL в недавнем конкурсе ascii-art .
Лохматый

@Shaggy Конечно, но я не осознавал, что это был уровень игры в гольфе Jelly / Actually / 05AB1E
только ASCII

@ ASCII-only: О, да, он определенно там с ними, прекрасно держит себя :) Если вам интересно, взгляните на наш язык в номинации месяца. или зайдите в чат Japt когда-нибудь, и мы проведем вам экскурсию.
Лохматый





0

К4 , 22 байта

Решение:

+/10/:'(x&#x)#\:x:10\:

Примеры:

q)k)+/10/:'(x&#x)#\:x:10\:13214
1468
q)k)+/10/:'(x&#x)#\:x:10\:1301
132
q)k)+/10/:'(x&#x)#\:x:10\:251
278
q)k)+/10/:'(x&#x)#\:x:10\:2315
2571

Объяснение:

Разбейте на основание-10, возьмите минимум каждого числа и длину списка из этого. Конвертировать обратно и подвести итог.

+/10/:'(x&#x)#\:x:10\: / the solution
                  10\: / to base 10, 123 => 1 2 3
                x:     / save as x
             #\:       / take (#) each left
       (    )          / the left
          #x           / count (#) length of x
        x&             / min of x and the length
  10/:'                / from base 10 each
+/                     / sum up the results

0

Java 8, 92 байта

n->n.chars().map(c->(c-=48)>0?new Integer(n.substring(0,c<n.length()?c:n.length())):0).sum()

Объяснение:

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

n->                                  // Method with String parameter and int return-type
  n.chars()                          //  Loop over the characters
   .map(c->(c-=48)                   //   Convert character to digit
        >0?                          //    And if it's larger than 0
         new Integer(n.substring(0,  //     Take the first `x` digits, where `x` is:
          c<n.length()?              //      If the digit higher than the total a.o. digits
           c                         //       Take the first `c` digits
          :                          //      Else:
           n.length()))              //       Take all digits
         :                           //    Else:
          0)                         //     Take 0
   .sum()                            //   And sum everything



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.