Multiplizieren Sie alle Zahlen in einer Zeichenfolge

19

Gewinner: Chilemagic , massive 21 Bytes!

Sie können Ihre Antwort weiterhin übermitteln, jedoch nicht mehr gewinnen. Originalpost aufbewahrt:


Ihr Ziel ist es, alle Zahlen in einer Zeichenfolge zu finden und jede einzeln mit einem vom Benutzer eingegebenen Wert zu multiplizieren

  • Sie müssen sich keine Gedanken über Dezimalstellen machen
  • Der Benutzer gibt eine Zahl und eine Zeichenfolge ein
  • Der Benutzer muss die Zahl und die Zeichenfolge an einem bestimmten Punkt eingeben, die vom Programm gelesene Methode spielt jedoch keine Rolle. Dies kann mit stdin, Lesen einer Textdatei usw. geschehen. Der Benutzer muss jedoch irgendwann die Taste 9 auf seiner Tastatur drücken
  • Alles, was kompiliert und ausgeführt werden kann, ist akzeptabel

Beispiel:

Satzeingabe: Diese 1 ist22a 3352sentence 50

Zahleneingabe: 3

Ausgabe: Diese 3 is66a 10056sentence 150


  • Dieser Wettbewerb endet am 6. September 2014 (7 Tage nach Veröffentlichung).
  • Dies ist ein , also gewinnt der kürzeste Code
Jon
quelle
Jede Zahl ist zu multiplizieren. Ich habe mein Beispiel aktualisiert.
Jon
Ich verstehe die Bedeutung oder Verwendung von "Drücken Sie die 9-Taste" in Ihrer Herausforderung nicht. Wie oder wo trifft dies im gegebenen Beispiel zu?
Darren Stone
3
@ Darren Er sagt im Grunde, dass man die Nummer nicht fest codieren kann.
Beta Decay
2
Können wir Annahmen über die Größe der betroffenen Zahlen treffen, insbesondere über die Möglichkeit eines Überlaufs? Behandeln wir "-1234" in Abhängigkeit von den Ergebnissen des Obigen als "-" gefolgt von 1234 oder als -1234?
Alchymist
1
Hinzufügen zu @ IlmariKaronens Frage: Was tun mit führenden Nullen wie in "Bond ist Agent 007" -> "Bond ist Agent 21" oder "Bond ist Agent 0021" oder "Bond ist Agent 021" oder ...?
Hagen von Eitzen

Antworten:

24

Update - Perl - 17

s/\d+/$&*$^I/ge

15 Zeichen + 2 für -iund -pFlags.

Wir können das -iFlag verwenden, um eine Dateierweiterung einzugeben, aber da wir keine Dateien lesen, können wir es verwenden, um die Nummer abzurufen, und es wird die Variable $^Izugewiesen.

Laufen mit:

perl -e'print"This 1 is22a 3352sentence 50"' | perl -i3 -pe's/\d+/$&*$^I/ge'

Perl - 21

Aktualisiert gemäß dem Kommentar von @ Dennis.

$n=<>;s/\d+/$&*$n/ge

Laufen Sie mit -pFlagge.

Beispiellauf:

perl -e'print"This 1 is22a 3352sentence 50\n3"' | perl -pe'$n=<>;s/\d+/$&*$n/ge'

Erläuterung:

$n=<>; Lesen Sie die Nummer ein

-p druckt die Ausgabe

s/\d+/$&*$n/geLesen Sie die Eingabe mit <> und suchen Sie nach einer oder mehreren Ziffern und ersetzen Sie diese durch die Ziffern multipliziert mit der Zahl. gist global, eist evalder Ersatztrank des s ///.$&enthält , was abgestimmt wurde und es multipliziert mit der Anzahl $n.

Sie können mehr über s///in Perlop und mehr über Perl-Regexes in lesen perlre .

Eine andere Lösung:

@ F.Hauri wies darauf hin, dass Sie die Variable auch mit dem s Schalter$n 4 zuweisen können. Ich bin mir nicht sicher, wie viele Zeichen dies zählt, aber ich lasse es hier:

perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'
hmatt1
quelle
Ich denke, Sie könnten ein paar weitere Zeichen speichern, indem Sie <>=~anstelle von verwenden _$=<>;. sKönnen Sie uns auch erklären, was der Teil des Regex für uns Anfänger bedeutet?
Tal
@Tal String.
Kaz Wolfe
3
@Mew Ich bin mir ziemlich sicher, es ist für "Substitution"
Martin Ender
1
1. Wenn Sie $&statt $1, können Sie verkürzen (\d)zu \d. 2. Wenn Sie den -pSchalter verwenden und die Eingabereihenfolge ändern, können Sie say<>=~und löschen r.
Dennis
1
Diese können Sie verwenden -sSchalter, um whipe $n=<>aus: perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'(do machen: This 4 is88a 13408sentence 200)
F. Hauri
9

JavaScript (ES6) - 48 44 Zeichen

Vielen Dank an @bebe für das Speichern eines Zeichens. Update: 8 / Mar / 16, weitere vier Zeichen entfernt

b=(p=prompt)();p(p().replace(/\d+/g,y=>y*b))

Ungolfed :

var sentence = prompt(),
    num = parseInt(prompt(), 10); // base 10

sentence = sentence.replace(/\d+/g, digit => digit * num);

alert(sentence);

43 Zeichen:

(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))

b=(p=prompt)();p(p().replace(/\d+/g,y=>y*b))

Erfordert zuerst eine Zahleneingabe und dann einen Satz. Schneiden Sie ein Zeichen mehr hier danke @bebe noch einmal!

Gaurang Tandon
quelle
Sie nicht zu Parse - Nummer eingeben müssen
bebe
@bebe Natürlich! Ich habe es nicht bemerkt! Vielen Dank!
Gaurang Tandon
(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))eine andere (aber das verlangt Multiplikator zuerst)
bebe
@bebe Danke auch dafür!
Gaurang Tandon
6

Python 2 (79)

import re
n=input()
s=input()
print re.sub('\d+',lambda x:`int(x.group())*n`,s)

Probelauf

Eingang:
$ python mult.py
3
"This 1 is22a 3352sentence 50"
Ausgabe:
This 3 is66a 10056sentence 150

Online-Demo: http://ideone.com/V6jpyQ

Cristian Lupascu
quelle
Brillant. Ich denke, es re.subhandelt sich um die Methode, mit der Beta Decay und ich (die beiden anderen Python-Beiträge) versucht haben, sie erneut zu implementieren. Es wäre so einfach gewesen ... Etwas anderes, das ich gelernt habe! ;)
Falko
@Falko re.subbeiseite, Sie haben hervorragende Arbeit beim Golfen der String-
Replace-
@Falko da stimme ich zu, re.subist genau das was ich wollte!
Beta Decay
4

Python 2 - 126

import re
n=input()
s=input()
for i in list(re.finditer('\d+',s))[::-1]:s=s[:i.start()]+`int(i.group())*n`+s[i.end():]
print s

Erste Eingabe: Ganzzahl n.

Zweite Eingabe: String s(z "abc42". B. mit Anführungszeichen ).

Falko
quelle
4

CJam, 47 33 30 Bytes

q_A,sNerN%\[_A,s-Ner~](f*]zs1>

Liest die Nummer und die Zeichenfolge (in dieser Reihenfolge und durch ein einzelnes Leerzeichen getrennt) von STDIN.

Probieren Sie es online aus.

Beispiellauf

$ cjam multiply.cjam <<< '7 N0 R3GUL4R 3XPR35510N5 1N CJ4M M4K3 M3 4 54D P4ND4'
N0 R21GUL28R 21XPR248570N35 7N CJ28M M28K21 M21 28 378D P28ND28

Wie es funktioniert

q                                 " Read from STDIN (“Q”) and push a second copy.         ";
  A,s                             " Push “0123456789” (thanks, @aditsu).                  ";
 _   NerN%                        " Replace digits with linefeeds and split at linefeeds. ";
          \ _A,s-Ner              " Replace non-digits with linefeeds.                    ";
                    ~             " Evaluate the resulting string.                        ";
           [         ]            " Collect the results in an array.                      ";
                      (f*         " Multiply all other integers by the first.             ";
                         ]z       " Interleave the elements of both arrays.               ";
                           s1>    " Flatten the result and discard the leading space.     ";
