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.


¿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

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.


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


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.


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
)

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.


2

J - 40 38 caracteres

Versión perezosa. Requiere la biblioteca de cadenas.

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

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

2

JavaScript [30 bytes]

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

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:

?+
;,;!@

1

PHP - 37

Sin imprimir;

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

Con impresión (38):

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

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.


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.


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).


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


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

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


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.


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

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


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


0

Perl - 24 caracteres

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

La entrada está en $ _


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.