字符串中整数的总和,用非数字(例如“ a”和“ Y”)分隔


14

创建一个程序,该程序将在字符串中找到的所有整数求和,该字符串在程序中设置为变量(因此,该程序不必处理任何输入)。整数用非数字分隔(0、1、2、3 ... 9以外的任何数字)。

例子:

  • e7rde f ,fe 43 jfj 54f4sD = 7 + 43 + 54 + 4 = 108
  • 5 = 5
  • 64 545,5445-32JIFk0ddk = 64 + 545 + 5445 + 32 + 0 = 6086
  • 0ab0 = 0 + 0 = 0

额外说明:

  • Unicode支持不是必需的,但允许
  • -n(其中,n是一个整数)的计数为负n,但作为一个连字符,接着n

答案可能会打印在屏幕上(但不是必需的)。

最短答案(以字符为单位)获胜。


我们也应该打印结果吗?(您没有提到I / O)。
Dogbert,

@Dogbert-我没想到。对不起,是的。我将更新帖子。
安托

更改了它,因为有些人已经有了答案并且不想“伤害”他们。我想我应该睡了,所以我想想起来更清楚了;)
Anto

2
安托:解决方案没有明显的副作用的任务并不是很好。
乔伊(Joey)

我刚遇到的一个有趣的测试用例是5a-3-如果我的代码立即跟在一个数字后面,那么我的代码将跳过,但是如果前面没有一个数字,则不会跳过)。
Martin Ender

Answers:


10

Perl,15岁

输入$_,总和$c

s/\d+/$c+=$&/ge

14

Ruby 1.9,21个字符

eval a.scan(/\d+/)*?+

要将解决方案打印到stdout,需要两个附加字符:

p eval a.scan(/\d+/)*?+

要从stdin读取而不是使用预定义变量,则必须使用另外3个字符:

p eval gets.scan(/\d+/)*?+

对Ruby 1.8,替换?+"+"在22个字符,以获得工作的解决方案。


输入应从变量而不是stdin中获取。也scan比短split。因此,您的解决方案变为eval s.scan(/\d+/)*?+-21个字符。
sepp2k 2011年

@ sepp2k:是的,没有正确阅读说明。我只是习惯了其他高尔夫任务,通常您需要从stdin读取并打印到stdout。很好scan,谢谢!
Ventero

+1,eval以及* '+'
-Dogbert的

6

巨蟒(60)

import re;print sum(map(int,filter(len,re.split(r'\D',s))))

5

红宝石-36 34个字符

s.scan(/\d+/).map(&:to_i).reduce:+

如果要打印结果,则为36个字符。

p s.scan(/\d+/).map(&:to_i).reduce:+

假设输入在s中以字符串形式出现。


4

JavaScript(ES6),30

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

带注释的版本:

// Store the sum.
c=0,
// Process every number found in the `s`.
s.replace(/\d+/g,
  // Convert the number into an integer.
  // Add it to the sum.
  d => c += +d
)

3

Windows PowerShell,23 25 29 31

带输出。

$x-replace'\D','+0'|iex

实际上,没有输出是完全一样的,您只需将其通过管道输送到需要它的其他地方。


2

J- 40 38个字符

懒版本。需要字符串库。

+/".(,' ',.~a.-.'0123456789')charsub y

支持Unicode。支持编码,想一想!
MPelletier

2

爪哇

在竞赛之外;)

public static long sum(String s) {
    long sum = 0;
    String p = "";
    char[] ch = s.toCharArray();
    for (int i = 0; i < ch.length; i++) {
        boolean c = false;
        if (Character.isDigit(ch[i])) {
            if (i + 1 < ch.length) {
                if (Character.isDigit(ch[i + 1])) {
                    p += ch[i];
                    c = true;
                }
            }
            if (!c) {
                p += ch[i];
                sum += Integer.valueOf(p);
                p = "";
                c = false;
            }
        }
    }
    return sum;
}

2

JavaScript [30字节]

eval(s.match(/\d+/g).join('+'))

2

迷宫29 21字节

(免责声明:迷宫比这个挑战要新。)

