Multipliez tous les nombres dans une chaîne

19

Gagnant: Chilemagic , un énorme 21 octets!

Vous pouvez continuer à soumettre votre réponse, mais vous ne pouvez plus gagner. Poste d'origine conservé:


Votre objectif est de trouver tous les nombres dans une chaîne et de les multiplier individuellement par une valeur entrée par l'utilisateur

  • Vous n'aurez pas à vous soucier des décimales
  • L'utilisateur entrera un nombre et une chaîne
  • L'utilisateur doit taper le numéro et la chaîne à un moment donné, mais la méthode de lecture du programme n'a pas d'importance. Cela peut être avec stdin, lire un fichier texte, etc., mais l'utilisateur doit appuyer sur le bouton 9 de son clavier (par exemple) à un moment donné
  • Tout ce qui peut être compilé et exécuté est acceptable

Exemple:

Entrée de phrase: ce 1 is22a 3352 phrase 50

Entrée de nombre: 3

Sortie: Ce 3 is66a 10056sentence 150


  • Ce concours se termine le 6 septembre 2014 (7 jours après l'affichage).
  • Ceci est un , donc le code le plus court gagne
Jon
la source
Tout nombre doit être multiplié. J'ai mis à jour mon exemple.
Jon
Je ne comprends pas la signification ou l'utilisation de «appuyez sur le bouton 9» dans votre défi. Comment ou où s'applique-t-il dans l'exemple donné?
Darren Stone
3
@Darren Il dit essentiellement que vous ne pouvez pas coder en dur le numéro.
Beta Decay
2
Peut-on faire des hypothèses sur la taille des nombres impliqués, notamment la possibilité de débordement? Selon les résultats de ce qui précède, traitons-nous "-1234" comme "-" suivi de 1234 ou -1234?
Alchymist du
1
Pour ajouter à la question de @ IlmariKaronen: Que faire des zéros de tête comme dans "Bond est l'agent 007" -> "Bond est l'agent 21" ou "Bond est l'agent 0021" ou "Bond est l'agent 021" ou ...?
Hagen von Eitzen

Réponses:

24

Mise à jour - Perl - 17

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

15 caractères + 2 pour -iet -pdrapeaux.

Nous pouvons utiliser l' -iindicateur pour saisir une extension de fichier, mais comme nous ne lisons aucun fichier, nous pouvons l'utiliser pour obtenir le numéro et lui attribuer la variable $^I.

Courir avec:

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

Perl - 21

Mis à jour selon le commentaire de @ Dennis.

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

Courez avec le -pdrapeau.

Exemple d'exécution:

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

Explication:

$n=<>; lire le nombre

-p imprime la sortie

s/\d+/$&*$n/geLisez l'entrée avec <> et recherchez un ou plusieurs chiffres et remplacez-les par les chiffres multipliés par le nombre. gest global, eest evalla potion de remplacement du s ///. $&contient ce qui a été apparié et multiplié par le nombre $n,.

Vous pouvez en savoir plus sur s///dans perlop et plus sur Perl Regexes dans perlre .

Une autre solution:

@ F.Hauri a souligné que vous pouvez également utiliser le s commutateur pour affecter la $nvariable à 4. Je ne sais pas combien de caractères cela compte, mais je vais le laisser ici:

perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'
hmatt1
la source
Je pense que vous pourriez enregistrer quelques caractères supplémentaires en utilisant <>=~au lieu de _$=<>;. Pourriez-vous également expliquer ce que signifie la spartie de l'expression rationnelle, pour nous novices?
Tal
@Tal String.
Kaz Wolfe
3
@Mew Je suis sûr que c'est pour la "substitution"
Martin Ender
1
1. Si vous utilisez $&au lieu de $1, vous pouvez raccourcir (\d)en \d. 2. Si vous utilisez le -pcommutateur et modifiez l'ordre d'entrée, vous pouvez supprimer say<>=~et r.
Dennis
1
Vous pouvez utiliser l' -sinterrupteur pour whipe $n=<>sur: perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'(ne rendent: This 4 is88a 13408sentence 200)
F. Hauri
9

JavaScript (ES6) - 48 44 caractères

Merci à @bebe d' avoir sauvé un caractère. Mise à jour: 8 / mars / 16, suppression de quatre autres caractères

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

Non golfé :

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

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

alert(sentence);

43 caractères:

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

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

Nécessite d'abord la saisie d'un nombre, puis une phrase. Coupez encore un caractère ici merci @bebe encore!

Gaurang Tandon
la source
vous n'avez pas besoin d'analyser la saisie du numéro
bebe
@bebe Bien sûr! Je n'ai pas remarqué! Merci beaucoup!
Gaurang Tandon
(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))un autre (mais cela demande d'abord un multiplicateur)
bebe
@bebe Merci aussi pour ça!
Gaurang Tandon
6

Python 2 (79)

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

Exemple d'exécution

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

Démo en ligne: http://ideone.com/V6jpyQ

Cristian Lupascu
la source
Brillant. Je suppose que re.subc'est la méthode Beta Decay et moi (les deux autres soumissions Python) essayions de réimplémenter. Cela aurait été si facile ... Quelque chose d'autre que j'ai appris! ;)
Falko
@Falko à re.subpart, vous avez fait un excellent travail au golf de la logique de remplacement des cordes
Cristian Lupascu
@Falko Je suis d'accord, re.subc'est exactement ce que je voulais!
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

Première entrée: entier n.

Deuxième entrée: chaîne s(avec des guillemets, par exemple "abc42").

Falko
la source
4

CJam, 47 33 30 octets

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

Lit le nombre et la chaîne (dans cet ordre et séparés par un seul espace) de STDIN.

Essayez-le en ligne.

Exemple d'exécution

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

Comment ça fonctionne

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
la source
Ceci est le morceau de code le plus étrange jamais !!!
azerafati
1
@Bludream: Ce n'est même pas le code le plus étrange que j'ai écrit . : P
Dennis
Hmm, 3 * 7 = 27?
aditsu
lol, ouais voté pour les deux. Bien que cela ne rendra pas le monde meilleur. Comment les langages de programmation qui sont censés être lisibles se sont transformés en ceci ??
azerafati
@aditsu: Séparation vs itération, la bataille continue. : P
Dennis
4

Bash + coreutils, 38 octets

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

Lit la chaîne d'entrée depuis STDIN et le multiplicateur comme paramètre de ligne de commande.

Production:

$ ./multstr.sh 3 <<< "This 1 is22a 3352sentence 50"
This 3 is66a 10056sentence 150
$ 
Traumatisme numérique
la source
6
Idée intéressante, mais cela ne fonctionnera que si la chaîne ne contient pas de caractères spéciaux pour Bash ... Voici un exemple de chaîne que je n'essaierais pas :1 D4R3 Y0U: ; rm -rf /
Dennis
@Dennis oui c'est une mise en garde plutôt malheureuse
Digital Trauma
3

C # dans LINQPad, 124

Simple. Veuillez utiliser CTRL + 2 dans LINQPad (langue: instructions C #).

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

Si le multiplicateur est donné comme premier paramètre d'entrée, cela peut être fait en 116 caractères:

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

ÉDITER:

Grâce au commentaire d'Abbas ci-dessous, cela peut même être davantage joué en utilisant la méthode statique Regex , plutôt que de l'instancier:

var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int‌​.Parse(t.Value)*k).Dump();
Jacob
la source
Sympa, le code-golf en C # n'est pas facile! Je ne veux pas me faire représenter par vos efforts, je vais donc vous donner un conseil au lieu de poster ma propre réponse: utilisez le Regex.Replace statique (chaîne, chaîne, chaîne) au lieu du nouveau Regex ("...") .Remplacer(...); Voici la version courte-premier multiplicateur: var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int.Parse(t.Value)*k).Dump();. Dans les deux versions, cela permet d'économiser 5 autres caractères, vous permettant d'obtenir 119 pour la version longue et 111 pour la version multiplicateur en premier
Abbas
1
Merci pour l'astuce, cependant, j'ai décidé de ne pas changer ma réponse d'origine, de sorte que d'autres puissent apprendre ce que je ne dois pas faire et ce que je dois faire de vous - concernant C # Regex Golfing.
Jacob
Je vous comprends, mais vous pouvez également ajouter mon conseil dans votre réponse en tant que modification . Les utilisateurs ont tendance à lire ceci plus qu’une liste de commentaires avec des conseils.
Abbas
Sûr. La réponse a été modifiée.
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
la source
2

Python 3 - 141

Je ne pense plus pouvoir jouer au golf ...

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)

