Sumar enteros en una cadena


11

Entrada

Una cuerda.

Salida

La suma de todos los enteros en la línea.

Restricciones

1≤Longitud de línea≤500

Caso de prueba de muestra

Entrada

the 5is 108 seCONd4 a

Salida

117

Explicación

Suma es: 5 + 108 + 4 = 117


66
Hola, bienvenido a PPCG. Los desafíos para un solo idioma generalmente están mal vistos aquí en PPCG. Tal vez usted podría cambiarlo a un reto en general: dada una cadena, la salida de la suma de todos los números en la cadena, haciendo caso omiso de todo lo demás (es decir, "the 5is 108 seCONd4 a"dará como resultado 117debido 5+108+4=117). Además, cada 'pregunta' aquí debe tener una etiqueta de condición ganadora . En este caso, supongo que es [code-golf] (¿es la solución más corta posible?)
Kevin Cruijssen

44
Parece que ha publicado una pregunta similar en SO, que tiende a confirmar que no fue diseñada para ser un desafío PPCG y está buscando un código 'utilizable' en lugar de un código de golf. En su lugar, recomendaría mejorar su pregunta original sobre SO, para que se ajuste mejor a las reglas del sitio.
Arnauld

44
He revisado tu publicación para que se ajuste a nuestros estándares. Siéntase libre de editar si el resultado no le conviene.
Adám


2
¿Qué pasa con este caso string x='-12hello3';estás contando enteros negativos (es decir, -12 + 3 === -9)?
Shaun Bebbers

Respuestas:


4

Javascript, 34 32 bytes

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

Une todos los dígitos y únelos +girándolos en 5 + 108 + 4, evalúa el resultado.
Solo funciona en enteros positivos.

Guardado 2 bytes gracias a Arnauld

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>


Supongo que usar string.length en la consola para contar caracteres no es una buena idea cuando contiene caracteres de escape ... Vaya, lo arregló. Gracias de nuevo
Bassdrop Cumberwubwubwub

Una opción un poco mejor sería console.log(f.toString().length), pero es no fiable al 100%, ya sea.
Arnauld

O simplemente usando TIO ...
Jo King


4

05AB1E , 11 6 bytes

þмS¡þO

Pruébalo en línea.

Explicación:

þм       # 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

1
Oh hey, uso inteligente de ¡!
Erik the Outgolfer

4

R , 64 48 45 bytes

Después de ver la entrada de PowerShell, pude jugar más al golf.

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

Pruébalo en línea!


t=es suficiente aquí en lugar detext
Giuseppe

Gracias, siempre me olvido de la coincidencia parcial (y la cadena de ,,, hasta que llegue a la opción que desee).
CT Hall

3

APL (Dyalog Unicode) , 11 bytes

Función anónima tácita prefic

+/#⍎¨∊∘⎕D⊆⊢

Pruébalo en línea!

 el argumento

 particionado (las ejecuciones de True se convierten en piezas, las ejecuciones de False son separadores) por

 membresía
 del
⎕D conjunto de dígitos

#⍎¨ evaluar cada uno en el espacio de nombres raíz

+/ suma


3

Retina 0.8.2 , 8 bytes

\d+
$*
1

Pruébalo en línea!

  • La primera línea coincide con todos los números.
  • La segunda línea reemplaza estos por 1s, repetido dicho número de veces
  • La última línea es una coincidencia y cuenta el número total de 1s en la cadena.


2

Carbón de leña , 5 bytes

IΣ⁺ψS

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación: El Sumoperador del carbón de leña extrae automáticamente los números de una cadena, sin embargo, si la cadena no contiene caracteres que no sean dígitos, toma la suma digital, por lo que concateno un byte nulo para evitar esto. El resultado se devuelve a la cadena para la salida implícita.



2

Zsh , 21 bytes

