Suma de enteros en cadena, separados por no numéricos como 'a' e 'Y'

14

Cree un programa que sume todos los enteros encontrados en una cadena que se establece como una variable en el programa (por lo tanto, el programa no tiene que manejar ninguna entrada). Los números enteros están separados por no numéricos (cualquier cosa menos 0, 1, 2, 3 ... 9).

Ejemplos:

  • 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 adicionales:

  • El soporte Unicode no es necesario, pero está permitido
  • -n(donde nes un número entero) no se cuenta como negativo n, sino como un guión seguido de n.

La respuesta se puede imprimir en la pantalla (pero no es obligatorio).

La respuesta más corta (en caracteres) gana.

Anto
fuente
¿Deberíamos imprimir el resultado también? (Usted menciona que no hay E / S).
Dogbert
@Dogbert: no pensé en eso. Lo siento, sí. Actualizaré la publicación.
Anto
Lo cambió porque algunas personas ya tenían respuestas y no querían "lastimarlas". Supongo que debería dormir ahora, así que pensaré un poco más claro;)
Anto
2
Anto: Sin embargo, una tarea en la que una solución no tiene efectos secundarios observables no es muy agradable.
Joey
Un caso de prueba interesante que acabo de encontrar sería 5a-3(mi código se saltaría -si sigue un número inmediatamente, pero no si hubiera un no número antes).
Martin Ender

Respuestas:

10

Perl, 15

Entrada en $_, suma en $c:

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

Ruby 1.9, 21 caracteres

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

Para imprimir la solución a stdout, se requieren 2 caracteres adicionales:

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

Y para leer desde stdin en lugar de usar una variable predefinida, se deben usar otros 3 caracteres:

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

Para Ruby 1.8, reemplace ?+con "+"para obtener una solución de trabajo en 22 caracteres.

Ventero
fuente
Se supone que la entrada debe tomarse de una variable, no stdin. También scanes más corto que split. Entonces su solución se convierte en eval s.scan(/\d+/)*?+21 caracteres.
sepp2k
@ sepp2k: Sí, no leí la descripción correctamente. Estoy acostumbrado a las otras tareas de golf, donde generalmente tienes que leer desde stdin e imprimir en stdout. Buen punto con scan, gracias!
Ventero
+1, gran uso de evaly* '+'
Dogbert
6

Pitón (60)

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

Ruby - 36 34 caracteres

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

36 caracteres si desea que se imprima el resultado.

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

Asume que la entrada está presente como una cadena en s.

Dogbert
fuente
4

JavaScript (ES6), 30

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

Versión 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
fuente
3

Windows PowerShell, 23 25 29 31

Con salida.

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

De hecho, sin salida es exactamente lo mismo, simplemente lo canalizaría a otro lugar donde sea necesario.

Joey
fuente
2

J - 40 38 caracteres

Versión perezosa. Requiere la biblioteca de cadenas.

+/".(,' ',.~a.-.'0123456789')charsub y
MPelletier
fuente
Soporta Unicode. Soporta codificación, ¡ahora que lo pienso!
MPelletier
2

Java

fuera del 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
fuente
2

JavaScript [30 bytes]

eval(s.match(/\d+/g).join('+'))
Visión
fuente
2

Laberinto , 29 21 bytes

(Descargo de responsabilidad: Labyrinth es más nuevo que este desafío).

Además, Labyrinth no tiene variables, así que elegí un programa normal de entrada / salida.

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

Esto fue bastante simple debido a la forma en que funcionan los comandos de entrada de Labyrinth. ?intenta leer un entero con signo de STDIN y se detiene en el primer no dígito. Si no puede leer un número entero (debido a que el siguiente carácter -no es seguido por un dígito, o cualquier otro no dígito, o hemos alcanzado EOF), en su 0lugar, volverá . ,por otro lado lee cualquier byte posterior y empuja el valor del byte. Si se llama a este en EOF, volverá en su -1lugar.

Aquí hay un pseudocódigo para la solución:

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