Dennis
quelle
Dies ist der seltsamste Code aller Zeiten !!!
Azerafati
1
@Bludream: Dies ist nicht einmal der seltsamste Code, den ich geschrieben habe . : P
Dennis
Hmm, 3 · 7 = 27 & le;
Aditsu
lol, ja, ich habe für beide gestimmt. Diese werden die Welt nicht zu einem besseren Ort machen. Wie um alles in der Welt sind daraus Programmiersprachen geworden, die lesbar sein sollen?
Azerafati
@aditsu: Aufteilen gegen Iterieren, der Kampf geht weiter. : P
Dennis
4

Bash + Coreutils, 38 Bytes

eval echo `sed "s/[0-9]\+/$\[$1*&]/g"`

Liest die Eingabezeichenfolge aus STDIN und dem Multiplikator als Befehlszeilenparameter.

Ausgabe:

$ ./multstr.sh 3 <<< "This 1 is22a 3352sentence 50"
This 3 is66a 10056sentence 150
$ 
Digitales Trauma
quelle
6
Interessante Idee, aber dies funktioniert nur, wenn die Zeichenfolge keine Zeichen enthält, die speziell für Bash sind ... Dies ist ein Beispiel für eine Zeichenfolge, die ich nicht probieren würde:1 D4R3 Y0U: ; rm -rf /
Dennis
@ Tennis ja, das ist eine ziemlich unglückliche Einschränkung
Digital Trauma
3

C # in LINQPad, 124

Einfach. Bitte verwenden Sie STRG + 2 in LINQPad (Sprache: C # -Anweisungen).

var s=Console.ReadLine();var k=int.Parse(Console.ReadLine());new Regex("\\d+").Replace(s,t=>""+int.Parse(t.Value)*k).Dump();

Wird der Multiplikator als erster Eingabeparameter angegeben, kann dies in 116 Zeichen erfolgen:

var k=int.Parse(Console.ReadLine());new Regex("\\d+").Replace(Console.ReadLine(),t=>""+int.Parse(t.Value)*k).Dump();

BEARBEITEN:

Dank Abbas 'Kommentar unten kann dies sogar noch besser mit der statischen Regex-Methode umgesetzt werden , anstatt sie zu instanziieren:

var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int‌​.Parse(t.Value)*k).Dump();
Jacob
quelle
Nice one, code-golf in C# isn't easy! I don't want to get rep on your effort so I'll provide you a tip instead of posting my own answer: use the static Regex.Replace(string, string, string) instead of new Regex("...").Replace(...); Here's the short multiplier-first version: var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int.Parse(t.Value)*k).Dump();. In both versions this saves another 5 characters, getting you on 119 for the long version and 111 for the multiplier-first version
Abbas
1
Thanks for the tip, however, I decided not to change my original answer, such that others will be able to learn what-not-to-do from me, and what-to-do from you - regarding C# Regex Golfing.
Jacob
I understand you but you could also add my tip in your answer as an edit. Users tend to read this more than they will a list of comments with tips.
Abbas
Sure. The answer was edited.
Jacob
2

Cobra - 171

use System.Text.RegularExpressions
class P
    def main
        a=int.parse(Console.readLine?'')
        print Regex.replace(Console.readLine,'\d+',do(m as Match)="[int.parse('[m]')*a]")
Οurous
quelle
2

Python 3 - 141

I don't think I can golf this any more...

import re
n=input()
f=input()
o=''
p=0
for i in re.finditer('\d+',f):o+=f[p:i.start()]+str(int(i.group())*int(n));p=i.end()
o+=f[p:]
print(o)

Example:

3     # This is input
h3110 # This is input
h9330 # This is output