Exemple:

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

10
hello100 hello100
hello1000 hello1000
Beta Decay
la source
2
Malheureusement, cette approche ne fonctionne pas. Pour n=2et s="1 2"cela donne 4 4, puisque replacemodifie le premier nombre deux fois. C'est le même problème auquel je suis confronté en ce moment avec Python 2 ...;)
Falko
@Falko J'ai réussi à résoudre le problème, bien que mon code soit plus long dans le processus
Beta Decay
Oh, bien joué! Quelques remarques mineures: m=input()vous ne sauvez rien. Et x=intest en fait 2 octets de plus que d'appeler int(...)deux fois.
Falko
2

Mathematica 71 61

Avec 10 caractères enregistrés grâce à Martin Buttner.

Les espaces dans le code sont pour la lisibilité.

fest une fonction dans laquelle se strouve la chaîne d'entrée et nest le nombre par lequel multiplier les nombres de chaînes découverts.

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

Exemples

 s="This 1 is22a 3352sentence 50"

Entier

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

"Ce 3 is66a 10056sentence 150"


Nombre rationnel

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

"Ce -7,13 est-156,86a -23899,8 phrase -356,5"


Nombre complexe

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

"Ce -5 + 3 I est-110 + 66 Ia -16760 + 10056 Isentence -250 + 150 I"

