Давши номер, роздрукуйте його "колективну суму"


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і це ваш результат


Особливі випадки:

Якщо ми стикаємося з a 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? Як програма повинна поводитися з цими вхідними
даними

Схоже, останній тестовий випадок неправильний; повинно бути 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
Чарівний восьминіг Урна

Радий, що я чекав, щоб потім додати посилання до байтів: p
Джонатан Алан

ε£}можна €£зберегти байт.
Кевін Кройсейсен

@KevinCruijssen це також був варіант, коли я створив це?
Джонатан Аллан

@JonathanAllan Не зовсім впевнений, але я думаю, що це справді вже було. Аднан почав писати перезапис Elixir ще влітку 2018 року (який був випущений у серпні), і він був досить довгий час у застарілій версії 05AB1E до цього. Це було вже тоді, коли я опублікував свою першу відповідь 05AB1E у квітні 2018 року. Тому, можливо, вона була додана незабаром після того, як ви опублікували цю відповідь, але я не впевнений.
Кевін Круїссен

5

Python 2 , 43 байти

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

Спробуйте в Інтернеті!


На жаль, схоже, це підвищує значення ValueErrorдля введення 1301або будь-якого входу, який має нуль як одну з його цифр.
mathmandan

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

Так що ви знаєте, що, здається, голосування дано автоматично користувачем спільноти, коли я редагував заголовок вашої публікації. Вибачте. Це дратівлива, безглузда особливість . Хоча я не знаю , чому це сталося , що на цей раз, тому що, наскільки я можу судити, це був НЕ позначений як низька якість.
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обчислює a not a particularly good checksumі ігнорує блок, який ви йому надаєте. Якщо ви мали на увазі n.chars.sum{, що Enumerable#sumне знаходиться в рубіновому стидлібі, це розширення, передбачене рейками. Будь ласка, протестуйте свої рішення перед публікацією.
Шельваку

@Shelvacu Так, я беру дані як масив, хоча ... дивіться нижній колонтитул. Плюс Enumerable#sumє у Ruby 2.4 , а TIO використовує 2.4
лише для ASCII

31 байт, якщо взяти масив цифр як вхідний
Асона Тухід,

@AsoneTuhid Я не вважаю, що це правильна форма введення, якщо ви знайдете докази інакше, будь ласка, поясніть
ASCII-тільки

Ця сторінка , здається, не вирішує цю проблему, але я не бачу, що список цілих чисел є занадто відмінним від списку символів (це відповідь, яку приймає ваша відповідь як вхідна)
Асона Тухід,

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,"")))))
Вло


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

Perl 6 , 27 байт

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

Перевірте це

Розширено:

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

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

O_o Або Japt справді гофрований, або я роблю насправді неправильно
лише ASCII,

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

@Shaggy Звичайно, але я не усвідомлював, що це гофри на рівні Jelly / Насправді / 05AB1E
лише для ASCII,

@ ASCII-тільки: О так, це, безумовно, там з ними, і це добре тримається :) Якщо вам цікаво, подивіться на нашу мову місячного нома. або заїжджайте в чат кімнати 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.