Multiplica todos los números en una cadena

19

Ganador: Chilemagic , ¡21 bytes masivos!

Puede continuar enviando su respuesta, sin embargo, ya no puede ganar. Publicación original mantenida:


Su objetivo es encontrar todos los números en una cadena y multiplicar cada uno individualmente por un valor ingresado por el usuario

  • No tendrá que preocuparse por los decimales.
  • El usuario ingresará un número y una cadena
  • El usuario debe escribir el número y la cadena en algún momento, sin embargo , el método que lea el programa no importa. Puede ser con stdin, leer un archivo de texto, etc., sin embargo, el usuario debe presionar el botón 9 en su teclado (por ejemplo) en algún momento
  • Cualquier cosa que pueda compilarse y ejecutarse es aceptable

Ejemplo:

Ingreso de oraciones: Este 1 es 22a 3352 frase 50

Entrada de número: 3

Salida: Este 3 es66a 10056sentencia 150


  • Este concurso finaliza el 6 de septiembre de 2014 (7 días desde su publicación).
  • Este es un , por lo que gana el código más corto
Jon
fuente
Cualquier número debe ser multiplicado. Actualicé mi ejemplo.
Jon
No entiendo la importancia o el uso de "presione el botón 9" en su desafío. ¿Cómo o dónde se aplica en el ejemplo dado?
Darren Stone
3
@Darren Básicamente dice que no puedes codificar el número.
Beta Decay
2
¿Podemos hacer suposiciones sobre el tamaño de los números involucrados, particularmente la posibilidad de desbordamiento? Dependiendo de los resultados de lo anterior, ¿tratamos "-1234" como "-" seguido de 1234 o como -1234?
Alchymist
1
Para agregar a la pregunta de @ IlmariKaronen: ¿Qué hacer con los ceros a la izquierda como en "Bond es el agente 007" -> "Bond es el agente 21" o "Bond es el agente 0021" o "Bond es el agente 021" o ...?
Hagen von Eitzen

Respuestas:

24

Actualización - Perl - 17

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

15 caracteres + 2 para -iy -pbanderas.

Podemos usar el -iindicador para ingresar una extensión de archivo, pero como no estamos leyendo ningún archivo, podemos usarlo para obtener el número y la variable se $^Ile asignará.

Corre con:

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

Perl - 21

Actualizado según el comentario de @ Dennis.

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

Corre con -pbandera.

Ejemplo de ejecución:

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

Explicación:

$n=<>; leer en el número

-p imprime la salida

s/\d+/$&*$n/geLea la entrada con <> y busque uno o más dígitos y reemplácelos con los dígitos multiplicados por el número. ges global, ees evalla poción de reemplazo de la s ///. $&contiene lo que coincidió y se multiplicó por el número $n,.

Puede leer más acerca s///de perlop y más acerca de expresiones regulares de Perl en perlre .

Otra solución:

@ F.Hauri señaló que también puede usar el s interruptor para asignar la $nvariable a 4. No estoy seguro de cuántos caracteres cuenta, pero lo dejaré aquí:

perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'
hmatt1
fuente
Creo que podría guardar algunos caracteres más si los usa en <>=~lugar de _$=<>;. También, ¿podría explicar qué significa la sparte de la expresión regular, para nosotros los novatos?
Tal
@Tal cadena.
Kaz Wolfe
3
@Mew Estoy bastante seguro de que es por "sustitución"
Martin Ender
1
1. Si utiliza en $&lugar de $1, puede acortar (\d)a \d. 2. Si usa el -pinterruptor y cambia el orden de entrada, puede soltar say<>=~y r.
Dennis
1
Usted puede utilizar -sel interruptor, a whipe $n=<>a cabo: perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'(no render: This 4 is88a 13408sentence 200)
F. Hauri
9

JavaScript (ES6) - 48 44 caracteres

Gracias a @bebe por salvar un personaje. Actualización: 8 / Mar / 16, eliminó otros cuatro caracteres

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

Sin golf :

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

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

alert(sentence);

43 caracteres:

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

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

Requiere entrada de número primero y luego oración. Corta un char más aquí gracias @bebe otra vez!

Gaurang Tandon
fuente
no es necesario para ingresar el número de análisis
bebe
@bebe ¡Por supuesto! No me di cuenta! ¡Muchas gracias!
Gaurang Tandon
(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))otro (pero esto pide multiplicador primero)
bebe
@bebe ¡Gracias por esto también!
Gaurang Tandon
6

Pitón 2 (79)

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

Ejecución de la muestra

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