DavidC
la source
1
Je ne connais pas Mathematica. Mais dans vos exemples, tous les nombres et les mots sont séparés par des espaces. Cela fonctionne-t-il également pour les nombres directement attachés aux lettres, comme "abc42"?
Falko
Car StringReplacecela ne fait aucune différence qu'il y ait des espaces. J'ai utilisé les exemples initialement donnés par Chiperyman.
DavidC
Je suis passé à l'exemple mis à jour. (J'avais utilisé l'exemple donné plus tôt par Chiperyman.) Car StringReplacecela ne fait aucune différence s'il y a des espaces.
DavidC
2

Rubis 40

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

Entrée de stdin.

Exemple d'exécution:

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

Démo en ligne: http://ideone.com/4BiHC8

Cristian Lupascu
la source
2

Lua: 73 69 caractères

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

Exemple d'exécution:

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
homme au travail
la source
1
Vous pouvez jouer au golf un peu plus en mettant tout sur une seule ligne et en lisant les instructions à côté de ")". Comme "s = r () n = ()" est parfaitement bien.
AndoDaan
1
Doh, et j'ai lu Conseils pour jouer au golf à Lua il y a quelques semaines. :( Merci, @AndoDaan.
manatwork
2

JavaScript, ES6, 43 caractères

C'est ma première tentative de golf!

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

Exécutez cela dans la dernière console de Firefox. La première entrée est le nombre et la deuxième entrée est la chaîne à partir de laquelle les nombres doivent être multipliés par le premier numéro d'entrée.

L'invite finale répertorie la sortie.