10
hello100 hello100
hello1000 hello1000
Beta Decay
quelle
2
Unfortunately this approach does not work. For n=2 and s="1 2" it yields 4 4, since replace modifies the first number twice. That's the same problem I'm facing right now with Python 2... ;)
Falko
@Falko I've managed to fix the problem, although making my code longer in the process
Beta Decay
Oh, well done! Just some minor remarks: m=input() saves you nothing. And x=int is actually 2 bytes longer than calling int(...) twice.
Falko
2

Mathematica 71 61

With 10 chars saved thanks to Martin Buttner.

Spaces in code are for readability.

f is a function in which s is the input string and n is the number to multiply discovered string numbers by.

 StringReplace[#, a : DigitCharacter .. :> ToString[#2 FromDigits@a]] &

Examples

 s="This 1 is22a 3352sentence 50"

Integer

StringReplace[#, a : DigitCharacter .. :> ToString[#2 FromDigits@a]] &@@{s, 3}

"This 3 is66a 10056sentence 150"


Rational number

StringReplace[#, a : DigitCharacter .. :> ToString[#2 FromDigits@a]] &@@{s, -7.13}

"This -7.13 is-156.86a -23899.8sentence -356.5"


Complex Number

StringReplace[#, a : DigitCharacter .. :> ToString[#2 FromDigits@a]] &@@{s, -5 + 3 I}

"This -5 + 3 I is-110 + 66 Ia -16760 + 10056 Isentence -250 + 150 I"

DavidC
quelle
1
I don't know Mathematica. But in your examples all numbers and words are separated by spaces. Does it work for numbers directly attached to letters as well, like "abc42"?
Falko
For StringReplace it makes no difference whether there are spaces. I used the examples originally given by Chiperyman.
DavidC
I switched to the updated example. (I had used the example given earlier by Chiperyman.) For StringReplace it makes no difference whether there are spaces.
DavidC
2

Ruby 40

a,b=$*
p a.gsub(/\d+/){|s|s.to_i*b.to_i}

Input from stdin.

Example run:

$ ruby mult.rb "This 1 is22a 3352sentence 50" 3 
"This 3 is66a 10056sentence 150"

Online demo: http://ideone.com/4BiHC8

Cristian Lupascu
quelle
2

Lua: 73 69 characters

r=io.read
s=r()n=r()s=s:gsub("%d+",function(m)return m*n end)print(s)

Sample run:

bash-4.3$ lua -e 'r=io.read;s=r()n=r()s=s:gsub("%d+",function(m)return m*n end)print(s)' <<< $'This 1 is22a 3352sentence 50\n3'
This 3 is66a 10056sentence 150
manatwork
quelle
1
You can golf it a bit more by putting everything on one line, and smooshing instructions next to ")". Like "s=r()n=()" is perfectly fine.
AndoDaan
1
Doh, and I read Tips for golfing in Lua just a couple of weeks ago. :( Thank you, @AndoDaan.
manatwork
2

JavaScript, ES6, 43 characters

This is my first attempt at golfing!

(p=prompt)(p(n=p()).replace(/\d+/g,y=>y*n))

Run this in latest Firefox's Console. The first input is the number and the second input is the string from which the numbers are to be multiplied with the first input number.

The final prompt lists the output.


quelle
Pretty nice JS Golf for a first timer!
Optimizer
Many other answers could be shorter if number was read first. That was is much easier.
manatwork
@manatwork - Yeah, but the question does not give any preference on the order, so I think it should be fine.
Correct. This is a lack of the question itself. Personally I preferred to handle input in string+number order in my answers to keep them comparable with the others.
manatwork
1

Perl - 48 chars

$n=<>;print/\d/?$_*$n:$_ for(<>=~/(\d+)|(\D+)/g)

Read a number on the first line, then read a sentence and break it into chunks of either digits or non digits. Print the non digits as they are, and the numbers get multiplied.

Tal
quelle
1

J - 63 Zeichen

Das Programm liest die Nummer und dann den Satz ein.

;(*&.".&(1!:1]1)^:(0{i)(<@);.1~1,2~:/\i=.e.&'0123456789')1!:1]1

Erklärt durch Explosion:

;(*&.".&(1!:1]1)^:(0{i)(<@);.1~1,2~:/\i=.e.&'0123456789')1!:1]1
                                                         1!:1]1  NB. read sentence
                                         e.&'0123456789'         NB. is digit? bool vector
                                      i=.                        NB. save to i
                                 2  /\                           NB. between adjacent chars:
                                  ~:                             NB.  true if not equal
                               1,                                NB. pad to sentence length
 (                         ;.1~                         )        NB. cut the sentence
                ^:(0{i)                                          NB. if cut is digits:
  *&.".                                                          NB.  multiply as number
       &(1!:1]1)                                                 NB.  with user input
;                                                                NB. rejoin sentence

Wenn wir die PCRE-Bibliothek von J verwenden und den Satz zuerst eingeben, können wir dies auf 54 Zeichen reduzieren :

;_2(,*&.".&(1!:1]1)&.>)/\'\d+'(rxmatches rxcut])1!:1]1

Erklärt durch Explosion:

                                                1!:1]1  NB. read in sentence
                         '\d+'(rxmatches       )        NB. all /\d+/ matches
                              (          rxcut])        NB. cut by those matches
 _2                     \                               NB. on each nonmatch-match pair:
   (               &.>)/                                NB.  take the match
     *&.".                                              NB.  multiply as number
          &(1!:1]1)                                     NB.  by user input
   (,                 )                                 NB.  prepend nonmatch
;                                                       NB. rejoin sentence

J ist schlecht darin, was soll ich sagen. Es ist unpraktisch, weil J so nicht einflussreich ist.

Einige Beispiele:

   ;(*&.".&(1!:1]1)^:(0{i)(<@);.1~1,2~:/\i=.e.&'0123456789')1!:1]1
3
This 1 is22a 3352sentence 50
This 3 is66a 10056sentence 150
   ;(*&.".&(1!:1]1)^:(0{i)(<@);.1~1,2~:/\i=.e.&'0123456789')1!:1]1
100
N0 R3GUL4R 3XPR35510N5 1N J M4K35 M3 54D ALS0
N0 R300GUL400R 300XPR3551000N500 100N J M400K3500 M300 5400D ALS0
   0!:0 <'system\main\regex.ijs'  NB. this is usually preloaded by J on startup anyway
   ;_2(,*&.".&(1!:1]1)&.>)/\'\d+'(rxmatches rxcut])1!:1]1
TH4T'5 M4RG1N411Y B3TT3R
0
TH0T'0 M0RG0N0Y B0TT0R
algorithmshark
quelle
1

CJam - 35

li:X;lN+{_sA,s-,{])\_!!{iX*}*oo}*}/

Versuchen Sie es unter http://cjam.aditsu.net/

Beispieleingabe:

7
CJ4M W1LL H4V3 R3GUL4R 3XPR35510N5 L4T3R

Beispielausgabe:

CJ28M W7LL H28V21 R21GUL28R 21XPR248570N35 L28T21R

Erläuterung:

Das Programm durchläuft jedes Zeichen, sammelt die Ziffern auf dem Stapel und druckt für jede Nicht-Ziffer zuerst die gesammelte Zahl (falls vorhanden) multipliziert mit der numerischen Eingabe und druckt dann das Zeichen.

li:X;Liest die numerische Eingabe und speichert sie in X
lN+Liest die Zeichenfolge und fügt
{…}/für jedes Zeichen in der Zeichenfolge eine neue Zeile an (dies hilft bei abschließenden Zahlen)
- _skopiert die Zeichen und konvertiert sie in Zeichenfolgen
- A,s-,entfernt alle Ziffern und zählt die verbleibenden Zeichen; das Ergebnis ist 0, wenn das Zeichen eine Ziffer war, oder 1, wenn nicht
- {…}*führt den Block aus, wenn die Zählung 1 war (dh keine Ziffer); Bei Ziffern geschieht nichts, daher bleiben sie auf dem Stapel
- ]sammelt die Zeichen aus dem Stapel in einem Array (dh einer Zeichenfolge); Die Zeichen sind alle Ziffern aus den vorherigen Iterationen sowie das aktuelle Zeichen.
- -)\ trennt den letzten Punkt (die aktuelle Rolle) und bewegt ihn vor der (Rest-) string
_!! kopiert die Zeichenfolge und konvertiert sie in einen booleschen Wert - 0, wenn leer, 1, wenn nicht
-.{…}* führt den Block aus, wenn der String nicht leer war, dh wir hatten einige Ziffern vor dem aktuellen nicht-stelligen Zeichen
- iX*konvertiert den String in eine Ganzzahl und multipliziert mit X
- odruckt den oberen Teil des Stapels - entweder die multiplizierte Zahl oder die leere Zeichenfolge, wenn wir keine Zahl hatten
- o(die zweite) druckt den neuen oberen Teil des Stapels - das aktuelle nicht-stellige Zeichen

aditsu
quelle
Das ist ein viel vernünftigerer Ansatz.
Dennis
1

Haskell (161)

Golf gespielt

main=do{n<-getLine;l<-getContents;let{g c(t,s)|c>'/'&&c<':'=(c:t,s)|t/=""=([],c:(show.(*(read n)).read$t)++s)|True=(t,c:s)};putStr.tail.snd.foldr g("","")$' ':l}

Ungolfed

modify :: (Show a, Read a) => (a -> a) -> String -> String
modify f = show . f . read

main=do
  number <- fmap read $ getLine    -- get number  
  l <- getContents                 -- get input

  -- if the current character is a digit, add it to the digits
  -- if the current character isn't a digit, and we have collected
  --    some digits, modify them and add them to the string
  -- otherwise add the current characters to the string

  let go current (digits , string) 
        | current `elem` ['0'..'9'] = (current : digits, string)
        | not (null digits)         = ([], current:(modify (*number) digits) ++ string)
        | otherwise                 = (digits, current:string)

  -- since the result of `go` is a pair, take the second value,
  -- remove the head (it's a space, in order to convert digits at the start)
  -- and print it
  putStr . tail . snd . foldr go ("","")$' ':l

Leider hat Haskell keine Regex-Bibliothek im Prelude .

Zeta
quelle
schönes Golfen; Sie hätten den äußersten löschen können, {}um 1 Zeichen zu gewinnen. Außerdem habe ich gerade diese Haskell-Lösung mit 70 Bytes gepostet: codegolf.stackexchange.com/questions/37110/…
proud haskeller
1

flex (-lexer) ( 94 89 Zeichen)

 int m;main(c,v)char**v;{m=atoi(*++v);yylex();}
%%
[0-9]+ {printf("%d",m*atoi(yytext));}

Ungolfed-Version, die nicht fehlerfrei funktioniert, wenn Sie das Kommandozeilenargument vergessen (nicht mehr lange):

%{
#define YY_DECL int y(int m)
%}
%option noyywrap noinput nounput
%%
[0-9]+ {printf("%d",m*atoi(yytext));}
%%
int main(int argc, char** argv) {
  return (argc > 1) ? y(atoi(argv[1])) : 1;
}

Kompilieren mit:

flex -o m.c m.l
cc -o m m.c -lfl

oder:

flex --noyywrap -o m.c m.l
cc -o m m.c

Z.B:

$ ./m 163
This 1 is22a 3352sentence 50
This 163 is3586a 546376sentence 8150
rici
quelle
1

Groovy - 124

Scanner s=new Scanner(System.in)
def x=s.nextLine()
def n=s.nextInt()
x=x.replaceAll(/\d+/,{it->it.toInteger()*n})
println x

Klicken Sie auf den Titel, um das ausführbare Beispiel zu sehen

Versuchte Beispiele:

Diese 1 is22a 3352sentence 50
3
Diese 3 is66a 10056sentence 150


Diese 1 is22a 3352sentence 50
42
Diese 42 is924a 140784sentence 2100

Kleines Kind
quelle
0

GNU Awk: 86 Zeichen

s{n=split(s RS,a,/[^0-9]+/,d);while(++i<n)printf"%s%s",a[i]==""?"":a[i]*$1,d[i]}{s=$0}

Probelauf:

bash-4.3$ awk 's{n=split(s RS,a,/[^0-9]+/,d);while(++i<n)printf"%s%s",a[i]==""?"":a[i]*$1,d[i]}{s=$0}' <<< $'This 1 is22a 3352sentence 50\n3'
This 3 is66a 10056sentence 150
Mann bei der Arbeit
quelle
0

PHP - 75/115 68/109

Zwei Versionen, neuere PHP-Versionen können dies tun:

echo preg_replace_callback("/\d+/",function($m){return$m[0]*$f;},$s);

Ältere PHP-Versionen: Ich habe die Zeilenumbrüche nicht gezählt, sondern aus Gründen der Lesbarkeit hinzugefügt.

function a($s){echo preg_replace_callback("/\d+/",b,$s);}
function b($i){global$f;return$i[0]*$f;}
a($s,$f);

Beispiel Eingabe + Ausgabe

$s = "ab11cd22"; // string
$f =  3; // -> output: ab36cd69
$f = -2; // -> output: ab-24cd-46

Etwas schwierig, nehmen die Wörter 'function' und 'preg_replace_callback' eine Menge Zeichen in Anspruch.
Der Platz nach globalund wird returnnicht benötigt, wenn ein $ var (-2 Zeichen) folgt.

Martijn
quelle
Keine Notwendigkeit, \din Zeichenklasse (-2 Zeichen) zu setzen; Die Funktion muss nicht in doppelte Anführungszeichen (-2 Zeichen) eingeschlossen werden. Sie müssen die Anweisung innerhalb der Funktion ordnungsgemäß mit einem Semikolon (+1 Zeichen) beenden. Übrigens sollte \din doppelten Anführungszeichen geschrieben werden \\d, so ändern Sie die Anführungszeichen besser in einfache Anführungszeichen.
Manatwork
Vielen Dank. Begonnen mit [0-9], geändert 0-9in \ d. War nicht sicher über die Anführungszeichen rund um die Funktion, ich kann das nicht testen, meine lokale PHP-Version erlaubt es nicht.
Martijn
Die doppelten Anführungszeichen funktionieren gut (zumindest für mich) :)
Martijn
0

C ( 142 134 Zeichen)

main(a,b)char**b;{char*c=b++[2],*d="0123456789";for(;*c;c+=strspn(c
,d))write(1,c,a=strcspn(c,d)),dprintf(1,"%d",atoi(*b)*atoi(c+=a));}

Zeilenumbruch zur besseren Lesbarkeit eingefügt. Übergeben Sie den Faktor als erste und die Zeichenfolge als zweite Befehlszeilenoption. Diese Implementierung erfordert die dprintfFunktion, die Teil von POSIX.1 2008 ist und unter Windows möglicherweise nicht verfügbar ist. Hier ist die ungekürzte Quelle:

/*
 * Multiply all numbers in a string by a number.
 * http://codegolf.stackexchange.com/q/37110/134
 * Solution by user FUZxxl
 */

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

extern int
main(int count, char **argv)
{
    char *str = argv++[2], *digits = "0123456789";

    while (*str) {          /* as long as we have not reached the end */
        count = strcspn(str, digits);
        write(1, str, count);

        dprintf(1, "%d", atoi(*argv) * atoi(str += count));
        str += strspn(str, digits);
    }
}

Verbesserungen

  • 142 → 134: Verwenden Sie strspnund, strcspnanstatt die Zeichenfolge zu durchlaufen.
FUZxxl
quelle
0

Python 89

import re,sys
j,n,s=sys.argv
print re.sub('(\d+)',lambda m:str(int(m.group())*int(n)),s)

z.B:

# python numberstring.py 3 '1shoop da2 w007p!'
3shoop da6 w21p!
Sammitch
quelle
0

Rebol - 117

n: do input d: charset"0123456789"parse s: input[any[b: some d e:(e: insert b n * do take/part b e):e | skip]]print s


Ungolfed:

n: do input 
d: charset "0123456789"

parse s: input [
    any [
        b: some d e: (e: insert b n * do take/part b e) :e
        | skip
    ]
]

print s
draegtun
quelle
0

Clojure - 141 140 128 Zeichen

Ich bin ein Clojure-Neuling, aber FWIW:

(let[[a b]*command-line-args*](println ((fn[s n](clojure.string/replace s #"\d+"#(str(*(read-string %)(read-string n)))))a b)))

Probelauf:

bash$ java -jar clojure-1.6.0.jar multstr.clj "This 1 is22a 3352sentence 50" 3  
This 3 is66a 10056sentence 150

Ungolfed (hässlich, aber hoffentlich etwas leichter zu lesen):

(let [[a b] *command-line-args*]
    (println ( (fn [s n] 
                    (clojure.string/replace 
                        s 
                        #"\d+" 
                        #(str (* (read-string %) (read-string n)))))
                    a b)))
Michael Easter
quelle
0

Python - 142

import re
s=raw_input()
i=int(raw_input())
print ''.join([x[0]+str(int(x[1])*i) for x in filter(None,re.findall('(\D*)(\d*)',s)) if x[0]!=''])
Xirion11
quelle
0

Java 218

Jemand musste Java machen. Die Eingabezeichenfolge enthält 2 Token in der Befehlszeile.

java M 'Diese 1 is22a 3352sentence 50' 3

public class M{
    public static void main(String[]a) {
        int m=new Integer(a[1]),n=0,b=0;
        String s="";
        for(char c:a[0].toCharArray()){
            if(c<48|c>57)s=b>(b=0)?s+m*n+c:s+c;
            else n=b*n+c-38-(b=10);
        }
        System.out.println(b>0?s+m*n:s);
    }
}
Florian F
quelle
1
Laut meinem Test iffunktioniert die Bedingung auch bitweise |, dh 1 Zeichen kürzer.
Manatwork
Vielen Dank. Code aktualisiert. (Es ist eigentlich immer noch ein Boolescher Wert oder, nur ohne Bewertungsverknüpfung).
Florian F
0

Zwei Antworten: +

Pure Bash (~ 262)

Erstens gibt es eine nicht so kurze reine Bash-Version (keine Fork, keine externen Binaries)!

mn () { 
    if [[ $1 =~ ^(.*[^0-9]|)([0-9]+)([^0-9].*|)$ ]]; then
        local num=${BASH_REMATCH[2]} rhs="${BASH_REMATCH[3]}";
        mn "${BASH_REMATCH[1]}" ${2:-3} l;
        echo -n "$[num*${2:-3}]$rhs";
    else
        echo -n "$1";
    fi;
    [ "$3" ] || echo
}

Lass es uns zeigen:

mn "This 1 is22a 3352sentence 50" 42
This 42 is924a 140784sentence 2100

(Welches ist ein völlig unwahrscheinlicher Satz)

Perl etwas verschleiert (nur zum Spaß)

Diese Version (basierend auf der Antwort von @ Chilemagic ) ist nicht kürzer, sondern als Totem- Skript konzipiert:

cat <<eof >mn.pl

#!/usr/bin/perl          -sp
                      eval eval'"'
                      .('['^'(')
           .'/\\'.'\\'.('`'|'$').'+'.'/\\$\&'
                        .'*\\$'
                      .('`'|'.').'/'
                      .('`'|"'")
                      .('`'|'%').'"'

eof chmod +x mn.pl

Probelauf:

./mn.pl -n=2 <<<$'This 1 is22a 3352sentence 50\n21.'
This 2 is44a 6704sentence 100
42.
F. Hauri
quelle
0

Haskell, 70

schade ich bin zu spät IMHO das ist ziemlich gut für diese spezifische Frage und Sprache. Die andere Haskell-Lösung besteht aus 161 Zeichen.

[]%n=""
s%n=f s(reads s)n
f _((a,b):_)n=show(a*n)++b%n
f(x:s)_ n=x:s%n

Dies funktioniert mit der readsFunktion, die eine Zeichenfolge teilweise analysiert. zum Beispiel reads "34abc" = [(34, "abc")]. Dies macht es offensichtlich perfekt für diese Herausforderung.

Verwendung:

*Main> " This 1 is22a 3352sentence 50"%3
" This3 is66a10056sentence150"
stolzer haskeller
quelle