Somme des entiers dans une chaîne

11

Contribution

Un string.

Production

La somme de tous les entiers de la ligne.

Contraintes

1≤Longueur de ligne≤500

Exemple de cas de test

Contribution

the 5is 108 seCONd4 a

Production

117

Explication

La somme est: 5 + 108 + 4 = 117

Karandeep Singh
la source
6
Bonjour, bienvenue chez PPCG. Les défis pour une seule langue sont généralement mal vus ici chez PPCG. Peut-être pourriez-vous le changer en un défi général: étant donné une chaîne, affichez la somme de tous les nombres de la chaîne, en ignorant tout le reste (c'est "the 5is 108 seCONd4 a"-à- dire que cela entraînera 117parce que 5+108+4=117). De plus, chaque «question» ici doit avoir une étiquette de condition gagnante . Dans ce cas, je suppose que c'est [code-golf] (étant la solution la plus courte possible)?
Kevin Cruijssen
4
Il semble que vous ayez posté une question similaire sur SO, ce qui tend à confirmer qu'il n'a pas été conçu pour être un défi PPCG et que vous recherchez un code `` utilisable '' plutôt que du code golfé. Je recommanderais plutôt d'améliorer votre question d'origine sur SO, afin qu'elle corresponde mieux aux règles du site.
Arnauld
4
J'ai révisé votre message pour l'adapter à nos normes. N'hésitez pas à modifier si le résultat ne vous convient pas.
Adám
2
Et dans ce cas, string x='-12hello3';comptez-vous des entiers négatifs (c.-à-d. -12 + 3 === -9)?
Shaun Bebbers

Réponses:

4

Javascript, 34 32 octets

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

Faites correspondre tous les chiffres et joignez-les en les +transformant en 5 + 108 + 4, évaluez le résultat.
Fonctionne uniquement sur des entiers positifs.

Enregistré 2 octets grâce à 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>

Bassdrop Cumberwubwubwub
la source
Je suppose que l'utilisation de string.length dans la console pour compter les caractères n'est pas une bonne idée quand elle contient des caractères d'échappement ... Oups, corrigé. Thx again
Bassdrop Cumberwubwubwub
Une option légèrement meilleure serait console.log(f.toString().length), mais elle n'est pas fiable à 100% non plus.
Arnauld
Ou tout simplement en utilisant TIO ...
Jo King
4

Perl 6 , 14 octets

{sum m:g/\d+/}

Essayez-le en ligne!

Bloc de code anonyme qui renvoie la somme de toutes les séries de chiffres

Jo King
la source
4

05AB1E , 11 6 octets

þмS¡þO

Essayez-le en ligne.

Explication:

þм       # 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
Kevin Cruijssen
la source
1
Oh hé, utilisation intelligente de ¡!
Erik the Outgolfer
4

R , 64 48 45 octets

Après avoir vu l'entrée PowerShell, j'ai pu jouer au golf plus loin.

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

Essayez-le en ligne!

CT Hall
la source
t=est suffisant ici plutôt quetext
Giuseppe
Merci, j'oublie toujours la correspondance partielle (et la chaîne de ,,, jusqu'à ce que vous arriviez à l'option que vous voulez).
CT Hall
3

APL (Dyalog Unicode) , 11 octets

Fonction prefic tacite anonyme

+/#⍎¨∊∘⎕D⊆⊢

Essayez-le en ligne!

 l'argument

 partitionné (les séries de True deviennent des morceaux, les séries de False sont des séparateurs) par

 l' adhésion
 de
⎕D l'ensemble des chiffres

#⍎¨ évaluer chacun dans l'espace de noms racine

+/ somme

Adam
la source
3

Retina 0.8.2 , 8 octets

\d+
$*
1

Essayez-le en ligne!

  • La première ligne correspond à tous les nombres
  • La deuxième ligne les remplace par 1, répété ledit nombre de fois
  • La dernière ligne est une correspondance et compte le nombre total de 1 dans la chaîne
Ven
la source
2

Fusain , 5 octets

IΣ⁺ψS

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication: l' Sumopérateur de Charcoal extrait automatiquement les nombres d'une chaîne, mais si la chaîne ne contient pas de caractères non numériques, alors il prend la somme numérique, donc je concatène un octet nul pour éviter cela. Le résultat est ensuite converti en chaîne pour une sortie implicite.

Neil
la source
2

Haskell , 50 octets

sum.map read.words.map f
f x|'/'<x,x<':'=x
f _=' '

Essayez-le en ligne!

Il y a probablement une meilleure façon, mais c'est la plus évidente.

dfeuer
la source
2

Zsh , 21 octets

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

Essayez-le en ligne!

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

Malheureusement, bash se plaint car il interprète 0108comme octal. Zsh ne le fait pas (sauf setopt octalzeroes)

GammaFunction
la source
2

Bash, 43 octets

for n in ${1//[!0-9]/ };{((s+=n));};echo $s

Remplace chaque non-nombre par un espace, puis les additionne ensemble.

-5 octets grâce à GammaFunction

vityavv
la source
1
Merci! J'ai modifié mon message
vityavv
1

Python 3 , 63 59 56 octets

Pourquoi pas. Réponse regex obligatoire. Pourrait probablement ancrer 6 en utilisant Python 2, mais peu importe. Ne s'applique plus puisque j'utilise une approche eval au lieu d'utiliser la carte.

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

Explication:

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

Essayez-le en ligne!

Epicness
la source
Agréable! Dans votre TIO, vous devez utiliser z == l[1]au lieu de z is l[1]bien. Le code actuel peut donner de faux négatifs si les chiffres sont suffisamment élevés.
Jakob
1

Java 10, 66 octets

Ceci est un lambda de Stringà int.

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

Les entiers négatifs ne sont pas pris en charge. Vraisemblablement, ça va.

Essayez-le en ligne

Remerciements

Jakob
la source
1
Vous pouvez changer [^0-9]pour \Dquelques octets, vous pouvez aussi changer longet Stringpour var(bien que vous deviez changer le type de retour enint
Embodiment of Ignorance
1

Ruby, 32 27 caractères

->s{eval s.scan(/\d+/)*?+}

Remerciements

GBrandt
la source
Bienvenue chez PPCG! Vous pouvez utiliser *?+au lieu de .join ?+-7 octets. Voir ary * str
Conor O'Brien
1

Cubix , 17 octets

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

Essayez-le en ligne!

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

Regardez-le courir

Un assez simple. Idans cubix prendra le premier entier dans l'entrée et le poussera vers la pile. Cela a pour effet de sauter tous les personnages. Le reste traite de l'apport supplémentaire et détecte la fin de l'entrée.

  • I! Entrez un entier et testez-le pour 0
  • s+q;;Si ce n'est pas zéro, échangez TOS (forces et 0 initial) et ajoutez. Poussez le résultat au bas de la pile et nettoyez le haut. Revenez au début.
  • /i? Si zéro, redirigez et faites une entrée de caractère pour vérifier
  • |?;/Si positif (caractère), tournez à droite dans un reflet, cela le repousse à travers le vérificateur ?et tourne à droite sur la pop de la pile, laissant 0 sur TOS. L'IP est ensuite redirigée vers la boucle principale.
  • I>p.O@ si négatif (fin d'entrée) tourner à gauche, faire une entrée entière, amener le bas de la pile en haut, sortir et arrêter.
MickyT
la source
1

PHP ,40 39 octets

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

Essayez-le en ligne!

L' php -nFexécution avec entrée provient de STDIN. Exemple:

$ echo the 5is 108 seCONd4 a | php -nF sumint.php    
117
640 Ko
la source
1

Avant , 13 octets

Cela fonctionne parce Ique balaye simplement le flux d'entrée pour le prochain jeton qui ressemble à un nombre, en ignorant toute autre chose.

~Ilj~#
 >K+O@

Essayez-le en ligne!

escargot_
la source
0

QuadR , 9 octets

+/⍎⍵
\D
 

Essayez-le en ligne!

+/ somme de

 évaluation en tant qu'APL

 Le résultat de

\D remplacer chaque non-chiffre par

 un espace

Adam
la source
0

Attaché , 23 octets

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

Essayez-le en ligne!

Une réponse plus intéressante, mais indirecte (37 octets): {Sum!Reap[ReplaceF[_,/"\\d+",Sow@N]]}

Explication

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

Cela a la forme:

f##g=>h&x

qui, une fois développé et entre parenthèses, devient:

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

##compose deux fonctions ensemble, =>crée une fonction mappant la fonction gauche sur le résultat de la fonction droite et &lie un argument à un côté d'une fonction. Pour l'entrée _, cela équivaut à:

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

D'abord, ensuite, nous MatchAllexécutons des caractères numériques ( \\d+). Après, nous convertissons chaque exécution en un entier réel en utilisant la Nfonction. Enfin, nous prenons la somme de ces nombres en utilisant Sum.

Conor O'Brien
la source
0

APL (NARS), caractères 13, octets 26

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

tester:

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

C # (Visual C # Interactive Compiler), 117 111 octets

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

Essayez-le en ligne.

Données expirées
la source
0

Japt v2.0a0 -x, 3 octets

Un autre essai routier pour mon interprète (très-WIP).

q\D

Essayez-le

q\D     :Implicit input of string
q       :Split on
 \D     :  Non-digit characters (/[^0-9]/)
        :Implicitly reduce by addition and output
Hirsute
la source
0

Java 8, 53 130 octets

105 octets + 25 octets pour l'importation d'expressions régulières

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

Essayez-le en ligne!
Explication

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
   }
Benjamin Urquhart
la source
2
Je ne pense pas que ce soit correct: le (seul) exemple de l'OP suggère que les chiffres consécutifs devraient former un seul entier, donc "123" devrait produire 123, pas 6 comme le fait votre code.
Michail
C'est dommage, je réviserai quand je pourrai
Benjamin Urquhart
@Michail révisé
Benjamin Urquhart
0

Swift, 109 octets

func s(a:String){var d=0,t=0;a.forEach{(c) in if let e=Int(String(c)){d=d*10+e}else{t+=d;d=0}};t+=d;print(t)}

Essayez-le en ligne!

onnoweb
la source
0

Pip , 6 octets

$+a@XI

Traite -123comme un entier négatif. Essayez-le en ligne!

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

Si les tirets doivent être ignorés plutôt que traités comme des signes moins, alors ce qui suit fonctionne pour 7 octets :

$+a@+XD

XDest une variable prédéfinie pour `\d`; +XDlui ajoute le +modificateur regex , le faisant correspondre à 1 ou plusieurs chiffres.

DLosc
la source
0

Java (JDK) , 98 94 93 octets

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

Essayez-le en ligne!

-4 bytesen utilisant Long::newau lieu de Long::valueOf.
-1 byteen raccourcissant l'expression régulière - si nous supprimons déjà les chaînes vides plus tard, faire quelques extras lors du fractionnement est très bien.

Expliqué

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.
Sara J
la source