Сума цілих чисел у рядку


11

Вхідні дані

Рядок.

Вихідні дані

Сума всіх цілих чисел у рядку.

Обмеження

1≤довжина рядка≤500

Зразок тесту

Вхідні дані

the 5is 108 seCONd4 a

Вихідні дані

117

Пояснення

Сума: 5 + 108 + 4 = 117


6
Привіт, ласкаво просимо до PPCG. Проблеми, що стосуються однієї мови, зазвичай нападають тут на PPCG. Можливо, ви могли б змінити це на загальний виклик: задавши рядок, виведіть суму всіх чисел у рядку, ігноруючи все інше (тобто, "the 5is 108 seCONd4 a"це призведе до 117тому, що 5+108+4=117). Крім того, кожне "запитання" має мати виграшну умову . У цьому випадку я припускаю, що це [code-golf] (що є найкоротшим можливим рішенням)?
Кевін Кройсейсен

4
Видається, що ви розмістили подібне запитання на SO, яке, як правило, підтверджує, що воно не було розроблено як виклик PPCG, і ви шукаєте "корисний" код, а не гольф-код. Я рекомендую натомість покращити своє початкове запитання щодо SO, щоб воно краще відповідало правилам сайту.
Арнольд

4
Я відремонтував вашу посаду, щоб відповідати нашим стандартам. Не соромтесь редагувати, якщо результат вам не підходить.
Адам


2
Як щодо цього випадку string x='-12hello3';ви рахуєте від’ємні цілі числа (тобто -12 + 3 === -9)?
Shaun Bebbers

Відповіді:


4

Javascript, 34 32 байти

s=>eval(s.match(/\d+/g).join`+`)

Зіставте всі цифри і приєднайтеся до них, +перетворивши їх на 5 + 108 + 4, оцініть результат.
Працює лише з натуральними числами.

Збережено 2 байти завдяки Арнольду

f=
    s=>eval(s.match(/\d+/g).join`+`)

g=()=>b.innerHTML = f(a.value)
g()
<input id=a value="the 5is 108 seCONd4 a" onkeyup="g()">
<pre id=b>


Я думаю, що використовувати string.length в консолі для підрахунку символів - це не дуже гарна ідея, коли вона містить символи втечі ... Ну, виправлено. Thx again
Bassdrop Cumberwubwubwub

Трохи кращий варіант був би console.log(f.toString().length), але він також не на 100% надійний.
Арнольд

Або просто використовувати TIO ...
Джо Кінг


4

05AB1E , 11 6 байт

þмS¡þO

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

Пояснення:

þм       # Only leave the non-digits of the (implicit) input-string
         #  i.e. "the 5is 108 seCONd4 a" → "the is  seCONd a"
  S      # Split it into a list of characters
         #  → ["t","h","e"," ","i","s"," "," ","s","e","C","O","N","d"," ","a"]
   ¡     # Split the (implicit) input-string by each of these characters
         #  → ["","","","","5","","","108","","","","","","","4","",""]
    þ    # Remove the empty strings by only leaving the digits
         #  → ["5","108","4"]
     O   # And sum these numbers (which is output implicitly)
         #  → 117

1
О, ей, розумне використання ¡!
Ерік Аутгольфер


3

APL (Dyalog Unicode) , 11 байт

Анонімна мовчазна прихильна функція

+/#⍎¨∊∘⎕D⊆⊢

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

 аргумент

 розділений (твори True стають шматками, запуск False є роздільниками) на

 членство
 в
⎕D наборі цифр

#⍎¨ оцініть кожного в кореневій області імен

+/ сума




2

Вугілля деревне , 5 байт

IΣ⁺ψS

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення: SumОператор « Вугільного вугілля» автоматично витягує числа з рядка, однак якщо рядок не містить нецифрових символів, то натомість вона бере цифрову суму, тому я з'єдную нульовий байт, щоб уникнути цього. Потім результат повертається до рядка для неявного виводу.



2

Zsh , 21 байт