la source
Très joli JS Golf pour un premier timer!
Optimizer
De nombreuses autres réponses pourraient être plus courtes si le numéro était lu en premier. C'était beaucoup plus facile.
manatwork
@manatwork - Oui, mais la question ne donne aucune préférence sur la commande, donc je pense que ça devrait aller.
Correct. C'est un manque de la question elle-même. Personnellement, j'ai préféré gérer les entrées dans l'ordre chaîne + numéro dans mes réponses pour les garder comparables aux autres.
manatwork
1

Perl - 48 caractères

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

Lisez un nombre sur la première ligne, puis lisez une phrase et divisez-la en morceaux de chiffres ou non. Imprimez les non chiffres tels quels et les nombres sont multipliés.

Tal
la source
1

J - 63 car

Le programme lit le numéro, puis la phrase.

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

Expliqué par l'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

Si nous arrivons à utiliser la bibliothèque PCRE de J et à faire passer la phrase en premier, nous pouvons réduire ce nombre à 54 caractères :

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

Expliqué par l'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 est mauvais à ça, que puis-je dire. C'est gênant parce que J est si non impératif.

Quelques exemples:

   ;(*&.".&(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
la source
1

CJam - 35

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

Essayez-le sur http://cjam.aditsu.net/

Exemple d'entrée:

7
CJ4M W1LL H4V3 R3GUL4R 3XPR35510N5 L4T3R

Exemple de sortie:

CJ28M W7LL H28V21 R21GUL28R 21XPR248570N35 L28T21R

Explication:

Le programme parcourt chaque caractère, collecte les chiffres sur la pile et pour chaque non-chiffre, il imprime d'abord le nombre collecté (le cas échéant) multiplié par l'entrée numérique, puis imprime le caractère.

li:X;lit l'entrée numérique et la stocke dans X
lN+lit la chaîne et ajoute une nouvelle ligne (cela aide avec les nombres à droite)
{…}/pour chaque caractère de la chaîne
- _scopie le caractère et convertit en chaîne
- A,s-,supprime tous les chiffres et compte les caractères restants; le résultat sera 0 si le caractère était un chiffre ou 1 sinon
- {…}*exécute le bloc si le compte était 1 (c'est-à-dire non numérique); pour les chiffres, il ne fait rien, donc ils restent sur la pile
- ]recueille les caractères de la pile dans un tableau (c'est-à-dire une chaîne); les caractères sont des chiffres des itérations précédentes, plus le caractère actuel
- )\sépare le dernier élément (le caractère actuel) et le déplace avant la chaîne (restante)
- _!!copie la chaîne et la convertit en une valeur booléenne - 0 si vide, 1 sinon
- {…}*exécute le bloc si la chaîne n'était pas vide, c'est-à-dire que nous avions quelques chiffres avant le caractère non numérique actuel
--- iX*convertit la chaîne en entier et multiplie par X
- oimprime le haut de la pile - soit le nombre multiplié soit la chaîne vide si nous n'avions pas de nombre
- o(le 2ème) imprime le nouveau haut de la pile - le caractère non numérique courant

aditsu
la source
C'est une approche beaucoup plus saine.
Dennis
1

Haskell (161)

Golfé

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}

Non golfé

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

Malheureusement, Haskell n'a pas de bibliothèque Regex dans son Prelude .

Zeta
la source
beau golf; vous auriez pu supprimer le plus extérieur {}pour un gain de 1 char. aussi, je viens de publier
proud haskeller
1

flex (-lexer) ( 94 89 caractères)

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

Version non golfée qui n'est pas défectueuse si vous oubliez l'argument de la ligne de commande (pas beaucoup plus longtemps):

%{
#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;
}

Compiler avec:

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

ou:

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

Par exemple:

$ ./m 163
This 1 is22a 3352sentence 50
This 163 is3586a 546376sentence 8150
rici
la source
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

Cliquez sur le titre pour voir l'exemple exécutable

Exemples essayés:

Cette 1 is22a 3352 phrase 50
3
Cette 3 is66a 10056 phrase 150


Cette 1 is22a 3352 phrase 50
42
Cette 42 is924a 140784 phrase 2100

Petit enfant
la source
0

GNU Awk: 86 caractères

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

Exemple d'exécution:

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
homme au travail
la source
0

PHP - 75/115 68/109

Deux versions, les versions php plus récentes peuvent le faire:

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

Versions php plus anciennes: je n'ai pas compté la nouvelle ligne, j'ai ajouté celles pour plus de lisibilité.

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

Exemple entrée + sortie

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

Un peu difficile, les mots «fonction» et «preg_replace_callback» prennent beaucoup de caractères.
L'espace après globalet returnn'est pas nécessaire s'il est suivi d'un $ var (-2 caractères)

Martijn
la source
Pas besoin de mettre \den classe de caractère (-2 caractères); pas besoin de mettre la fonction entre guillemets (-2 caractères); vous devez terminer correctement l'instruction à l'intérieur de la fonction avec un point-virgule (+1 caractère). Soit dit en passant, les \dchaînes entre guillemets doivent être écrites comme suit \\d, il vaut donc mieux changer les guillemets en guillemets simples.
manatwork
Merci. Commencé avec [0-9], remplacé 0-9par \ d. Je n'étais pas sûr des citations autour de la fonction, je ne peux pas tester celle-là, la version de mon php local ne le permet pas.
Martijn
Les guillemets doubles fonctionnent bien (au moins pour moi) :)
Martijn
0

C ( 142 134 caractères)

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

Nouvelle ligne insérée pour une meilleure lisibilité. Passez le facteur comme premier, la chaîne comme deuxième option de ligne de commande. Cette implémentation nécessite la dprintffonction qui fait partie de POSIX.1 2008 et peut ne pas être disponible sur Windows. Voici la source non minimisée:

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

Améliorations

  • 142 → 134: utilisez strspnet strcspnau lieu de boucler sur la chaîne.
FUZxxl
la source
0

Python 89

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

par exemple:

# python numberstring.py 3 '1shoop da2 w007p!'
3shoop da6 w21p!
Sammitch
la source
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


Non golfé:

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
la source
0

Clojure - 141 140 128 caractères

Je suis un débutant Clojure, mais FWIW:

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

Exemple d'exécution:

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

Non golfé (moche mais avec un peu de chance un peu plus facile à lire):

(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
la source
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
la source
0

Java 218

Quelqu'un devait faire du java. La chaîne d'entrée comprend 2 jetons sur la ligne de commande.

java M 'This 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
la source
1
Selon mon test, la ifcondition fonctionne également au niveau du bit |, qui est 1 caractère plus court.
manatwork
Merci. Code mis à jour. (Il s'agit en fait toujours d'un booléen ou, juste sans raccourci d'évaluation).
Florian F
0

Deux réponses: +

Bash pur (~ 262)

Tout d'abord, il existe une version bash pure pas si courte (pas de fork, pas de binaires externes)!

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
}

Montrons:

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

(Ce qui est une phrase totalement improbable)

Perl peu obscurci (pour le plaisir uniquement)

Cette version (basée sur la réponse de @ Chilemagic ) n'est pas plus courte, mais conçue comme un script totémique :

cat <<eof >mn.pl

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

eof chmod +x mn.pl

Exemple d'exécution:

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

Haskell, 70

dommage je suis trop tard à mon humble avis c'est assez bon pour cette question et cette langue spécifiques. l'autre solution Haskell contient 161 caractères.

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

cela fonctionne en utilisant la readsfonction qui analyse une chaîne partiellement. par exemple reads "34abc" = [(34, "abc")],. cela le rend évidemment parfait pour ce défi.

usage:

*Main> " This 1 is22a 3352sentence 50"%3
" This3 is66a10056sentence150"
fier haskeller
la source