Suma liczb całkowitych w łańcuchu, oddzielonych liczbami nienumerycznymi, takimi jak „a” i „Y”

14

Utwórz program, który sumuje wszystkie liczby całkowite znalezione w ciągu ustawionym jako zmienna w programie (dlatego program nie musi obsługiwać żadnych danych wejściowych). Liczby całkowite są oddzielone liczbami nienumerycznymi (wszystko oprócz 0, 1, 2, 3 ... 9).

Przykłady:

  • 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

Dodatkowe uwagi:

  • Obsługa Unicode nie jest konieczna, ale dozwolona
  • -n(gdzie njest liczbą całkowitą) nie jest liczony jako ujemny n, ale jako łącznik, po którym następuje n.

Odpowiedź może zostać wydrukowana na ekranie (ale nie jest wymagana).

Najkrótsza odpowiedź (w postaciach) wygrywa.

Anto
źródło
Czy też powinniśmy wydrukować wynik? (Wspominasz o braku I / O).
Wile E. Coyote
@Dogbert - nie myślałem o tym. Przepraszam tak Zaktualizuję posta.
Anto
Zmieniłem to, ponieważ niektórzy ludzie już znali odpowiedzi i nie chcieli ich „skrzywdzić”. Chyba powinnam teraz spać, więc pomyślę trochę jaśniej;)
Anto
2
Anto: Zadanie, w którym rozwiązanie nie ma zauważalnych skutków ubocznych, nie jest jednak zbyt przyjemne.
Joey,
Interesujący przypadek testowy, na który właśnie wpadłem, byłby 5a-3(mój kod pomijałby, -gdyby natychmiast następował po liczbie, ale nie, jeśli przed nim była liczba inna niż cyfra).
Martin Ender

Odpowiedzi:

10

Perl, 15

Wejście $_, suma $c:

s/\d+/$c+=$&/ge
JB
źródło
14

Ruby 1.9, 21 znaków

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

Aby wydrukować rozwiązanie na standardowe wyjście, wymagane są 2 dodatkowe znaki:

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

Aby czytać ze standardowego wejścia zamiast używać predefiniowanej zmiennej, należy użyć kolejnych 3 znaków:

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

Ruby 1.8, wymienić ?+z "+"aby uzyskać roztwór roboczy w 22 znaków.

Ventero
źródło
Dane wejściowe należy pobierać ze zmiennej, a nie ze standardowego wejścia. scanJest także krótszy niż split. Twoje rozwiązanie staje się eval s.scan(/\d+/)*?+- 21 znaków.
sepp2k
@ sepp2k: Tak, nie przeczytałem poprawnie opisu. Jestem przyzwyczajony do innych zadań golfowych, w których zwykle musisz czytać od standardowego wydruku i drukować na standardowe wyjście. Dobra uwaga scandzięki, dzięki!
Ventero
+1, świetne użycie evali* '+'
Wile E. Coyote
6

Python (60)

import re;print sum(map(int,filter(len,re.split(r'\D',s))))
Hoa Long Tam
źródło
5

Rubin - 36 34 znaków

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

36 znaków, jeśli chcesz wydrukować wynik.

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

Zakłada, że ​​dane wejściowe są obecne jako ciąg w s.

Wile E. Coyote
źródło
4

JavaScript (ES6), 30

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

Wersja z adnotacjami:

// 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
źródło
3

Windows PowerShell, 23 25 29 31

Z wyjściem.

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

W rzeczywistości, bez wyjścia jest dokładnie takie samo, po prostu przesyłasz go gdzie indziej, gdzie jest potrzebny.

Joey
źródło
2

J - 40 38 znaków

Leniwa wersja. Wymaga biblioteki ciągów.

+/".(,' ',.~a.-.'0123456789')charsub y
MPelletier
źródło
Obsługuje Unicode. Obsługuje kodowanie, pomyśl o tym!
MPelletier
2

Jawa

poza konkursem;)

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
źródło
2

JavaScript [30 bajtów]

eval(s.match(/\d+/g).join('+'))
Wizja
źródło
2

Labirynt , 29 21 bajtów

(Uwaga: Labirynt jest nowszy niż to wyzwanie).

Ponadto, Labirynt nie ma zmiennych, więc wybrałem normalny program wejścia / wyjścia.

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

Było to dość proste ze względu na sposób działania poleceń wprowadzania Labiryntu. ?próbuje odczytać podpisaną liczbę całkowitą ze STDIN i zatrzymuje się na pierwszej nie cyfrowej. Jeśli nie może odczytać liczby całkowitej (ponieważ po kolejnym znaku -nie następuje cyfra, ani żadna inna cyfra, albo osiągnęliśmy EOF), 0zamiast tego zwróci . ,z drugiej strony czyta każdy kolejny bajt i wypycha wartość bajtu. Jeśli ten zostanie wywołany w EOF, zwróci-1 .

Oto pseudokod rozwiązania:

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

