字符串中的整数总和


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
我已经对您的帖子进行了大修,以符合我们的标准。如果结果不适合您,请随时进行编辑。
亚当

4
@Adámcodegolf.meta.stackexchange.com/ a
mbomb007

2
在这种情况下string x='-12hello3';,您要计算负整数(即-12 + 3 === -9)吗?
Shaun Bebbers

Answers:


4

Javascript,34 32字节

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

匹配所有数字,+并将其变成5 + 108 + 4,将其加入,评估结果。
仅适用于正整数。

感谢Arnauld,节省了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来计算字符时,如果它包含转义字符,则不是一个好主意。再次
谢谢

更好的选择是console.log(f.toString().length),但也不是 100%可靠。
阿诺尔德

或只是使用TIO ...
Jo King


4

05AB1E11 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


4

R64 48 45字节

看到PowerShell条目后,我可以进行进一步的研究。

function(s)eval(parse(,,gsub('\\D+','+0',s)))

在线尝试!


t=在这里就足够了,而不是text
朱塞佩

谢谢,我总是忘记了部分匹配(以及,,,,的字符串,直到获得所需的选项)。
CT大厅,

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

不幸的是,bash抱怨,因为它解释0108为八进制。Zsh不会(除非setopt octalzeroes



1

Python 3中63个 59 56字节

为什么不。强制性正则表达式答案。可以使用Python 2停靠6。由于我使用的是评估方法而不是地图,因此不再适用。

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到的Lambda int

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

不支持负整数。大概没关系。

在线试用

致谢


1
您可以切换[^0-9]\D几个字节,还可以切换longStringvar(虽然你将不得不返回类型更改为int
无知的方式


1

Cubix,17个字节

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

在线尝试!

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

观看它运行

一个相当简单的。 I在cubix中,它将输入中的第一个整数并将其推入堆栈。这具有跳过所有字符的作用。其余部分将处理附加内容并检测输入的结束。

  • I! 输入一个整数并将其测试为0
  • s+q;;如果不为零,则交换TOS(力和初始0)并添加。将结果推入堆栈底部并清除顶部。返回开始。
  • /i? 如果为零,请重定向并输入字符以进行检查
  • |?;/如果正数(字符)右移为反射,则将其推回检查器?并从堆栈中右移到弹出式菜单上,TOS上保留0。然后将IP重定向回主循环。
  • I>p.O@ 如果负数(输入的末尾)向左转,则进行整数输入,将堆栈的底部移至顶部,然后输出并停止。

1

PHP40 39个字节

<?=array_sum(preg_split('(\D)',$argn));

在线尝试!

php -nF输入运行来自STDIN。例:

$ echo the 5is 108 seCONd4 a | php -nF sumint.php    
117


1

提前,13个字节

之所以有效,是因为I只需扫描输入流以查找下一个看起来像数字的令牌,而忽略其他任何内容。

~Ilj~#
 >K+O@

在线尝试!




0

附件,23字节

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

在线尝试!

一个更有趣但间接的答案(37个字节): {Sum!Reap[ReplaceF[_,/"\\d+",Sow@N]]}

说明

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

其形式为:

f##g=>h&x

展开并加上括号后,将变为:

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

##将两个函数组合在一起,=>创建一个将左函数映射到右函数的结果的函数,并将&参数绑定到函数的一侧。对于input _,这等效于:

{ 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

C#(Visual C#交互式编译器),117111字节

a=>System.Text.RegularExpressions.Regex.Replace(a,@"\D+"," ").Split(' ').Select(x=>x==""?0:int.Parse(x)).Sum();

在线尝试。



0

Japt v2.0a0,3 -x个字节

我的(ver-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
我认为这是不正确的:OP的(唯一)示例建议连续的数字应形成一个整数,因此“ 123”应产生123,而不是代码中的6。
Michail

不幸的是,我将在可能的情况下进行修改
Benjamin Urquhart,

@Michail修订
Benjamin Urquhart,


0

迅捷,109字节

func s(a:String){var d=0,t=0;a.forEach{(c) in if let e=Int(String(c)){d=d*10+e}else{t+=d;d=0}};t+=d;print(t)}

在线尝试!


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添加regex +修饰符,使其匹配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.
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.