Somma di numeri interi nella stringa, separati da numeri non numerici come 'a' e 'Y'


14

Creare un programma che somma tutti i numeri interi trovati in una stringa impostata come variabile nel programma (quindi, il programma non deve gestire alcun input). I numeri interi sono separati da numeri non numerici (tranne 0, 1, 2, 3 ... 9).

Esempi:

  • 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

Note extra:

  • Il supporto Unicode non è necessario, ma è consentito
  • -n(dove nè un numero intero) non viene conteggiato come negativo n, ma come un trattino seguito da n.

La risposta può essere stampata sullo schermo (ma non richiesta).

La risposta più breve (in caratteri) vince.


Dovremmo stampare anche il risultato? (Non si menziona alcun I / O).
Dogbert,

@Dogbert - Non ci ho pensato. Scusa, si. Aggiornerò il post.
Anto

Modificato perché alcune persone avevano già delle risposte e non volevano "ferirle". Immagino che dovrei dormire ora, quindi penserò un po 'più chiaro;)
Anto

2
Anto: Tuttavia, un'attività in cui una soluzione non ha effetti collaterali osservabili non è molto bella.
Joey,

Un caso di test interessante in cui mi sono appena imbattuto sarebbe 5a-3(il mio codice salterebbe -se segue immediatamente un numero, ma non se prima non ci fosse un numero).
Martin Ender,

Risposte:


10

Perl, 15

Inserisci in $_, somma in $c:

s/\d+/$c+=$&/ge

14

Ruby 1.9, 21 caratteri

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

Per stampare la soluzione su stdout, sono richiesti 2 caratteri aggiuntivi:

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

E per leggere da stdin invece di utilizzare una variabile predefinita, è necessario utilizzare altri 3 caratteri:

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

Per Ruby 1.8, sostituirlo ?+con "+"per ottenere una soluzione funzionante in 22 caratteri.


Si suppone che l'input sia preso da una variabile, non dallo stdin. Inoltre scanè più breve di split. Quindi la tua soluzione diventa eval s.scan(/\d+/)*?+- 21 caratteri.
sepp2k,

@ sepp2k: Sì, non ho letto correttamente la descrizione. Sono solo abituato alle altre attività di golf, dove di solito devi leggere da stdin e stampare su stdout. Buon punto con scan, grazie!
Ventero,

+1, ottimo uso di evale* '+'
Dogbert

6

Python (60)

import re;print sum(map(int,filter(len,re.split(r'\D',s))))

5

Rubino - 36 34 caratteri

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

36 caratteri se si desidera stampare il risultato.

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

Presuppone che l'input sia presente come stringa in s.


4

JavaScript (ES6), 30

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

Versione annotata:

// 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
)

3

Windows PowerShell, 23 25 29 31

Con uscita.

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

In effetti, senza l'output è esattamente lo stesso, lo avresti semplicemente instradato altrove dove è necessario.


2

J - 40 38 caratteri

Versione pigra. Richiede la libreria di stringhe.

+/".(,' ',.~a.-.'0123456789')charsub y

Supporta Unicode. Supporta la codifica, vieni a pensarci!
MPelletier,

2

Giava

fuori dal concorso;)

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

2

JavaScript [30 byte]

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

2

Labyrinth , 29 21 byte

(Dichiarazione di non responsabilità: Labyrinth è più recente di questa sfida.)

Inoltre, Labyrinth non ha variabili, quindi sono andato con un normale programma di input / output.

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

Questo è stato abbastanza semplice a causa del modo in cui funzionano i comandi di input di Labyrinth. ?prova a leggere un numero intero con segno da STDIN e si ferma alla prima non cifra. Se non è in grado di leggere un numero intero (poiché il carattere successivo -non è seguito da una cifra o da qualsiasi altra non cifra o abbiamo raggiunto EOF), verrà 0invece restituito . ,d'altra parte legge qualsiasi byte successivo e spinge il valore del byte. Se questo viene chiamato su EOF, verrà -1invece restituito .