<<<$[${1//[^0-9]/+0}]

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

  ${1           }  # the 5is 108 seCONd4 a
  ${1//[^0-9]/+0}  # +0+0+0+05+0+0+0108+0+0+0+0+0+0+04+0+0
$[${1//[^0-9]/+0}] # 117

На жаль, Баш скаржиться, бо інтерпретує його 0108як восьмеричний. Zsh не робить (якщо тільки setopt octalzeroes)



1

Python 3 , 63 59 56 байт

Чому ні. Обов’язковий зворотній відповідь. Можливо, міг би стикувати 6 за допомогою Python 2, але що завгодно. Більше не застосовується, оскільки я використовую підхід eval замість карти.

import re;x=lambda y:eval('+'.join(re.findall('\d+',y)))

Пояснення:

import re; # Import regex module
x=lambda y: eval(                                 ) # Run as Python code
                  '+'.join(                     ) # Joined by '+'
                            re.findall('\d+',y) # A list of all matches of regex \d+ in string y

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


Приємно! У TIO слід використовувати z == l[1]замість цього z is l[1]. Поточний код може створювати помилкові негативи, якщо кількість стає досить високою.
Якоб

1

Java 10, 66 байт

Це лямбда від Stringдо int.

s->{var r=0;for(var n:s.split("\\D"))r+=new Long("0"+n);return r;}

Негативні цілі числа не підтримуються. Імовірно, це нормально.

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

Подяка


1
Ви можете переключитися [^0-9]на \Dкілька байт, також ви можете переключитися longі Stringна var(хоча вам доведеться змінити тип повернення наint
Втілення Незнання

1

Рубі, 32 27 символів

->s{eval s.scan(/\d+/)*?+}

Подяка


Ласкаво просимо до PPCG! Ви можете використовувати *?+замість .join ?+-7 байт. Див. Ary * str
Conor O'Brien

1

Cubix , 17 байт

?|i.I!/s+q;;>p.O@

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

    ? |
    i .
I ! / s + q ; ;
> p . O @ . . .
    . .
    . .

Дивіться, як це працює

Досить простий. Iв кубікс візьме перше ціле число на вході і натисне його на стек. Це спричиняє пропуск усіх персонажів. Інша частина стосується додаткового та виявлення кінця вводу.

  • I! Введіть ціле число і протестуйте його на 0
  • s+q;;Якщо немає нуля, поміняйте TOS (сили та початкові 0) та додайте. Підсуньте результат до нижньої частини стіни і очистіть верх. Повернутися до початку.
  • /i? Якщо нуль, переадресуйте і зробіть введення символів для перевірки
  • |?;/Якщо позитив (персонаж) перетвориться направо на відображення, це відштовхує його назад через шашку ?і повертає право на поп зі стека, залишаючи 0 на TOS. Потім IP перенаправляється назад в основний цикл.
  • I>p.O@ якщо від'ємний (кінець введення) поверніть ліворуч, зробіть ціле введення, доведіть нижню частину стека до верху, виведіть і зупиніть






0

Attache , 23 байти

Sum##N=>MatchAll&"\\d+"

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

Більш цікава, але непряма відповідь (37 байт): {Sum!Reap[ReplaceF[_,/"\\d+",Sow@N]]}

Пояснення

Sum##N=>MatchAll&"\\d+"

Він має форму:

f##g=>h&x

який при розширенні та зміні в дужках стає:

f ## (g => (h&x))

##складається дві функції разом, =>створює функцію, що відображає ліву функцію над результатом правої функції, і &прив'язує аргумент до сторони функції. Для введення _це еквівалентно:

{ f[Map[g, h[_, x]]] }

Спочатку ми виконуємо MatchAllрозрядні символи ( \\d+). Після цього ми перетворюємо кожен запуск у фактичне ціле число за допомогою Nфункції. Нарешті, ми беремо суму цих чисел за допомогою Sum.


0

APL (NARS), символи 13, байти 26

{+/⍎¨⍵⊂⍨⍵∊⎕D}

тест:

  f←{+/⍎¨⍵⊂⍨⍵∊⎕D}
  f 'the 5is 108 seCONd4 a'
117



0

Japt v2.0a0-x , 3 байти

Ще один тестовий диск для мого (дуже WIP) перекладача.

q\D

Спробуй це

q\D     :Implicit input of string
q       :Split on
 \D     :  Non-digit characters (/[^0-9]/)
        :Implicitly reduce by addition and output

0

Java 8, 53 130 байт

105 байт + 25 байт для імпорту регулярного виразу

s->{long c=0;for(Matcher m=Pattern.compile("\\d+").matcher(s);m.find();c+=new Long(m.group()));return c;}

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

s->{                                                    // Lambda function
    long c=0;                                           // Sum is zero
    for(Matcher m=Pattern.compile("\\d+").matcher(s);   // Prepare regex matcher
        m.find();                                       // While the string contains unused matches...
        c+=new Long(m.group()));                        // Add those matches to the output
    return c;                                           // Return the output
   }

2
Я не думаю, що це правильно: (єдиний) приклад ОП говорить, що послідовні цифри повинні утворювати єдине ціле число, тому "123" повинен створювати 123, а не 6, як це робить ваш код.
Михайло

Це прикро, я перегляну, коли зможу
Бенджамін

@Michail переглянуто
Бенджамін



0

Піп , 6 байт

$+a@XI

Трактується -123як від’ємне ціле число. Спробуйте в Інтернеті!

  a     Command-line input
   @XI  Regex find all integers (XI is a variable predefined as the regex `-?\d+`)
$+      Fold on +

Якщо дефіси слід ігнорувати, а не трактувати як мінусові знаки, то наступні дії для 7 байт :

$+a@+XD

XDє заданою змінною для `\d`; +XDдодає +до нього модифікатор регулярного вираження , що відповідає 1 або більше цифрам.


0

Java (JDK) , 98 94 93 байт

s->java.util.Arrays.stream(s.split("\\D")).filter(t->!t.isEmpty()).mapToLong(Long::new).sum()

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

-4 bytesза допомогою Long::newзамість Long::valueOf.
-1 byteскорочуючи регулярний вираз - якщо ми пізніше вже видаляємо порожні рядки, робимо додаткові додатки під час розщеплення.

Пояснив

s->                            // Lambda (target type is ToLongFunction<String>)
    java.util.Arrays.stream(   // Stream the result of
        s.split("\\D")        // splitting on non-digits
    )
    .filter(t->!t.isEmpty())   // Discard any empty strings
    .mapToLong(Long::new)      // Convert to long
    .sum()                     // Add up the stream's values.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.