Soma de números inteiros na sequência, separados por números não numéricos, como 'a' e 'Y'

14

Crie um programa que soma todos os números inteiros encontrados em uma string que é definida como uma variável no programa (assim, o programa não precisa manipular nenhuma entrada). Os números inteiros são separados por não numéricos (qualquer coisa, exceto 0, 1, 2, 3 ... 9).

Exemplos:

  • 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

Notas extras:

  • O suporte a Unicode não é necessário, mas é permitido
  • -n(onde né um número inteiro) não é contado como negativo n, mas como um hífen seguido por n.

A resposta pode ser impressa na tela (mas não é necessária).

A resposta mais curta (em caracteres) vence.

Anto
fonte
Também devemos imprimir o resultado? (Você menciona sem E / S).
Dogbert
@ Dogbert - eu não pensei sobre isso. Desculpe sim. Vou atualizar a postagem.
Anto 08/02
Mudou, pois algumas pessoas já tinham respostas e não queriam "machucá-las". Acho que eu deveria dormir agora, então eu vou pensar um pouco mais claro;)
Anto
2
Anto: Porém, uma tarefa em que uma solução não tem efeitos colaterais observáveis ​​não é muito boa.
Joey
Um caso de teste interessante que encontrei seria 5a-3(meu código pularia -se seguir um número imediatamente, mas não se houvesse um número não antes dele).
Martin Ender

Respostas:

10

Perl, 15

Entrada $_, soma em $c:

s/\d+/$c+=$&/ge
JB
fonte
14

Ruby 1.9, 21 caracteres

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

Para imprimir a solução no stdout, são necessários 2 caracteres adicionais:

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

E para ler do stdin em vez de usar uma variável predefinida, outros 3 caracteres devem ser usados:

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

No Ruby 1.8, substitua ?+por "+"para obter uma solução funcional em 22 caracteres.

Ventero
fonte
A entrada deve ser retirada de uma variável, não stdin. Também scané mais curto que split. Portanto, sua solução se torna eval s.scan(/\d+/)*?+- 21 caracteres.
sepp2k
@ sepp2k: Sim, não leu a descrição corretamente. Estou acostumado a outras tarefas de golfe, nas quais você geralmente precisa ler de stdin e imprimir em stdout. Bom ponto com scan, obrigado!
Ventero
+1, ótimo uso de evale* '+'
Dogbert
6

Python (60)

import re;print sum(map(int,filter(len,re.split(r'\D',s))))
Hoa Long Tam
fonte
5

Ruby - 36 34 caracteres

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

36 caracteres, se você desejar que o resultado seja impresso.

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

Assume que a entrada está presente como uma sequência em s.

Dogbert
fonte
4

JavaScript (ES6), 30

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

Versão anotada:

// 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
)
Florent
fonte
3

Windows PowerShell, 23 25 29 31

Com saída.

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

De fato, sem a saída é exatamente a mesma, você a direcionaria para outro lugar onde for necessário.

Joey
fonte
2

J - 40 38 caracteres

Versão preguiçosa. Requer a biblioteca de cadeias.

+/".(,' ',.~a.-.'0123456789')charsub y
MPelletier
fonte
Suporta Unicode. Suporta codificação, pense nisso!
MPelletier
2

Java

fora do concurso;)

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;
}
Włodar
fonte
2

JavaScript [30 bytes]

eval(s.match(/\d+/g).join('+'))
Visão
fonte
2

Labirinto , 29 21 bytes

(Aviso: Labirinto é mais novo que esse desafio.)

Além disso, o Labyrinth não possui variáveis, então fui com um programa normal de entrada / saída.

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

Isso foi bastante simples devido à maneira como os comandos de entrada do Labyrinth funcionam. ?tenta ler um número inteiro assinado de STDIN e para no primeiro não dígito. Se ele não conseguir ler um número inteiro (porque o próximo caractere -não é seguido por um dígito, ou qualquer outro não dígito, ou chegamos ao EOF), ele retornará 0. ,por outro lado, lê qualquer byte subseqüente e pressiona o valor do byte. Se este for chamado no EOF, ele retornará -1.

Então, aqui estão alguns pseudocódigo para a solução:

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