Quindi ecco alcuni pseudocodici per la soluzione:

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

Trattare con numeri negativi complica correttamente questa soluzione. Se non fosse per quelli, avrei questa soluzione a 8 byte:

?+
;,;!@

1

PHP - 37

Senza stampa;

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

Con la stampa (38):

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

1

Perl, 16 caratteri

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

Accetta l'ingresso $_, l'uscita continua $r. L'ultimo punto e virgola è superfluo, ma probabilmente sarà necessario quando il programma fa più cose. Aggiungi say$rper output.


Oops, non ho visto la tua stessa identica risposta quando ho pubblicato. Anche se ho contato un personaggio in più anche senza il punto e virgola.
JB

@JB: non posso contare! : P. In realtà, ho fatto l'errore di ripetere una stringa tra virgolette doppiewc -c .
ninjalj,

1

J - 23 char

Non un vincitore, ma possiamo vedere una primitiva abbastanza rara in azione.

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

Ha spiegato:

  • _"."0 y- Per ogni carattere nella stringa di input y, prova a leggerlo come numero. Se non è possibile, utilizzare invece il valore predefinito _(infinito).

  • ,_=- Verificare la parità di ogni risultato _, quindi eseguire l'array finale di 0 e 1 in un vettore. ( "."0aggiunge sempre una troppa dimensione al risultato, quindi qui lo correggiamo.)

  • y,:' ' - Aggiungi una riga di spazi sotto la stringa di input.

  • }- Usato com'è qui, }si chiama Item Amend , e usa la lista di 0 e 1 a sinistra come indici per selezionare la riga da cui trarre nell'argomento destro. Quindi quello che succede è, per ogni colonna nella parte destra, prendiamo il carattere originale se potesse essere letto come un numero, e altrimenti prendiamo lo spazio sottostante. Quindi, copriamo tutti i caratteri non numerici con spazi.

  • +/". - Ora converti l'intera stringa in un elenco di numeri e sommali.


1

gs2, 4 byte

W#Θd

Codificato in CP437 ; il terzo byte è E9.

Wlegge tutti i numeri /-?\d+/da una stringa, mappa il valore assoluto, dsomma.

(anche gs2 è più recente di questa sfida, ma il suo read-numscomando è una coincidenza totale.)


0

Smalltalk (Smalltalk / X) (51 caratteri)

usando il regex pakage:

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

guai regex:

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

input in s


0

R, 30

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

Ecco xil nome della variabile.

Esempio:

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

0

Javascript - 43 caratteri

So che è lungo, ma non c'era una soluzione JS così :)

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

aè la stringa. ccontiene una risposta.


0

Tcl, 30

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

Presuppone che l'input sia nella variabile $a(formalmente, in a) e memorizza la risposta nel risultato dell'interprete. L'I / O viene lasciato come esercizio.


0

C99 (con avvertenze) 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);}

Per utilizzare effettivamente il programma è necessario assegnare la variabile in questo modo:

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

Se stai usando gcc devi compilarlo come C99 in questo modo:

gcc -std=c99 x.c

0

APL, 16 byte

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

⎕dè un built-in contenente le cifre (0-9). bè assegnato a un vettore di 0/1 dove 1 è dato ai caratteri che sono cifre. bviene utilizzato per comprimere l'array di caratteri specificato e quindi riutilizzato per espanderlo, inserendo degli spazi. è di APL eval che converte una stringa in un vettore a numeri interi, in questo caso. +/calcola la somma.


Uguale lunghezza, ma interessante:+/2⊃⍞⎕VFI⍨⎕AV~⎕D
Adám,

0

Swift 3, 78

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

dov'è sla stringa


0

Perl - 24 caratteri

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

L'input è in $ _


0

In realtà, 14 byte (non concorrenti)

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

Provalo online!

Questa presentazione non è competitiva perché in realtà è un po 'più recente di questa sfida.

Questo programma supporta la tabella codici CP437 per l'input.

Spiegazione:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.