Demostración en línea: http://ideone.com/V6jpyQ

Cristian Lupascu
fuente
Brillante. Supongo que re.subes el método que Beta Decay y yo (las otras dos presentaciones de Python) intentamos reimplementar. Hubiera sido tan fácil ... ¡Algo más que he aprendido! ;)
Falko
@Falko a re.subun lado, has hecho un excelente trabajo jugando al golf en la lógica de reemplazo de la cuerda
Cristian Lupascu
@Falko Estoy de acuerdo, ¡ re.subes exactamente lo que quería!
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

Primera entrada: entero n.

Segunda entrada: cadena s(con comillas, por ejemplo "abc42").

Falko
fuente
4

CJam, 47 33 30 bytes

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

Lee el número y la cadena (en ese orden y separados por un solo espacio) de STDIN.

Pruébalo en línea.

Ejecución de ejemplo

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

Cómo funciona

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
fuente
¡Este es el fragmento de código más extraño que existe!
azerafati
1
@Bludream: Este ni siquiera es el código más extraño que he escrito . : P
Dennis
Hmm, 3 * 7 = 27?
aditsu
jajaja, sí votó por ambos. Aunque estos no van a hacer del mundo un lugar mejor. ¿Cómo demonios los lenguajes de programación que se supone que son legibles se convirtieron en esto?
azerafati
@aditsu: dividiendo vs iterando, la batalla continúa. : P
Dennis
4

Bash + coreutils, 38 bytes

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

Lee la cadena de entrada de STDIN y el multiplicador como un parámetro de línea de comandos.

Salida:

$ ./multstr.sh 3 <<< "This 1 is22a 3352sentence 50"
This 3 is66a 10056sentence 150
$ 
Trauma digital
fuente
66
Idea interesante, pero esto solo funcionará si la cadena no contiene caracteres especiales para Bash ... Este es un ejemplo de una cadena que no probaría:1 D4R3 Y0U: ; rm -rf /
Dennis
@ Dennis sí, esa es una advertencia bastante desafortunada
Digital Trauma
3

C # en LINQPad, 124

Sencillo. Utilice CTRL + 2 en LINQPad (Idioma: declaraciones de C #).

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

Si el multiplicador se da como primer parámetro de entrada, se puede hacer en 116 caracteres:

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

EDITAR:

Gracias al comentario de Abbas a continuación, incluso se puede jugar más al golf utilizando el método estático Regex , en lugar de instanciarlo:

var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int‌​.Parse(t.Value)*k).Dump();
Jacob
fuente
¡Bonito, el código de golf en C # no es fácil! No quiero obtener un representante de su esfuerzo, así que le daré una sugerencia en lugar de publicar mi propia respuesta: use Regex.Replace estático (string, string, string) en lugar de Regex nuevo ("...") .Reemplazar(...); Aquí está la versión corta multiplicador primero: var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int.Parse(t.Value)*k).Dump();. En ambas versiones, esto ahorra otros 5 caracteres, obteniendo 119 para la versión larga y 111 para la primera versión del multiplicador
Abbas
1
Gracias por el consejo, sin embargo, decidí no cambiar mi respuesta original, de modo que otros puedan aprender qué hacer y qué no hacer de mí, con respecto a C # Regex Golfing.
Jacob
Te entiendo, pero también puedes agregar mi consejo en tu respuesta como una edición . Los usuarios tienden a leer esto más de lo que lo harán con una lista de comentarios con sugerencias.
Abbas
Seguro. La respuesta fue editada.
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
fuente
2

Python 3 - 141

No creo que pueda jugar más 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)

Ejemplo:

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

10
hello100 hello100
hello1000 hello1000
Decaimiento Beta
fuente
2
Lamentablemente, este enfoque no funciona. Para n=2y s="1 2"rinde 4 4, ya que replacemodifica el primer número dos veces. Ese es el mismo problema que estoy enfrentando ahora con Python 2 ...;)
Falko
@Falko He logrado solucionar el problema, aunque alargué mi código en el proceso
Beta Decay
¡Oh bien hecho! Solo algunas observaciones menores: m=input()no te ahorra nada. Y en x=intrealidad es 2 bytes más largo que llamar int(...)dos veces.
Falko
2

Mathematica 71 61

Con 10 caracteres guardados gracias a Martin Buttner.

Los espacios en el código son para facilitar la lectura.

fes una función en la que se sencuentra la cadena de entrada y nes el número para multiplicar los números de cadena descubiertos por.

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

Ejemplos

 s="This 1 is22a 3352sentence 50"

