Відфільтруйте і додайте


16

Завдання

Завдання дуже просте. Враховуючи не порожній рядок, що містить числа , великі і малі літери , виведіть суму решти чисел. Наприклад:

a1wAD5qw45REs5Fw4eRQR33wqe4WE

Фільтрування всіх літер призведе до:

 1   5  45   5  4    33   4

Сума цих чисел дорівнює 1 + 5 + 45 + 5 + 4 + 33 + 4 = 97. Тож вихід був би 97.

Випробування

a > 0
0 > 0
5 > 5
10 > 10
a0A > 0
1a1 > 2
11a1 > 12
4dasQWE65asAs5dAa5dWD > 79
a1wAD5qw45REs5Fw4eRQR33wqe4WE > 97

Це , тому подання з найменшою кількістю байтів виграє!


Я знав, що раніше писав, що програма «Лабіринт» ... тут це те саме завдання, але і з негативними цифрами (що робить для деяких мов дивовижно велику різницю, тому я не думаю, що вони дурні).
Мартін Ендер

@ MartinBüttner Схоже, що в одне число не входять негативні числа: "-n (де n - ціле число) не зараховується як від'ємне n, а як дефіс, за яким йде n".
Павло

О, я бачу, що ти маєш на увазі. Ви говорите, що в ньому є дефіси, а у цього немає.
Павло

Відповіді:


22

GS2, 2 байти

Wd

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

Як це працює

W     Read all numbers.
      For input x, this executes map(int, re.findall(r'-?\d+', x)) internally.
 d    Compute their sum.

11
Ну, це було несподівано ...
Аднан

@Adnan: Це Денніс. Давши достатньо часу, він може знайти рішення для будь-якого коду для гольфу менш ніж у 4 байти.
Deusovi

13

Лабіринт , 8 байт

Візьміть це, Pyth ...

?+
;,;!@

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

Пояснення

Звичайний праймер (викрадений у Sp3000):

  • Лабіринт 2D та на основі стека. Стоси мають нескінченну кількість нулів на дні.
  • Коли вказівник інструкції досягне стику, він перевіряє верхню частину стека, щоб визначити, куди слід звернутись далі. Від’ємник ліворуч, нуль - вперед, а позитив - праворуч.

Тут дуже корисно те, що в Лабіринті є дві різні команди введення ,та ?. Перший читає один байт зі STDIN або -1в EOF. Останній зчитує ціле число з STDIN. Він пропускає все, що не є числом, а потім читає перше знайдене десятковим числом. Цей повертається 0в EOF, тому ми не можемо використовувати його для надійної перевірки тут EOF.

Основний цикл програми - це цей компактний біт:

?+
;,

Коли ?ми читаємо ціле число (ігноруючи всі літери), +додаємо його до поточного загального (який починається як один із неявних нулів у нижній частині стека). Потім ми читаємо іншого символу, ,щоб перевірити наявність EOF. Поки ми не в EOF, символом для читання буде буква, яка має позитивний код символів, тому IP повертає праворуч (з його точки зору; тобто із заходу). ;відкидає персонаж, тому що він нам не потрібен, а потім знову вводимо цикл.

Як тільки ми на EOF, ,натискає -1так, щоб IP-адреса повертала ліворуч (на схід). ;знову відкидає це -1, !виводить загальний обсяг як ціле число і @припиняє програму.


Дивовижні речі Мартіне!
Сіммонс

6

CJam, 13 байт

Виправлено роботу з введенням без чисел завдяки Деннісу! Також збережено байт, замінивши масив листів на масив ASCII вище кодової точки 64. А потім ще один байт, збережений Деннісом!

q_A,s-Ser~]1b

Проста транслітерація з літер у пробіли, а потім eval і сума. Спробуйте в Інтернеті .



5

Сітківка ,22 11

\d+
$0$*1
1

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

11 байт (!) Збережено завдяки Мартіну!

В основному, лише від десяткової до одинарної, а потім рахувати 1s.