Prawidłowe radzenie sobie z liczbami ujemnymi komplikuje to rozwiązanie. Gdyby nie te, miałbym 8-bajtowe rozwiązanie:

?+
;,;!@
Martin Ender
źródło
1

PHP - 37

Bez drukowania;

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

Z nadrukiem (38):

<?=array_sum(@split("[^0-9]+",`cat`));
Arnaud Le Blanc
źródło
1

Perl, 16 znaków

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

Pobiera dane wejściowe $_, dane wyjściowe są kontynuowane $r. Ostatni średnik jest zbędny, ale prawdopodobnie będzie potrzebny, gdy program zrobi więcej rzeczy. Dodaj say$rdo wyniku.

ninjalj
źródło
Ups, nie widziałem dokładnie tej samej odpowiedzi, kiedy pisałem. Chociaż policzyłem jeszcze jedną postać, nawet bez średnika.
JB
@JB: Nie mogę liczyć! : P. Faktycznie, ja zrobiłem błąd echo'ing się podwójne cytowany ciąg wc -c.
ninjalj
1

J - 23 char

Nie jest zwycięzcą, ale widzimy dość rzadką prymitywną akcję.

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

Wyjaśniono:

  • _"."0 y- Dla każdego znaku w ciągu wejściowym yspróbuj odczytać go jako liczbę. Jeśli nie możesz, użyj _zamiast tego wartości domyślnej (nieskończoność).

  • ,_=- Sprawdź, czy każdy wynik jest równy _, a następnie uruchom ostatnią tablicę zer i jedynek w wektorze. ( "."0zawsze dodaje jeden wynik za dużo wymiarów, więc poprawiamy to tutaj).

  • y,:' ' - Dodaj rząd spacji poniżej ciągu wejściowego.

  • }- Używany tutaj, }nazywa się Item Amend i wykorzystuje listę zer i 1 po lewej jako indeksy, aby wybrać wiersz do narysowania w prawym argumencie. Tak więc dzieje się tak, że dla każdej kolumny po prawej stronie bierzemy oryginalny znak, jeśli można go odczytać jako liczbę, a w przeciwnym razie zajmujemy miejsce pod nim. Dlatego też wszelkie znaki nienumeryczne zakrywamy spacjami.

  • +/". - Teraz przekonwertuj cały ciąg na listę liczb i zsumuj je.

algorytmshark
źródło
1

gs2, 4 bajty

W#Θd

Zakodowane w CP437 ; trzeci bajt to E9.

Wodczytuje wszystkie liczby /-?\d+/z ciągu, mapuje wartość bezwzględną, dsumy.

(gs2 też jest nowszy niż to wyzwanie, ale jego read-numspolecenie to całkowity zbieg okoliczności).

Lynn
źródło
0

Smalltalk (Smalltalk / X) (51 znaków)

za pomocą pakietu wyrażeń regularnych:

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

wo regex:

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

wejście w s

blabla999
źródło
0

R, 30

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

Tutaj xjest nazwa zmiennej.

Przykład:

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

JavaScript - 43 znaki

Wiem, że to długo, ale nie było rozwiązania JS :)

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

ajest ciąg. czawiera odpowiedź.

Gaurang Tandon
źródło
0

Tcl, 30

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

Zakłada, że ​​dane wejściowe znajdują się w zmiennej $a(formalnie, in a) i zapisuje odpowiedź w wyniku interpretera. I / O pozostawia się jako ćwiczenie.

Donal Fellows
źródło
0

APL, 16 bajtów

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

⎕djest wbudowany zawierający cyfry (0-9). bjest przypisany do wektora 0/1, gdzie 1 jest podawany cyfrom. bsłuży do kompresji podanej tablicy znaków, a następnie jest ponownie używana do jej rozwinięcia, która wstawia spacje. to eval APL, który w tym przypadku konwertuje ciąg na wektor na liczby całkowite. +/oblicza sumę.

lstefano
źródło
Równej długości, ale ciekawe:+/2⊃⍞⎕VFI⍨⎕AV~⎕D
Adám
0

Swift 3, 78

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

gdzie sjest ciąg

Kametrixom
źródło
0

Perl - 24 znaki

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

Dane wejściowe są w $ _

Kaundur
źródło
0

Właściwie 14 bajtów (niekonkurujących)

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

Wypróbuj online!

To zgłoszenie nie jest konkurencyjne, ponieważ w rzeczywistości jest nieco nowsze niż to wyzwanie.

Ten program obsługuje stronę kodową CP437 do wprowadzania danych.

Wyjaśnienie:

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
źródło
0

C 100

t=0;main(i,v)char**v;{for(char*q,*s=v[1];i=strtol(s,&q,0),*s;q>s?t+=abs(i),s=q:s++);printf("%d",t);}

Wypróbuj online!

Wcześniejsza 85-bajtowa wersja, która trochę oszukuje poprzez zakodowanie ciągu wewnątrz programu:

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

Aby faktycznie użyć programu 85-bajtowego, musisz przypisać zmienną w następujący sposób:

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);}
Jerry Jeremiasz
źródło