Tratar correctamente con números negativos complica bastante esta solución. Si no fuera por esos, tendría esta solución de 8 bytes:

?+
;,;!@
Martin Ender
fuente
1

PHP - 37

Sin imprimir;

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

Con impresión (38):

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

Perl, 16 caracteres

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

Toma entrada $_, la salida continúa $r. El último punto y coma es superfluo, pero probablemente será necesario cuando el programa haga más cosas. Agregar say$rpara salida.

ninjalj
fuente
Vaya, no vi exactamente la misma respuesta cuando publiqué. Aunque conté un personaje más incluso sin el punto y coma.
JB
@JB: ¡No puedo contar! :PAG. En realidad, cometí el error de hacer eco de una cadena entre comillas dobleswc -c .
ninjalj
1

J - 23 char

No es un ganador, pero podemos ver una primitiva bastante rara en acción.

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

Explicado:

  • _"."0 y- Para cada carácter en la cadena de entrada y, intente leerlo como un número. Si no puede, use el valor predeterminado _(infinito) en su lugar.

  • ,_=- Verifique la igualdad de cada resultado _y luego ejecute la matriz final de 0s y 1s en un vector. ( "."0siempre agrega demasiadas dimensiones al resultado, por lo que corregimos eso aquí).

  • y,:' ' - Agregue una fila de espacios debajo de la cadena de entrada.

  • }- Usado como está aquí, }se llama Item Enmienda , y usa la lista de 0s y 1s a la izquierda como índices para seleccionar la fila para dibujar en el argumento derecho. Entonces, lo que sucede es que, para cada columna en el lado derecho, tomamos el carácter original si se puede leer como un número, y de lo contrario tomamos el espacio debajo de él. Por lo tanto, cubrimos cualquier carácter no numérico con espacios.

  • +/". - Ahora convierta esta cadena completa en una lista de números y sume.

Algoritmo de tiburón
fuente
1

gs2, 4 bytes

W#Θd

Codificado en CP437 ; el tercer byte esE9 .

W lee todos los números /-?\d+/ de una cadena, asigna el valor absoluto,d sumas.

(gs2 también es más nuevo que este desafío, pero su read-numscomando es una coincidencia total).

Lynn
fuente
0

Smalltalk (Smalltalk / X) (51 caracteres)

usando el paquete regex:

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

wo regex:

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

entrada en s

blabla999
fuente
0

R, 30

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

Aquí, x está el nombre de la variable.

Ejemplo:

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

Javascript - 43 caracteres

Sé que es largo, pero no había una solución JS, así que :)

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

aes la cuerda ccontiene respuesta

Gaurang Tandon
fuente
0

Tcl, 30

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

Se supone que la entrada está en la variable $a(formalmente, en a) y almacena la respuesta en el resultado del intérprete. I / O se deja como un ejercicio.

Compañeros de Donal
fuente
0

C99 (con advertencias) 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 utilizar realmente el programa, debe asignar la variable de la siguiente manera:

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

Si está utilizando gcc necesita compilarlo como C99 así:

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

APL, 16 bytes

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

⎕des un incorporado que contiene los dígitos (0-9). bse asigna a un vector de 0/1 donde 1 se asigna a los caracteres que son dígitos. bse usa para comprimir la matriz de caracteres dada y luego se reutiliza para expandirla, lo que inserta espacios en blanco. es la evaluación de APL que convierte una cadena en un vector entero en este caso. +/calcula la suma

lstefano
fuente
Igual longitud, pero interesante:+/2⊃⍞⎕VFI⍨⎕AV~⎕D
Adám
0

Swift 3, 78

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

donde sesta la cuerda

Kametrixom
fuente
0

Perl - 24 caracteres

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

La entrada está en $ _

Kaundur
fuente
0

En realidad, 14 bytes (no competitivos)

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

Pruébalo en línea!

Esta presentación no es competitiva porque en realidad es bastante más nueva que este desafío.

Este programa admite la página de códigos CP437 para entrada.

Explicación:

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
fuente