Entero

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

"Este 3 es66a 10056sentencia 150"


Número racional

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

"Esta -7.13 es-156.86a -23899.8sentencia -356.5"


Número complejo

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

"Este -5 + 3 I es-110 + 66 Ia -16760 + 10056 Isentencia -250 + 150 I"

DavidC
fuente
1
No se Mathematica. Pero en sus ejemplos, todos los números y palabras están separados por espacios. ¿Funciona también para números directamente unidos a letras, como "abc42"?
Falko
Porque StringReplaceno importa si hay espacios. Usé los ejemplos dados originalmente por Chiperyman.
DavidC
Cambié al ejemplo actualizado. (Había usado el ejemplo dado anteriormente por Chiperyman). Porque StringReplaceno hay diferencia si hay espacios.
DavidC
2

Rubí 40

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

Entrada de stdin.

Ejemplo de ejecución:

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

Demostración en línea: http://ideone.com/4BiHC8

Cristian Lupascu
fuente
2

Lua: 73 69 caracteres

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

Ejecución de muestra:

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
hombre trabajando
fuente
1
Puedes jugar un poco más al golf poniendo todo en una línea y siguiendo las instrucciones junto a ")". Como "s = r () n = ()" está perfectamente bien.
AndoDaan
1
Doh, y leí Consejos para jugar golf en Lua hace solo un par de semanas. :( Gracias, @AndoDaan.
manatwork
2

JavaScript, ES6, 43 caracteres

Este es mi primer intento de jugar al golf!

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

Ejecuta esto en la última consola de Firefox. La primera entrada es el número y la segunda entrada es la cadena a partir de la cual se multiplicarán los números con el primer número de entrada.

El mensaje final enumera la salida.


fuente
Bastante agradable JS Golf por primera vez!
Optimizador
Muchas otras respuestas podrían ser más cortas si el número se leyó primero. Eso fue mucho más fácil.
manatwork
@manatwork: Sí, pero la pregunta no da preferencia en el pedido, por lo que creo que debería estar bien.
Correcto. Esto es una falta de la pregunta en sí. Personalmente, preferí manejar la entrada en orden de cadena + número en mis respuestas para mantenerlos comparables con los demás.
manatwork
1

Perl - 48 caracteres

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

Lea un número en la primera línea, luego lea una oración y divídala en trozos de dígitos o no dígitos. Imprima los no dígitos como están, y los números se multiplican.

Tal
fuente
1

J - 63 char

El programa lee el número y luego la oración.

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

Explicado por explosión:

;(*&.".&(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 podemos usar la biblioteca PCRE de J y hacer que la oración sea lo primero, podemos reducir esto a 54 caracteres :

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

Explicado por explosión:

                                                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 es malo en esto, ¿qué puedo decir? Es un inconveniente porque J es tan poco motivador.

Algunos ejemplos:

   ;(*&.".&(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
Algoritmo de tiburón
fuente
1

CJam - 35

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

Pruébalo en http://cjam.aditsu.net/

Entrada de muestra:

7
CJ4M W1LL H4V3 R3GUL4R 3XPR35510N5 L4T3R

Salida de muestra:

CJ28M W7LL H28V21 R21GUL28R 21XPR248570N35 L28T21R

Explicación:

El programa revisa cada carácter, recolecta los dígitos en la pila, y para cada no dígito imprime primero el número recolectado (si lo hay) multiplicado por la entrada numérica, luego imprime el carácter.

li:X;lee la entrada numérica y la almacena en X
lN+lee la cadena y agrega una nueva línea (ayuda con los números finales)
{…}/para cada carácter de la cadena
, _scopia el carácter y lo convierte en cadena
, A,s-,elimina todos los dígitos y cuenta los caracteres restantes; el resultado será 0 si el carácter era un dígito o 1 si no
: {…}*ejecuta el bloque si el recuento era 1 (es decir, sin dígito); para los dígitos no hace nada, por lo que permanecen en la pila
: ]recoge los caracteres de la pila en una matriz (es decir, una cadena); los caracteres son dígitos de las iteraciones anteriores, más el carácter actual
: )\separa el último elemento (el carácter actual) y lo mueve antes de la cadena (restante)
- _!!copia la cadena y la convierte en un valor booleano - 0 si está vacío, 1 si no
- {…}*ejecuta el bloque si la cadena no estaba vacía, es decir, teníamos algunos dígitos antes del carácter actual sin dígitos
--- iX*convierte la cadena a entero y multiplica por X
- oimprime la parte superior de la pila - ya sea el número multiplicado o la cadena vacía si no teníamos un número
- o(el segundo) imprime la nueva parte superior de la pila - el actual no carácter de dígitos

aditsu
fuente
Ese es un enfoque mucho más sensato.
Dennis
1

Haskell (161)

Golfed

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}