Lidar com números negativos complica corretamente essa solução. Se não fosse por esses, eu teria essa solução de 8 bytes:

?+
;,;!@
Martin Ender
fonte
1

PHP - 37

Sem impressão;

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

Com impressão (38):

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

Perl, 16 caracteres

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

Recebe entrada $_, a saída continua $r. O último ponto e vírgula é supérfluo, mas provavelmente será necessário quando o programa fizer mais coisas. Adicionar say$rpara saída.

ninjalj
fonte
Ops, não recebi exatamente a mesma resposta quando eu postei. Embora eu tenha contado um caractere a mais, mesmo sem o ponto e vírgula.
JB
@JB: Eu não posso contar! : P. Na verdade, cometi o erro de repetir uma string com aspas duplaswc -c .
Ninjalj
1

J - 23 char

Não é um vencedor, mas podemos ver um primitivo bastante raro em ação.

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

Explicado:

  • _"."0 y- Para cada caractere na sequência de entrada y, tente lê-lo como um número. Se não puder, use o valor padrão _(infinito).

  • ,_=- Verifique cada resultado quanto à igualdade e _, em seguida, execute a matriz final de 0s e 1s em um vetor. ( "."0sempre adiciona muitas dimensões ao resultado, portanto, corrigimos isso aqui.)

  • y,:' ' - Adicione uma linha de espaços abaixo da sequência de entrada.

  • }- Usado como está aqui, }é chamado de Alteração de item e usa a lista de 0s e 1s à esquerda como índices para selecionar a linha da qual extrair o argumento correto. Então, o que acontece é que, para cada coluna no lado direito, pegamos o caractere original, se puder ser lido como um número, e, do contrário, ocupamos o espaço abaixo dele. Portanto, encobrimos caracteres não numéricos com espaços.

  • +/". - Agora converta toda essa string em uma lista de números e some-os.

algoritmshark
fonte
1

gs2, 4 bytes

W#Θd

Codificado no CP437 ; o terceiro byte éE9 .

Wlê todos os números /-?\d+/de uma string, mapeia o valor absoluto,d somas.

(gs2 também é mais novo que esse desafio, mas seu read-numscomando é uma total coincidência.)

Lynn
fonte
0

Smalltalk (Smalltalk / X) (51 caracteres)

usando o pacote regex:

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

wo regex:

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

entrada em s

blabla999
fonte
0

R, 30

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

Aqui, x é o nome da variável.

Exemplo:

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

Javascript - 43 caracteres

Eu sei que é longo, mas não havia solução JS, então :)

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

aé a string. ccontém resposta.

Gaurang Tandon
fonte
0

Tcl, 30

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

Ele assume que a entrada está na variável $a(formalmente, em a) e armazena a resposta no resultado do intérprete. E / S é deixada como um exercício.

Donal Fellows
fonte
0

C99 (com avisos) 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);}

Para realmente usar o programa, você precisa atribuir a variável da seguinte maneira:

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);}

Se você estiver usando o gcc, precisará compilá-lo como C99 da seguinte forma:

gcc -std=c99 x.c
Jerry Jeremiah
fonte
0

APL, 16 bytes

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

⎕dé um built-in contendo os dígitos (0-9). bé atribuído a um vetor 0/1, em que 1 é atribuído aos caracteres que são dígitos. bé usado para compactar a matriz de caracteres fornecida e, em seguida, reutilizado para expandi-la, que insere espaços em branco. é da APL eval que converte uma string em um vetor de números inteiros, neste caso. +/calcula a soma.

lstefano
fonte
Comprimento igual, mas interessante:+/2⊃⍞⎕VFI⍨⎕AV~⎕D
Adám 20/07/16
0

Swift 3, 78

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

onde sestá a corda

Kametrixom
fonte
0

Perl - 24 caracteres

warn eval join'+',/\d+/g

A entrada está em $ _

Kaundur
fonte
0

Na verdade, 14 bytes (não concorrentes)

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

Experimente online!

Este envio não é concorrente porque, na verdade, é um pouco mais novo que esse desafio.

Este programa suporta a página de códigos do CP437 para entrada.

Explicação:

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
Mego
fonte