Suma liczb całkowitych w ciągu


11

Wejście

Sznurek

Wynik

Suma wszystkich liczb całkowitych w wierszu.

Ograniczenia

1 ≤ Długość linii ≤ 500

Przykładowy przypadek testowy

Wejście

the 5is 108 seCONd4 a

Wynik

117

Wyjaśnienie

Suma wynosi: 5 + 108 + 4 = 117


6
Cześć, witamy w PPCG. Wyzwania związane z jednym językiem są zwykle źle oceniane w PPCG. Może możesz zmienić to na ogólne wyzwanie: biorąc pod uwagę ciąg, wypisz sumę wszystkich liczb w ciągu, ignorując wszystko inne (tzn. "the 5is 108 seCONd4 a"Spowoduje to , 117ponieważ 5+108+4=117). Ponadto każde „pytanie” powinno mieć tag warunku zwycięskiego . W tym przypadku zakładam, że jest to [code-golf] (jest najkrótszym możliwym rozwiązaniem)?
Kevin Cruijssen

4
Wygląda na to, że zamieściłeś podobne pytanie na SO, które zwykle potwierdza, że ​​nie zostało zaprojektowane jako wyzwanie PPCG i szukasz kodu „użytecznego”, a nie kodu golfowego. Zamiast tego polecam ulepszyć swoje pierwotne pytanie w SO, aby lepiej pasowało do reguł witryny.
Arnauld

4
Zmieniłem Twój post, aby pasował do naszych standardów. Edytuj, jeśli wynik Ci nie odpowiada.
Adám


2
A co z tym przypadkiem, string x='-12hello3';czy liczycie ujemne liczby całkowite (tj. -12 + 3 === -9)?
Shaun Bebbers

Odpowiedzi:


4

JavaScript, 34 32 bajty

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

Dopasuj wszystkie cyfry i połącz je, +zmieniając go na 5 + 108 + 4, aby sprawdzić wynik.
Działa tylko na dodatnich liczbach całkowitych.

Zaoszczędź 2 bajty dzięki Arnauldowi

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>


Myślę, że użycie string.length w konsoli do zliczania znaków nie jest dobrym pomysłem, gdy zawiera znaki specjalne ... Ups, naprawiłem to.
Jeszcze

Nieco lepszym rozwiązaniem byłoby console.log(f.toString().length), ale to nie 100% wiarygodne albo.
Arnauld,

Lub po prostu używając TIO ...
Jo King


4

05AB1E , 11 6 bajtów

þмS¡þO

Wypróbuj online.

Wyjaśnienie:

þм       # 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
O, hej, sprytne użycie ¡!
Erik the Outgolfer

4

R , 64 48 45 bajtów

Po zobaczeniu wpisu PowerShell mogłem dalej grać w golfa.

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

Wypróbuj online!


t=wystarczy tutaj zamiasttext
Giuseppe

Dzięki, zawsze zapominam o częściowym dopasowaniu (i ciąg ,,, dopóki nie przejdziesz do żądanej opcji).
CT Hall

3

APL (Dyalog Unicode) , 11 bajtów

Anonimowa ukryta funkcja pref

+/#⍎¨∊∘⎕D⊆⊢

Wypróbuj online!

 argument

 podzielone na partycje (przebiegi True stają się częściami, przebiegi False są separatorami) według

 członków
 z
⎕D zestawem cyfr

#⍎¨ oceń każdy w głównej przestrzeni nazw

+/ suma


3

Retina 0.8.2 , 8 bajtów

\d+
$*
1

Wypróbuj online!

  • Pierwszy wiersz pasuje do wszystkich liczb
  • Drugi wiersz zastępuje je 1s, powtarzając wspomnianą liczbę razy
  • Ostatni wiersz jest dopasowaniem i zlicza całkowitą liczbę 1 w ciągu


2

Węgiel drzewny , 5 bajtów

IΣ⁺ψS

Wypróbuj online! Link jest do pełnej wersji kodu. Objaśnienie: SumOperator Charcoal automatycznie wyodrębnia liczby z ciągu, jednak jeśli ciąg nie zawiera znaków innych niż cyfry, wówczas pobiera sumę cyfrową, więc łączę bajt zerowy, aby tego uniknąć. Wynik jest następnie rzutowany z powrotem do łańcucha w celu uzyskania niejawnego wyniku.



2

Zsh , 21 bajtów

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

Wypróbuj online!

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

Niestety bash narzeka, ponieważ interpretuje 0108jako ósemkowy. Zsh nie (chyba że setopt octalzeroes)



1

Python 3 , 63 59 56 bajtów

Dlaczego nie. Obowiązkowa odpowiedź wyrażenia regularnego. Prawdopodobnie mógłby zadokować 6 za pomocą Pythona 2, ale cokolwiek. Nie ma już zastosowania, ponieważ używam ewaluacyjnego podejścia zamiast mapy.

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