Sin 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

Desafortunadamente, Haskell no tiene una biblioteca Regex en su Preludio .

Zeta
fuente
buen golf; podrías haber eliminado el más externo {}para obtener 1 char. Además, acabo de publicar esta solución Haskell con 70 bytes: codegolf.stackexchange.com/questions/37110/…
orgullosa haskeller
1

flex (-lexer) ( 94 89 caracteres)

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

Versión sin golf que no falla por defecto si olvida el argumento de la línea de comandos (no mucho más):

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

Compilar con:

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

o:

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

P.ej:

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

Haga clic en el título para ver el ejemplo ejecutable

Ejemplos probados:

Esta 1 es 22a 3352secuencia 50
3
Esta 3 es66a 10056sentencia 150


Esta 1 es 22a 3352secuencia 50
42
Esta 42 es924a 140784secuencia 2100

Niño pequeño
fuente
0

GNU Awk: 86 caracteres

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

Ejecución de muestra:

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
hombre trabajando
fuente
0

PHP - 75/115 68/109

Dos versiones, las nuevas versiones de php pueden hacer esto:

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

Versiones anteriores de php: no conté la nueva línea, agregué las de legibilidad.

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

Ejemplo de entrada + salida

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

Un poco difícil, las palabras 'función' y 'preg_replace_callback' ocupan muchos caracteres.
El espacio después globaly returnno son necesarios si va seguido de $ var (-2 caracteres)

Martijn
fuente
No es necesario poner \den la clase de caracteres (-2 caracteres); no es necesario encerrar la función entre comillas dobles (-2 caracteres); debe terminar correctamente la declaración dentro de la función con punto y coma (+1 char). Por cierto, \den una cadena con comillas dobles debe escribirse como \\d, así que mejor cambie las comillas a comillas simples.
manatwork
Gracias. Comenzó con [0-9], cambió 0-9a \ d. No estaba seguro acerca de las comillas alrededor de la función, no puedo probar eso, la versión de mi php local no lo permite.
Martijn
Las comillas dobles funcionan bien (al menos para mí) :)
Martijn
0

C ( 142134 caracteres)

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

Nueva línea insertada para mayor legibilidad. Pase el factor como el primero, la cadena como la segunda opción de línea de comando. Esta implementación requiere la dprintffunción que forma parte de POSIX.1 2008 y podría no estar disponible en Windows. Aquí está la fuente no minificada:

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

Mejoras

  • 142 → 134: Use strspny en strcspnlugar de recorrer la cadena.
FUZxxl
fuente
0

Python 89

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

p.ej:

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


Sin 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
fuente
0

Clojure - 141 140 128 caracteres

Soy un novato de Clojure, pero FWIW:

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

Ejecución de muestra:

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

Ungolfed (feo pero con suerte algo más fácil de leer):

(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
fuente
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
fuente
0

Java 218

Alguien tuvo que hacer Java. La cadena de entrada son 2 tokens en la línea de comando.

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
fuente
1
Según mi prueba, la ifcondición también funciona con bit a bit |, que es 1 carácter más corto.
manatwork
Gracias. Código actualizado (En realidad, sigue siendo un booleano o, simplemente, sin acceso directo de evaluación).
Florian F
0

Dos respuesta: +

Golpe puro (~ 262)

Primero, ¡hay una versión de bash pura no tan corta (sin fork, sin binarios externos)!

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
}

Vamos a mostrar:

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

(Que es una oración totalmente improbable)

Perl poco ofuscado (solo por diversión)

Esta versión (basada en la respuesta de @ Chilemagic ) no es más corta, sino que está diseñada como un script de tótem :

cat <<eof >mn.pl

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

eof chmod +x mn.pl

Ejecución de muestra:

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

Haskell, 70

lástima, llego tarde, en mi humilde opinión, esto es bastante bueno para esta pregunta y lenguaje específicos. La otra solución de Haskell aquí es de 161 caracteres.

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

esto funciona mediante el uso de la readsfunción que analiza una cadena parcialmente. por ejemplo reads "34abc" = [(34, "abc")],. Obviamente, esto lo hace perfecto para este desafío.

uso:

*Main> " This 1 is22a 3352sentence 50"%3
" This3 is66a10056sentence150"
orgulloso Haskeller
fuente