另外,迷宫没有变量,因此我使用了普通的输入/输出程序。

)_"+`
( "?"
";;,;;(!@

由于Labyrinth的输入命令的工作方式,这相当简单。?尝试从STDIN读取有符号整数,并在第一个非数字处停止。如果它无法读取整数(因为下一个字符-后面没有一个数字,或者其他任何非数字,或者我们已经达到了EOF),它将返回0,另一方面,读取任何后续字节并压入字节值。如果在EOF调用此命令,它将返回-1

所以这是解决方案的一些伪代码:

running total = 0
while(true)
  while(true)
    try reading a non-zero integer N with ?
    if(N < 0)
      running total -= N
    else if(N > 0)
      running total += N
    else
      break
  // We've either read a zero or hit a something that isn't a number
  try reading a character with ,
  if(that returned -1)
    break
print running total

正确地处理负数会使此解决方案非常复杂。如果不是那些,我将有这个8字节的解决方案:

?+
;,;!@

1

PHP-37

不打印;

<?array_sum(@split("[^0-9]+",`cat`));

带有印刷品(38):

<?=array_sum(@split("[^0-9]+",`cat`));

1

Perl,16个字符

s/\d+/$r+=$&/ge;

接受输入$_,继续输出$r。最后一个分号是多余的,但是当程序执行更多操作时可能会需要分号。添加say$r输出。


糟糕,我发布时没有看到与您完全相同的答案。尽管即使没有分号,我也能算出一个字符。
JB

@JB:我不能数!:P。实际上,我犯了一个错误,该错误是在回显一个双引号的字符串wc -c
ninjalj 2011年

1

J-23个字符

不是赢家,但我们可以看到一个非常罕见的原始动作。

+/".(,_=_"."0 y)}y,:' '

解释:

  • _"."0 y-对于输入字符串中的每个字符y,请尝试以数字形式读取它。如果不能,请改用默认值_(无穷大)。

  • ,_=-检查每个结果是否等于_,然后将0和1的最终数组放入向量中。("."0总是在结果中添加太多维度,因此我们在此进行更正。)

  • y,:' ' -在输入字符串下方添加一行空格。

  • }-在此原样使用,}称为Item Amend,它使用左侧的0和1列表作为索引来选择要从右侧参数中绘制的行。因此,发生的情况是,对于右侧的每一列,如果可以将原始字符读取为数字,那么我们将其取为原来的字符,否则将使用其下方的空格。因此,我们用空格覆盖所有非数字字符。

  • +/". -现在将整个字符串转换为数字列表,并对它们求和。


1

gs2,4个字节

W#Θd

CP437编码; 第三个字节是E9

W/-?\d+/从字符串中读取所有数字,映射绝对值d和。

(gs2也比此挑战更新,但其read-nums命令完全是巧合。)


0

Smalltalk(Smalltalk / X)(51个字符)

使用正则表达式包装:

(s regex:'\d+' matchesCollect:[:n|n asNumber])sum

正则表达式:

((s asCollectionOfSubCollectionsSeparatedByAnyForWhich:[:c|c isDigit not]) map:#asNumber)sum

输入s


0

R,30

sum(scan(t=gsub("\\D"," ",x)))

在这里,x是变量的名称。

例:

> x  <- "e7rde f ,fe 43 jfj 54f4sD"
> sum(scan(t=gsub("\\D"," ",x)))
Read 4 items
[1] 108

0

Javascript-43个字符

我知道很长,但是没有JS解决方案,所以:)

c=0
a=a.split(/[^\d]/g)
for(i in a)c+=+a[i]

a是字符串。c包含答案。


0

Tcl,30

expr [regsub -all \\D+ $a.0 +]

它假定输入在变量中$a(正式名称为in a),并将答案存储在解释器结果中。I / O留作练习。


0

APL,16个字节

{+/⍎b\⍵/⍨b←⍵∊⎕d}

⎕d是包含数字(0-9)的内置函数。b分配给矢量0/1,其中1分配给数字字符。b用于压缩给定的字符数组,然后重新使用以扩展它,从而插入空格。是APL的eval,在这种情况下,它将字符串转换为整数的向量。+/计算总和。


等长,但很有趣:+/2⊃⍞⎕VFI⍨⎕AV~⎕D
亚当

0

斯威夫特3,78

s.characters.split{!("0"..."9"~=$0)}.flatMap{Int(String($0))}.reduce(0){$0+$1}

s字符串在哪里



0

实际上,14个字节(非竞争)

9u▀8╙r♂┌-@s♂≈Σ

在线尝试!

此提交是非竞争性的,因为实际上比此挑战要新。

该程序支持CP437代码页进行输入。

说明:

9u▀8╙r♂┌-@s♂≈Σ
9u▀             base 10 digits (0-9)
   8╙r♂┌        all characters in CP437 (map(ord_cp437, range(2**8)))
        -       set difference
         @s     split input on any value in the resulting list
           ♂≈Σ  convert to ints and sum

0

C 100

t=0;main(i,v)char**v;{for(char*q,*s=v[1];i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}

在线尝试!

早期的85字节版本通过对程序内部的字符串进行硬编码来作弊:

t=0;main(i){for(char*q,*s;i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}

要实际使用85字节程序,您需要像下面这样分配变量:

t=0;main(i){for(char*q,*s="text";i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}
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.