Wyjaśnienie:

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

Wypróbuj online!


Ładny! Jednak w TIO powinieneś używać z == l[1]zamiast z is l[1]tego. Obecny kod może dawać fałszywe negatywy, jeśli liczby będą wystarczająco wysokie.
Jakob

1

Java 10, 66 bajtów

To jest lambda od Stringdo int.

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

Ujemne liczby całkowite nie są obsługiwane. Prawdopodobnie w porządku.

Wypróbuj online

Podziękowanie


1
Można przełączyć [^0-9]na \Dkilka bajtów, także można przełączyć longi Stringna var(chociaż trzeba będzie zmienić typ zwracany doint
Ucieleśnienie Ignorance


1

Cubix , 17 bajtów

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

Wypróbuj online!

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

Zobacz, jak biegnie

Dość prosty. Iw cubix weźmie pierwszą liczbę całkowitą na wejściu i wypchnie ją na stos. To powoduje pomijanie wszystkich postaci. Reszta zajmuje się dodatkowym i wykrywaniem końca wejścia.

  • I! Wpisz liczbę całkowitą i przetestuj ją na 0
  • s+q;;Jeśli nie zero, zamień TOS (siły i początkowe 0) i dodaj. Przesuń wynik na spód stosu i wyczyść górę. Wróć do początku.
  • /i? Jeśli zero, przekieruj i wprowadź znak, aby sprawdzić
  • |?;/Jeśli dodatni (znak) skręca w prawo w odbicie, to popycha go z powrotem przez szachownicę ?i skręca w prawo na pop ze stosu, pozostawiając 0 na TOS. Następnie adres IP zostaje przekierowany z powrotem do głównej pętli.
  • I>p.O@ jeśli ujemny (koniec wejścia) skręca w lewo, wprowadź liczbę całkowitą, przenieś spód stosu na górę, wyjdź i zatrzymaj.

1

PHP ,40 39 bajtów

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

Wypróbuj online!

Uruchom z php -nFwejściem pochodzi ze STDIN. Przykład:

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


1

Z przodu 13 bajtów

Działa to, ponieważ Ipo prostu skanuje strumień wejściowy w poszukiwaniu następnego tokena, który wygląda jak liczba, ignorując wszystko inne.

~Ilj~#
 >K+O@

Wypróbuj online!




0

Attache , 23 bajty

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

Wypróbuj online!

Bardziej interesująca, ale pośrednia odpowiedź (37 bajtów): {Sum!Reap[ReplaceF[_,/"\\d+",Sow@N]]}

Wyjaśnienie

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

Ma to postać:

f##g=>h&x

która po rozwinięciu i nawiasie staje się:

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

##tworzy dwie funkcje razem, =>tworzy funkcję odwzorowującą funkcję lewą na wynik funkcji prawej i &wiąże argument z boku funkcji. W przypadku danych wejściowych _jest to równoważne z:

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

Najpierw MatchAlluruchamiamy cyfry ( \\d+). Następnie konwertujemy każdy przebieg na rzeczywistą liczbę całkowitą za pomocą Nfunkcji. Na koniec bierzemy sumę tych liczb za pomocą Sum.


0

APL (NARS), znaki 13, bajty 26

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

test:

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

0

C # (interaktywny kompilator Visual C #), 117 111 bajtów

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

Wypróbuj online.



0

Japt v2.0a0 -x, 3 bajty

Kolejna jazda próbna dla mojego interpretera (bardzo WIP).

q\D

Spróbuj

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 bajtów

105 bajtów + 25 bajtów na import wyrażenia regularnego

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

Wypróbuj online!
Wyjaśnienie

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
Nie sądzę, żeby to było poprawne: (jedyny) przykład OP sugeruje, że kolejne cyfry powinny tworzyć jedną liczbę całkowitą, więc „123” powinno dawać 123, a nie 6, jak twój kod.
Michail

To niefortunne, skoryguję, kiedy będę mógł
Benjamin Urquhart,

@Michail poprawiony
Benjamin Urquhart



0

Pip , 6 bajtów

$+a@XI

Traktuje -123jako ujemną liczbę całkowitą. Wypróbuj online!

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

Jeśli łączniki powinny być ignorowane, a nie traktowane jako znaki minus, to następujące działanie działa dla 7 bajtów :

$+a@+XD

XDjest predefiniowaną zmienną dla `\d`; +XDdodaje +do niego modyfikator wyrażenia regularnego , dopasowując go do 1 lub więcej cyfr.


0

Java (JDK) , 98 94 93 bajtów

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

Wypróbuj online!

-4 bytesza pomocą Long::newzamiast Long::valueOf.
-1 byteprzez skrócenie wyrażenia regularnego - jeśli później usuwamy już puste ciągi, tworzenie dodatków przy dzieleniu jest w porządku.

Wyjaśniono

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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.