1
Я, мабуть, повинен зробити $0неявний, якщо заміна починається з $*. Це дуже поширена модель, і це дозволило б вам перемогти Pyth. ;)
Мартін Ендер

@ MartinBüttner Хоча ти на це, ти можеш зробити правильний персонаж за замовчуванням і для чогось: O
FryAmTheEggman

хм, не погана ідея. Я буду думати про це.
Мартін Ендер

5

Japt, 2 байти

Nx

Перевірте це в Інтернеті!

Як це працює

N    // Implicit: N = (parse input for numbers, "strings", and [arrays])
x    // Sum. Implicit output.

Я отримую помилку "Japt.stdout" повинен бути відправлений на HTMLElement
Пуховик

@Downgoat Це трапляється зрідка; Я не впевнений, чому. Перезавантаження сторінки, здається, це виправить.
ETHproductions

5

JavaScript ES6, 35 байт

s=>eval(s.replace(/\D+/g,'+')+'.0')

Як це працює

По-перше, ми замінюємо кожен рядок нецифрових "+". В основному існують чотири різні способи:

1. 1b23c456   => 1+23+456
2. a1b23c456  => +1+23+456
3. 1b23c456d  => 1+23+456+
4. a1b23c456d => +1+23+456+

Випадки 1 і 2 вже опікуються. Але нам потрібно якось виправити останнє, +щоб воно не викликало помилок. Ми могли б її зняти .replace(/\+$,""), але це занадто дорого. Ми можемо додати a 0до кінця, але це вплине на останнє число, якщо рядок не закінчується a +. Компроміс - додавання .0, яке є дійсним числом самостійно і не впливає на значення інших цілих чисел.

Ось кілька інших цінностей, які також спрацювали:

.0
-0
 +0
-""
-[]
0/10
0e-1
.1-.1

Альтернативна версія, також 35 байт

s=>s.replace(/\d+/g,d=>t+=+d,t=0)|t

Ще одна альтернативна версія, 36 байт

s=>s.split(/\D/).map(d=>t+=+d,t=0)|t

4

Pyth, 12 11 10 байт

ssM:z"\D"3
    z        autoinitialized to input()
   : "\D"3   split on non-digits
 sM          convert all elements of resulting array to ints
s            sum

На щастя, s (конвертувати в int) повертається 0при застосуванні до порожнього рядка, тому мені не потрібно турбуватися про те, що split("a1b", "\D+")повертається ["", "1", ""]. Аналогічно split("a", "\D+")повертається ["", ""].

Це навіть дозволяє мені розділити кожен нецифровий окремо, оскільки 1 + 0 + 0 + 0 + 0 + 2це те саме, що і 1 + 2.

Дякую Томасу Ква за байт!


4

Гол> <> , 4 байти

iEh+

Так короткий мені потрібен фіктивний текст ...


3
Можливо, ви повинні пояснити свій код своїм додатковим простором :)
nneonneo

4

Perl 6 , 18 байт

{[+] .comb(/\d+/)}
{[+] .split(/\D/)}

Використання:

my &code = {[+] .comb(/\d+/)}

say code 'a'; # 0
say code '0'; # 0
say code '5'; # 5
say code '10'; # 10
say code 'a0A'; # 0
say code '1a1'; # 2
say code '11a1'; # 12
say code '4dasQWE65asAs5dAa5dWD'; # 79
say code 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'; # 97

3

Желе, 6 байт

&-ṣ-ḌS

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

Як це працює

&-ṣ-ḌS  Main link. Input: L (string)

&-      Take the bitwise AND of L's characters and -1.
        This attempts to cast to int, so '0' & -1 -> 0 & -1 -> 0.
        On failure, it returns the integer argument (if any), so 'a' & -1 -> -1.
  ṣ-    Split the resulting list at occurrences of -1.
    Ḍ   Convert each chunk from decimal to integer. In particular, [] -> 0.
     S  Compute the sum of the results.

3

Perl, 21 + 1 = 22 байти

$_=eval join"+",/\d+/g

Потрібен -pпрапор:

$ perl -pe'$_=eval join"+",/\d+/g' <<< 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'
97

Це працює, коли немає жодної кількості? наприклад a?
FryAmTheEggman

@FryAmTheEggman Добре запитання, я думаю, він не надрукує нічого, що в числовому контексті є 0;-)
andlrc

3

Джулія, 35 байт

s->sum(parse,matchall(r"\d+","0"s))

Це анонімна функція, яка приймає рядок і повертає ціле число. Щоб викликати його, призначте його змінній.

Ми використовуємо matchallдля отримання масиву, що складається з збігів регулярного виразу \d+, які є лише цілими числами в рядку. Нам потрібно застосувати 0 до передньої частини рядка, інакше у таких випадках "a"ми підсумовуємо порожній масив, що спричиняє помилку. Потім ми застосовуємо parseдо кожного збігу рядків, який перетворюється на цілі числа, і беремо суму.


parseможе стати, intякщо ви не заперечуєте проти попередження про депресію.
Денніс

@Денніс я хоч ._.
Олексій А.

2

PHP, 64 байти

<?php preg_match_all("/\d+/",$argv[1],$a);echo array_sum($a[0]);

Виконати це як

php -f filterOutAndAddUp.php <test_case>

https://eval.in/517817


Ласкаво просимо до головоломок програмування та обміну стеками. Це чудова відповідь (+1), проте її можна покращити, додавши пояснення коду та розбивку. Також ви могли б використовувати <?замість <?php?
wizzwizz4


2

Математика, 51 байт

