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

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)

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

ASCII-только
источник
К сожалению, это, кажется , вызывает 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}}

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

ASCII-только
источник
#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"))

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

fənɛtɪk
источник
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

Древесный уголь , 10 байт

IΣIEθ✂θ⁰Iι

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

   Eθ       Map over input string
        Iι  Cast current character to integer
     ✂θ⁰    Slice input string to that length
 ΣI         Cast slices to integer and take the sum
I           Cast result to string and implicitly print
Нил
источник
Ха-ха, у меня было то же самое
только ASCII
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 「$_」
}
Брэд Гилберт b2gills
источник
2

C (gcc) , 77 75 байтов

Должен быть скомпилирован с -lmкоммутатором, или GCC не распознает математические функции.

r,q,i;f(n){for(r=0,i=n;i;i/=10)q=log10(n)+1-i%10,r+=n/pow(10,q>0?q:0);n=r;}

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

gastropner
источник
2

постоянный ток , 55 байт

[0*]sq?dsfZ1-se[lfddZrIle^/I%-d0>qIr^/+led1-se0<a]dsaxp

Нет строк или массивов! Действительно, требуемые цифры приобретаются исключительно посредством математических манипуляций.

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

Р. Кап
источник
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

J , 18 байт

[:+/"."0".@{."0 1]

объяснение

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

           {."0 1  - take
    "."0           - current char as int items
                 ] - from the argument
         ".        - and convert them to an integer  
[:+/               - add them up

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

Гален Иванов
источник
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 когда-нибудь, и мы проведем вам экскурсию.
Лохматый
1

Stax , 6 байт

ç╫&º±å

Запустите и отладьте его онлайн

Соответствующее представление ascii той же программы таково.

EZFy(e+

E        get array of digits
 Z       push 0 under array of digits
  F      for each digit, run the rest of the program
   y     input as a string
    (    get start of string for specified number of characters
     e   evaluate substring as integer
      +  add
рекурсивный
источник
0

На самом деле 10 байтов

╝ß⌠≈╛H≈⌡MΣ

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

объяснение

╝          Push input to register 1
 ß         Push n-th input (0 by default)
        M  Map
  ⌠    ⌡   Function
   ≈       Cast current character of input to int
    ╛      Get value of register 1 (input)
     H     Push input[:current character]
      ≈    Cast to int
         Σ Sum
ASCII-только
источник
0

JavaScript, 43 байта

Это хорошо после 3 часов утра, почему я все еще играю в гольф ?!

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

s=>(g=x=>s[x]?+s.slice(0,s[x])+g(++x):0)(0)

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

мохнатый
источник
0

Perl 5, 26 байт

Включает +1в себя дляp

perl -pE 's%.%/.{0,$&}/;$\+=$&%eg}{' <<< 2315; echo
Тон Хоспел
источник
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
streetster
источник
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
Кевин Круйссен
источник
0

REXX 118 байт

pull n                           
l=length(n)                      
a=0                              
j=1                              
do while (j<=l)                  
if substr(n,j,1)==0 then m=0;    
else m=substr(n,1,substr(n,j,1));
a=a+m                            
j=j+1                            
end                              
say a                                 

Попробуйте это здесь.
Укажите значение Input на вкладке STDIN.

Сринивасан СП
источник
0

Желе , 6 байт

DµḣµVS

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

Получите Dцифры ввода, затем получите первые [каждую цифру] элементы ввода ( ead), затем Vвсе суммы, чтобы снова сделать его числом, и Sит.

chromaticiT
источник