Summe der Ganzzahlen in einer Zeichenfolge, getrennt durch nicht numerische Zeichen wie 'a' und 'Y'

14

Erstellen Sie ein Programm, das alle in einer Zeichenfolge, die als Variable im Programm festgelegt ist, gefundenen Ganzzahlen summiert (das Programm muss also keine Eingaben verarbeiten). Die Ganzzahlen werden durch nicht numerische Zeichen getrennt (alles andere als 0, 1, 2, 3 ... 9).

Beispiele:

  • 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

Zusätzliche Hinweise:

  • Unicode-Unterstützung ist nicht erforderlich, aber zulässig
  • -n(wobei neine ganze Zahl ist) wird nicht als Negativ gezählt n, sondern als Bindestrich, gefolgt von n.

Die Antwort kann auf dem Bildschirm ausgedruckt werden (ist jedoch nicht erforderlich).

Kürzeste Antwort (in Zeichen) gewinnen.

Anto
quelle
Sollen wir das Ergebnis auch ausdrucken? (Sie erwähnen kein I / O).
Dogbert
@Dogbert - darüber habe ich nicht nachgedacht. Entschuldigung, ja. Ich werde den Beitrag aktualisieren.
Anto
Es wurde geändert, da einige Leute bereits Antworten hatten und sie nicht "verletzen" wollten. Ich denke, ich sollte jetzt schlafen, damit ich etwas klarer denke;)
Anto
2
Anto: Eine Aufgabe, bei der eine Lösung keine beobachtbaren Nebenwirkungen hat, ist jedoch nicht sehr schön.
Joey
Ein interessanter Testfall, auf den ich gerade gestoßen bin, wäre 5a-3(mein Code würde überspringen, -wenn er unmittelbar auf eine Zahl folgt, aber nicht, wenn davor eine Nicht-Zahl steht).
Martin Ender

Antworten:

10

Perl, 15

Eingabe in $_, Summe in $c:

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

Ruby 1.9, 21 Zeichen

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

Um die Lösung auf stdout auszudrucken, sind 2 zusätzliche Zeichen erforderlich:

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

Und um von stdin zu lesen, anstatt eine vordefinierte Variable zu verwenden, müssen weitere 3 Zeichen verwendet werden:

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

Für Ruby 1.8, ersetzen ?+mit "+"einer Arbeitslösung in 22 Zeichen zu erhalten.

Ventero
quelle
Die Eingabe soll von einer Variablen stammen, nicht von stdin. Ist auch scankürzer als split. So wird Ihre Lösung eval s.scan(/\d+/)*?+- 21 Zeichen.
8.
@ sepp2k: Ja, habe die Beschreibung nicht richtig gelesen. Ich bin nur an die anderen Golfaufgaben gewöhnt, bei denen man normalerweise von Standard zu Standard lesen und drucken muss. Guter Punkt mit scan, danke!
Ventero
+1, gute Verwendung von evalund* '+'
Dogbert
6

Python (60)

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

Ruby - 36 34 Zeichen

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

36 Zeichen, wenn das Ergebnis gedruckt werden soll.

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

Angenommen, die Eingabe ist in s als Zeichenfolge vorhanden.

Dogbert
quelle
4

JavaScript (ES6), 30

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

Kommentierte Version:

// 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
quelle
3

Windows PowerShell, 23 25 29 31

Mit Ausgabe.

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

In der Tat, ohne Ausgabe ist genau das gleiche, würden Sie es nur an eine andere Stelle leiten, wo es benötigt wird.

Joey
quelle
2

J - 40 38 Zeichen

Lazy version. Benötigt die String-Bibliothek.

+/".(,' ',.~a.-.'0123456789')charsub y
MPelletier
quelle
Unterstützt Unicode. Unterstützt Codierung, denken Sie dran!
MPelletier
2

Java

aus dem Wettbewerb;)

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
quelle
2

JavaScript [30 Bytes]

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

Labyrinth , 29 21 Bytes

(Haftungsausschluss: Labyrinth ist neuer als diese Herausforderung.)

Da Labyrinth keine Variablen hat, habe ich ein normales Eingabe- / Ausgabeprogramm verwendet.

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

Dies war aufgrund der Funktionsweise der Labyrinth-Eingabebefehle recht einfach. ?versucht, eine vorzeichenbehaftete Ganzzahl aus STDIN zu lesen, und stoppt bei der ersten Stelle, die keine Ziffer ist. Wenn eine Ganzzahl nicht gelesen werden kann (weil auf das nächste Zeichen -keine Ziffer folgt oder keine andere Ziffer, oder wir haben EOF erreicht), wird 0stattdessen zurückgegeben. ,liest andererseits jedes nachfolgende Byte und schiebt den Bytewert. Wenn dieser bei EOF aufgerufen wird, wird er -1stattdessen zurückgegeben.

Hier ist ein Pseudocode für die Lösung:

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