Total@ToExpression@StringCases[#,DigitCharacter..]&

Ловлячи неправильний кінець багатослівного вбудованого Mathematica. 1 Байт вимкнено за допомогою @DavidC


DigitCharacter ..збереже 1 байт
DavidC

DigitCharacterне працює як написано, оскільки він видаляє всі цифри, тоді як ми хочемо видалити всі букви ...
A Simmons

1
ти правий. Я думав проTotal@ ToExpression@StringCases[#, DigitCharacter ..] &
DavidC

Я бачу! Так, ця зміна економить байт.
A Simmons

2

R, 46 43 байти

sum(strtoi(strsplit(scan(,''),'\\D')[[1]]))

Пояснення

                    scan(,'')                  # Take the input string
           strsplit(         ,'\\D')           # Returns list of all numeric parts of the string
                                    [[1]]      # Unlists to character vector
    strtoi(                              )     # Converts to numeric vector
sum(                                      )    # Sums the numbers

Вибірка зразка

> sum(strtoi(strsplit(scan(,''),'\\D')[[1]]))
1: a1wAD5qw45REs5Fw4eRQR33wqe4WE
2: 
Read 1 item
[1] 97

Правка: замінено [^0-9]на \\D.


Ласкаво просимо до головоломки програмування та коду для гольфу. Це чудова перша відповідь; однак це було б покращено, додавши пояснення коду та розбивку, тому ми знаємо, як це працює.
wizzwizz4

1

PowerShell, 28 26 байт

$args-replace"\D",'+0'|iex

Займає введення, $argsтоді робить регулярний вираз, -replaceщоб поміняти букви +0, а потім труби, які iex(коротко Invoke-Expressionі схоже eval).

PS C:\Tools\Scripts\golfing> .\filter-out-and-add-up.ps1 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'
97

Як варіант

Якщо ви все в порядку з стороннім висновком, ви можете зробити наступне, також з 28 26 байтами:

$args-split"\D"|measure -s

Це займе вхідний рядок $argsі -splitвін перетвориться в масив рядків на не числах (видалення їх у процесі). Наприклад, 1a2b33перетвориться на ['1','2','33']. Ми труба , що Measure-Objectз -Sumпараметром. Вихід буде таким:

PS C:\Tools\Scripts\golfing> .\filter-out-and-add-up.ps1 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'

Count    : 21
Average  : 
Sum      : 97
Maximum  : 
Minimum  : 
Property : 

Редагувати - durr, мені не потрібно регексу, [ ]оскільки я більше не вказую список можливих збігів ...


1

Гема, 39 символів

<D>=@set{s;@add{${s;};$0}}
?=
\Z=${s;0}

Проба зразка:

bash-4.3$ gema '<D>=@set{s;@add{${s;};$0}};?=;\Z=${s;0}' <<< 'a1wAD5qw45REs5Fw4eRQR33wqe4WE'

1

Серйозно, 13 байт

,ú;û+@s`≈`MΣl

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

Пояснення:

,ú;û+@s`≈`MΣl
,              push input
 ú;û+          push "abc...zABC...Z" (uppercase and lowercase English letters)
     @s        split on letters
       `≈`M    convert to ints
           Σ   sum
            l  length (does nothing to an integer, pushes 0 if an empty list is left, in the case where the string is all letters)

@Adnan Хороший улов - він виводить порожній список за допомогою a. Має бути однобайтове виправлення.
Мего


1

TI-Basic, 106 байт

Працює на калькуляторах TI-83/84!

Input Str1
"{0,→Str2
Str1+"N0→Str1
For(I,1,length(Ans
sub(Str1,I,1
If inString("0123456789",Ans
Then
Str2+Ans→Str2
Else
If ","≠sub(Str2,length(Str2),1
Str2+","→Str2
End
End
sum(expr(Ans


1

R, 50 байт

Потрібно gsubfnвстановити

sum(gsubfn::strapply(scan(,''),'\\d+',strtoi)[[1]])

Використовує strtoiдля примушування до числового


1

Рубін 45 байт

$*[0].split(/[a-z]/i).map(&:to_i).inject 0,:+

(Перша спроба на роботі, переглянемо це)


1

POSIX sh + tr + dc, 27 25 байт

dc -e "0d`tr -sc 0-9 +`p"

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


1

Луа, 51 байт

Досить короткий раз! Навіть коротший за Яву! Вхід повинен бути аргументом командного рядка, щоб він працював.

a=0 arg[1]:gsub("%d+",function(c)a=a+c end)print(a)

Безумовно

a=0                 -- Initialize the sum at 0
arg[1]:gsub("%d+",  -- capture each group of digits in the string
  function(c)       -- and apply an anonymous function to each of them
  a=a+c             -- sums a with the latest group captured
end)               
print(a)            -- output a

1

Утиліти Bash + GNU, 29

grep -Eo [0-9]+|paste -sd+|bc

Якщо це потрібно для підтримки введення даних без чисел (наприклад, a ), ми можемо зробити це:

Утиліти Bash + GNU, 38

1 байт збережено завдяки @TobySpeight.

(grep -Eo [0-9]+;echo 0)|paste -sd+|bc

Це не надрукує нічого для введення a. Зараз ми обговорюємо, чи дійсно це чи ні.
Денніс

@Dennis. Добре. Я додав ще одну версію, щоб охопити обидві випадки.
Цифрова травма

Ви можете використовувати ;замість того, ||щоб завжди додавати нуль, без шкоди.
Toby Speight

@TobySpeight Так, це добре - спасибі!
Цифрова травма

1

Python 2, 70 байт

Я даю відповідь Python просто заради задоволення.

import re
j=0
for i in map(int,re.findall('\d+',input())):j+=i
print j

Дуже просто і використовує регулярний вираз, щоб знайти всі цифри у вхідних даних. Спробуйте в Інтернеті!


1
У цьому контексті вам потрібно використовувати raw_inputабо перейти на python3. Зменшена версія (PY3, 56 байт): import re;print(sum(map(int,re.findall('\d+',input())))).
Діка

1

Oracle SQL 11.2, 105 bytes

SELECT NVL(SUM(TO_NUMBER(COLUMN_VALUE)),0)FROM XMLTABLE(('"'||regexp_replace(:1,'[a-zA-Z]','","')||'"'));

The regex convert alpha characters to ','

XMLTABLE create one row per item in the string using ',' as the separator.

Підсумовуйте рядки, щоб отримати результат.

NVL потрібен для обліку рядка без цифри.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.