<<<$[${1//[^0-9]/+0}]

Pruébalo en línea!

  ${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

Desafortunadamente, bash se queja porque interpreta 0108como octal. Zsh no (a menos que setopt octalzeroes)



1

Python 3 , 63 59 56 bytes

Por qué no. Respuesta obligatoria de expresiones regulares. Probablemente podría acoplar 6 usando Python 2, pero lo que sea. Ya no se aplica ya que estoy usando un enfoque eval en lugar de usar el mapa.

import re;x=lambda y:eval('+'.join(re.findall('\d+',y)))

Explicación:

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

Pruébalo en línea!


¡Agradable! En su TIO debe usar en z == l[1]lugar de z is l[1]sin embargo. El código actual puede dar falsos negativos si los números son lo suficientemente altos.
Jakob

1

Java 10, 66 bytes

Esta es una lambda de Stringa int.

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

Los enteros negativos no son compatibles. Presumiblemente está bien.

Pruébalo en línea

Expresiones de gratitud


1
Puede cambiar [^0-9]por \Dunos pocos bytes, también puede cambiar longy Stringpor var(aunque tendrá que cambiar el tipo de retorno aint
Encarnación de la ignorancia


1

Cubix , 17 bytes

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

Pruébalo en línea!

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

Míralo correr

Una bastante simple. Ien cubix tomará el primer entero en la entrada y lo empujará a la pila. Esto tiene el efecto de omitir todos los personajes. El resto se ocupa de lo adicional y detecta el final de la entrada.

  • I! Ingrese un número entero y pruébelo para 0
  • s+q;;Si no es cero, intercambie TOS (fuerzas y 0 inicial) y agregue. Empuje el resultado al fondo de la pila y limpie la parte superior. Regresar al comienzo.
  • /i? Si es cero, redirige y realiza una entrada de caracteres para verificar
  • |?;/Si el positivo (personaje) gira a la derecha en un reflejo, esto lo empuja hacia atrás a través del corrector ?y gira a la derecha en el pop desde la pila, dejando 0 en TOS. Luego, la IP se redirige al bucle principal.
  • I>p.O@ si es negativo (final de la entrada), gire a la izquierda, ingrese enteros, coloque la parte inferior de la pila en la parte superior, haga salir y pare.

1

PHP ,40 39 bytes

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

Pruébalo en línea!

Ejecutar con php -nFentrada es de STDIN. Ejemplo:

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





0

Adjunto , 23 bytes

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

Pruébalo en línea!

Una respuesta más interesante, pero indirecta (37 bytes): {Sum!Reap[ReplaceF[_,/"\\d+",Sow@N]]}

Explicación

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

Esto tiene la forma:

f##g=>h&x

que, cuando se expande y se hace paréntesis, se convierte en

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

##compone dos funciones juntas, =>crea una función que asigna la función izquierda sobre el resultado de la función derecha y &vincula un argumento a un lado de una función. Para la entrada _, esto es equivalente a:

{ f[Map[g, h[_, x]]] }

Primero, entonces, corremos MatchAllde caracteres de dígitos ( \\d+). Después, convertimos cada ejecución a un entero real usando la Nfunción. Finalmente, tomamos la suma de estos números usando Sum.


0

APL (NARS), caracteres 13, bytes 26

{+/⍎¨⍵⊂⍨⍵∊⎕D}

prueba:

  f←{+/⍎¨⍵⊂⍨⍵∊⎕D}
  f 'the 5is 108 seCONd4 a'
117

0

C # (compilador interactivo de Visual C #), 117 111 bytes

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

Pruébalo en línea.



0

Japt v2.0a0 -x, 3 bytes

Otra prueba de manejo para mi intérprete (muy WIP).

q\D

Intentalo

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 bytes

105 bytes + 25 bytes para la importación de expresiones regulares

s->{long c=0;for(Matcher m=Pattern.compile("\\d+").matcher(s);m.find();c+=new Long(m.group()));return c;}

Pruébalo en línea!
Explicación

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
No creo que esto sea correcto: el (único) ejemplo del OP sugiere que los dígitos consecutivos deberían formar un solo entero, por lo que "123" debería producir 123, no 6 como lo hace su código.
Michail

Eso es lamentable, lo revisaré cuando pueda
Benjamin Urquhart

@Michail revisado
Benjamin Urquhart



0

Pip , 6 bytes

$+a@XI

Se trata -123como un entero negativo. Pruébalo en línea!

  a     Command-line input
   @XI  Regex find all integers (XI is a variable predefined as the regex `-?\d+`)
$+      Fold on +

Si se deben ignorar los guiones en lugar de tratarlos como signos menos, entonces lo siguiente funciona para 7 bytes :

$+a@+XD

XDes una variable preestablecida para `\d`; +XDagrega el +modificador regex , haciendo que coincida con 1 o más dígitos.


0

Java (JDK) , 98 94 93 bytes

s->java.util.Arrays.stream(s.split("\\D")).filter(t->!t.isEmpty()).mapToLong(Long::new).sum()

Pruébalo en línea!

-4 bytesmediante el uso de en Long::newlugar de Long::valueOf.
-1 byteacortando la expresión regular, si ya estamos eliminando cadenas vacías más tarde, haciendo algunos extras cuando la división está bien.

Explicado

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