Der richtige Umgang mit negativen Zahlen erschwert diese Lösung erheblich. Wenn diese nicht wären, hätte ich diese 8-Byte-Lösung:

?+
;,;!@
Martin Ender
quelle
1

PHP - 37

Ohne Druck;

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

Mit Aufdruck (38):

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

Perl, 16 Zeichen

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

Nimmt Input auf $_, Output geht weiter $r. Letztes Semikolon ist überflüssig, wird aber wahrscheinlich benötigt, wenn das Programm mehr macht. Zur say$rAusgabe hinzufügen.

Ninjalj
quelle
Hoppla, ich habe beim Posten nicht genau dieselbe Antwort gesehen. Obwohl ich auch ohne Semikolon ein Zeichen mehr gezählt habe.
JB
@JB: Ich kann nicht zählen! : P. Eigentlich habe ich den Fehler gemacht, einen String in doppelten Anführungszeichen zu wiederholen wc -c.
Ninjalj
1

J - 23 char

Kein Gewinner, aber wir sehen ein ziemlich seltenes Primitiv in Aktion.

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

Erklärt:

  • _"."0 y- yVersuchen Sie, jedes Zeichen in der Eingabezeichenfolge als Zahl einzulesen. Wenn Sie nicht können, verwenden Sie den Standardwert_ stattdessen (unendlich).

  • ,_=- Überprüfen Sie jedes Ergebnis auf Gleichheit mit _und führen Sie dann das letzte Array von 0s und 1s in einen Vektor aus. ("."0 Fügt dem Ergebnis immer eine zu viele Dimensionen hinzu, daher korrigieren wir das hier.)

  • y,:' ' - Fügen Sie eine Zeile mit Leerzeichen unter der Eingabezeichenfolge ein.

  • }- Wird wie hier verwendet, }heißt Item Amend und verwendet die Liste der 0en und 1en auf der linken Seite als Index, um die Zeile auszuwählen, aus der im rechten Argument gezeichnet werden soll. Was also passiert, ist, dass wir für jede Spalte auf der rechten Seite das Originalzeichen nehmen, wenn es als Zahl eingelesen werden kann, und ansonsten das Leerzeichen darunter. Daher überdecken wir nicht numerische Zeichen mit Leerzeichen.

  • +/". - Konvertieren Sie nun den gesamten String in eine Liste von Zahlen und addieren Sie diese.

algorithmshark
quelle
1

gs2, 4 bytes

W#Θd

Codiert in CP437 ; Das dritte Byte ist E9.

WLiest alle Zahlen /-?\d+/aus einer Zeichenfolge, ordnet Absolutwerte und dSummen zu.

(auch gs2 ist neuer als diese herausforderung, aber sein read-numsbefehl ist ein totaler zufall.)

Lynn
quelle
0

Smalltalk (Smalltalk / X) (51 Zeichen)

mit dem Regex-Paket:

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

wo regex:

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

Eingabe in s

blabla999
quelle
0

R 30

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

Hier xist der Name der Variablen.

Beispiel:

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

Javascript - 43 Zeichen

Ich weiß, es ist lang, aber es gab keine JS-Lösung, also :)

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

aist die Zeichenfolge. cAntwort enthält.

Gaurang Tandon
quelle
0

Tcl, 30

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

Es wird davon ausgegangen, dass sich die Eingabe in der Variablen befindet $a(formal in a), und die Antwort wird im Interpreter-Ergebnis gespeichert. I / O bleibt als Übung übrig.

Donal Fellows
quelle
0

C99 (mit Warnungen) 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);}

Um das Programm tatsächlich nutzen zu können, müssen Sie die Variable folgendermaßen zuweisen:

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

Wenn Sie gcc verwenden, müssen Sie es wie folgt als C99 kompilieren:

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

APL, 16 Bytes

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

⎕d ist eine integrierte Funktion, die die Ziffern (0-9) enthält. bwird einem Vektor von 0/1 zugewiesen, wobei den Zeichen, die Ziffern sind, 1 zugewiesen wird. bwird verwendet, um das angegebene Zeichenarray zu komprimieren und es dann erneut zu erweitern, wodurch Leerzeichen eingefügt werden. ist die APL- Auswertung, die in diesem Fall einen String in einen Vektor mit ganzen Zahlen umwandelt. +/berechnet die Summe.

lstefano
quelle
Gleiche Länge, aber interessant:+/2⊃⍞⎕VFI⍨⎕AV~⎕D
Adám
0

Swift 3, 78

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

Wo sist der String?

Kametrixom
quelle
0

Perl - 24 Zeichen

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

Eingabe erfolgt in $ _

Kaundur
quelle
0

Eigentlich 14 Bytes (nicht konkurrierend)

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

Probieren Sie es online!

Diese Einreichung ist nicht konkurrierend, da sie tatsächlich etwas neuer ist als diese Herausforderung.

Dieses Programm unterstützt die CP437-Codepage für die Eingabe.

Erläuterung:

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
quelle