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


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>


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

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

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!


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


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


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.



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)



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!


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


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

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.

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


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!


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



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.


0

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

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

tester:

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



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

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
   }

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

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.


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.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.