过滤并添加


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

这是,因此,字节数最少的提交将获胜!


我知道我以前曾经写过迷宫程序... 这是同样的挑战,但是数字也为负(这对某些语言来说有令人惊讶的巨大差异,因此我认为它们不是重复的)。
Martin Ender

@MartinBüttner看起来其中一个不包含负数:“ -n(其中n是整数)不算作负n,而是算作连字符后跟n。”
保罗

哦,我明白你的意思。您是说它有连字符,而这个没有。
保罗,

Answers:


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

@Adnan:是丹尼斯。如果有足够的时间,他可以找到少于4个字节的任何代码高尔夫球的解决方案。
Deusovi '16

13

迷宫,8字节

拿,Pyth ...

?+
;,;!@

在线尝试!

说明

常用引物(从Sp3000盗取):

  • 迷宫是2D的,基于堆栈。堆栈的底部有无限个零。
  • 当指令指针到达结点时,它检查堆栈的顶部以确定下一个要转到的位置。负数为左,正数为零,正数为右。

这里真正方便的是迷宫有两个不同的输入命令,,?。前者从STDIN或-1EOF 读取单个字节。后者从STDIN读取一个整数。这样做会跳过不是数字的所有内容,然后读取找到的第一个十进制数字。这是0在EOF 返回的,因此我们在这里不能用它可靠地检查EOF。

程序的主要循环是这个紧凑的位:

?+
;,

随着?我们读到一个整数(忽略所有字母),与+我们把它添加到运行总量(其开始作为堆栈底部的隐含零之一)。然后我们读取另一个字符,以检查EOF。只要我们不在EOF上,读取的字符将是带有正字符代码的字母,因此IP向右转(从其角度来看;即西)。;丢弃字符,因为我们不需要它,然后再次进入循环。

当我们到达EOF时,,按下a即可-1使IP左转(向东)。;再次丢弃该值-1!将运行总计打印为整数并@终止程序。


马丁棒极了!
西蒙斯(Simmons)

6

CJam,13个字节

丹尼斯(Dennis)修复了无数字输入的问题!还可以通过在代码点64上方的ASCII数组替换letter数组来节省一个字节。然后由Dennis保存另一个字节!

q_A,s-Ser~]1b

从字母到空格的简单音译,然后是eval和sum。在线尝试


6

MATL,8字节

1Y4XXXUs

在线尝试!

1Y4      % predefined literal: '\d+'
XX       % implicit input. Match regular expression. Returns a cell array of strings
         % representing numbers
XU       % convert each string to a double. Returns a numeric array
s        % sum of numeric array

5

视网膜22 11

\d+
$0$*1
1

在线尝试!

感谢Martin,节省了11个字节(!)!

基本上只是十进制到一元,然后计算1s。


1
$0如果替换以开头,我可能应该隐式表示$*。这是一种非常常见的模式,它会让您击败Pyth。;)
Martin Ender

@MartinBüttner当您在使用它时,您也可以将正确的字符也默认设置为:O
FryAmTheEggman

嗯,这不是一个坏主意。我会考虑一下。
Martin Ender

5

Japt,2个字节

Nx

在线测试!

怎么运行的

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

我收到错误消息“ Japt.stdout”必须发送到HTMLElement
Downgoat

@Downgoat这偶尔会发生;我不知道为什么。重新加载页面似乎可以解决此问题。
ETHproductions 2016年

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+")return ["", ""]

这甚至允许我分别对每个非数字进行分割,因为1 + 0 + 0 + 0 + 0 + 2与相同1 + 2

感谢Thomas Kwa的帮助!



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,我们将其应用于每个字符串匹配项,将其转换为整数,然后求和。


parseint如果您不介意弃用警告,则可能会变为。
丹尼斯

@丹尼斯我..
Alex A.

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 '02

2

Javascript,32 39字节

s=>eval((s.match(/\d+/g)||[0]).join`+`)


2

Mathematica,51个字节

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

捕获冗长的Mathematica内置函数的错误结尾。在@DavidC的帮助下减少1字节


DigitCharacter ..将保存1个字节
DavidC

DigitCharacter不能按书面要求工作,因为它删除了所有数字,而我们希望删除所有字母...
Simmons

1
你是对的。我在想Total@ ToExpression@StringCases[#, DigitCharacter ..] &
DavidC

我知道了!是的,该更改节省了一个字节。
西蒙斯(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


欢迎使用编程难题和Code Golf。这是一个很好的第一答案;但是,通过添加代码说明和故障可以改善它,因此我们知道它的工作原理。
wizzwizz4 '02

1

电源外壳, 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

Gema,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 Good catch-输出带有的空列表a。应该是一字节修复程序。
Mego 2016年

1

Java,70个字节

s->{int n=0;for(String i:s.split("\\D+"))n+=Long.valueOf(i);return n;}

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

Ruby 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

Lua,51字节

一次很短!比Java还要短!输入必须是命令行参数才能起作用。

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

@TobySpeight节省了1个字节。

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

这不会打印任何内容作为输入a我们目前正在讨论这是否有效。
丹尼斯

@丹尼斯 好。我添加了另一个版本来解决这两种情况。
Digital Trauma

您可以使用;而不是||总是加零,而不会造成伤害。
Toby Speight

@TobySpeight是的,那很好-谢谢!
Digital Trauma

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字节

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

正则表达式将字母字符转换为“,”

XMLTABLE使用','作为分隔符,为字符串中的每个项目创建一行。

对行求和以得到结果。

需要NVL来说明无数字的字符串。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.