Multiplique todos os números em uma sequência


19

Vencedor: Chilemagic , um enorme 21 bytes!

Você pode continuar enviando sua resposta, mas não poderá mais vencer. Postagem original mantida:


Seu objetivo é encontrar todos os números em uma sequência e multiplicar cada um individualmente por um valor inserido pelo usuário

  • Você não precisará se preocupar com decimais
  • O usuário irá inserir um número e uma string
  • O usuário deve digitar o número e a string em algum momento; no entanto , o método que o programa lê não importa. Pode ser com stdin, lendo um arquivo de texto, etc., no entanto, o usuário deve pressionar o botão 9 no teclado (por exemplo) em algum momento
  • Qualquer coisa que possa compilar e executar é aceitável

Exemplo:

Entrada da frase: esta 1 is22a 3352sentença 50

Número de entrada: 3

Saída: Esta 3 is66a 10056sentença 150


  • Este concurso termina em 6 de setembro de 2014 (7 dias após a publicação).
  • Este é um , então o código mais curto vence

Qualquer número deve ser multiplicado. Eu atualizei meu exemplo.
— Jon

Não entendo o significado ou o uso de "pressione o botão 9" em seu desafio. Como ou onde se aplica no exemplo dado?
— Darren Pedra

3
@ Darren Ele está basicamente dizendo que você não pode codificar o número.
— Decay Beta

2
Podemos fazer suposições sobre o tamanho dos números envolvidos, particularmente a possibilidade de transbordamento? Dependendo dos resultados acima, tratamos "-1234" como "-" seguido por 1234 ou como -1234?
— Alchymist

11
Para adicionar à pergunta de @ IlmariKaronen: O que fazer com zeros à esquerda como em "Bond é o agente 007" -> "Bond é o agente 21" ou "Bond é o agente 0021" ou "Bond é o agente 021" ou ...?
— Hagen von Eitzen

Respostas:


24

Atualização - Perl - 17

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

15 caracteres + 2 para -ie -psinalizadores.

Podemos usar o -isinalizador para inserir uma extensão de arquivo, mas como não estamos lendo nenhum arquivo, podemos usá-lo para obter o número e a variável $^Iserá atribuída a ele.

Correr com:

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

Perl - 21

Atualizado conforme o comentário de @ Dennis.

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

Corra com a -pbandeira.

Exemplo de execução:

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

Explicação:

$n=<>; leia o número

-p imprime a saída

s/\d+/$&*$n/geLeia a entrada com <> e procure um ou mais dígitos e substitua-os pelos dígitos vezes o número. gé global, eé evala poção de substituição do s ///. $&contém o que foi correspondido e multiplicado pelo número $n,.

Você pode ler mais sobre s///no perlop e mais sobre Perl expressões regulares em perlre .

Outra solução:

@ F.Hauri apontou que você também pode usar a s opção para atribuir a $nvariável a 4. Não sei quantos caracteres isso conta, mas vou deixar aqui:

perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'

Eu acho que você poderia salvar mais alguns caracteres usando em <>=~vez de _$=<>;. Você também poderia explicar o significado da sparte da regex para nós, novatos?
— Tal

@Tal cadeia.
— Kaz Wolfe

3
@Mew eu tenho certeza que é para "substituição"
— Martin Ender

11
1. Se você usar em $&vez de $1, poderá reduzir (\d)para \d. 2. Se você usar o -pcomutador e alterar a ordem de entrada, poderá soltar say<>=~e r.
— Dennis

11
Você pode usar -sswitch, para whipe $n=<>out: perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'(não render: This 4 is88a 13408sentence 200)
— F. Hauri

9

JavaScript (ES6) - 48 44 caracteres

Obrigado a @bebe por salvar um caractere. Atualização: 8 / Mar / 16, removidos outros quatro caracteres

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 caracteres:

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

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

Requer entrada de número primeiro e depois sentença. Corte um char mais aqui, obrigado @bebe novamente!


você não precisa de introdução de números de análise
— bebe

@bebe Claro! Eu não percebi! Muito obrigado!
— Gaurang Tandon

(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))outro (mas esta pede multiplicador primeiro)
— bebe

@bebe Obrigado por isso também!
— Gaurang Tandon

6

Python 2 (79)

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

Amostra de execução

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

Demonstração on-line: http://ideone.com/V6jpyQ


Brilhante. Eu acho que re.subé o método Beta Decay e eu (os outros dois envios de Python) estávamos tentando reimplementar. Teria sido tão fácil ... Outra coisa que eu aprendi! ;)
— Falko

@Falko re.sublado, você fez um excelente trabalho no golfe o texto de substituição lógica
— Cristian Lupascu

@ Falko, eu concordo, re.subé exatamente o que eu queria!
— 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

Primeira entrada: inteiro n.

Segunda entrada: string s(com aspas, por exemplo "abc42").


4

CJam, 47 33 30 bytes

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

Lê o número e a sequência (nessa ordem e separados por um único espaço) de STDIN.

Experimente online.

Exemplo de execução

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

Como 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.     ";

Este é o código mais estranho de todos os tempos !!!
— Azerafati

11
@ Bludream: Este não é o código mais estranho que eu já escrevi . : P
— Dennis

Hmm, 3 * 7 = 27?
— Aditsu 31/08/14

lol, sim votou em ambos. Embora estes não façam do mundo um lugar melhor. Como as linguagens de programação terrestres que deveriam ser legíveis se transformaram nisso?
— azerafati

@aditsu: Dividindo vs repetindo, a batalha continua. : P
— Dennis

4

Bash + coreutils, 38 bytes

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

Lê a string de entrada de STDIN e o multiplicador como um parâmetro da linha de comandos.

Resultado:

$ ./multstr.sh 3 <<< "This 1 is22a 3352sentence 50"
This 3 is66a 10056sentence 150
$ 

6
Idéia interessante, mas isso só funcionará se a string não qualquer conter caracteres que são especiais para Bash ... Este é um exemplo de uma cadeia que eu não iria tentar:1 D4R3 Y0U: ; rm -rf /
— Dennis

@ Dennis sim que é uma advertência bastante infeliz
— Digital Trauma

3

C # no LINQPad, 124

Direto. Por favor, use CTRL + 2 no LINQPad (Language: C # Statements).

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

Se o multiplicador for dado como primeiro parâmetro de entrada, isso poderá ser feito em 116 caracteres:

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

EDITAR:

Graças ao comentário de Abbas abaixo, isso pode ser ainda mais aproveitado usando o método estático Regex , em vez de instancia-lo:

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

Bom, código-golfe em C # não é fácil! Não quero obter um representante do seu esforço, por isso fornecerei uma dica em vez de postar minha própria resposta: use o Regex estático.Replace (string, string, string) em vez do novo Regex ("...") .Substituir(...); Aqui está a versão curta multiplicador-primeiro: var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int.Parse(t.Value)*k).Dump();. Em ambas as versões isso economiza mais 5 caracteres, você ficar em 119 para a versão de comprimento e 111 para a versão multiplicador-primeiro
— Abbas

11
Obrigado pela dica, no entanto, decidi não alterar minha resposta original, para que outras pessoas possam aprender o que não fazer comigo e o que fazer com você - sobre o C # Regex Golfing.
— Jacob

Entendo você, mas você também pode adicionar minha dica na sua resposta como uma edição . Os usuários tendem a ler isso mais do que uma lista de comentários com dicas.
— Abbas

Certo. A resposta foi 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]")

2

Python 3-141

Acho que não posso mais jogar golfe ...

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)

Exemplo:

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

10
hello100 hello100
hello1000 hello1000

2
Infelizmente, essa abordagem não funciona. Para n=2e s="1 2"produz 4 4, uma vez que replacemodifica o primeiro número duas vezes. Esse é o mesmo problema que estou enfrentando agora com Python 2 ...;)
— Falko

@Falko eu consegui resolver o problema, embora fazendo o meu código mais no processo
— Beta Decay

Oh, muito bem! Apenas algumas pequenas observações: m=input()você não economiza nada. E x=inté na verdade 2 bytes mais longo do que chamar int(...)duas vezes.
— Falko

2

Mathematica 71 61

Com 10 caracteres salvos, graças a Martin Buttner.

Os espaços no código são para facilitar a leitura.

fé uma função na qual sé a sequência de entrada e né o número pelo qual multiplicar os números de sequência descobertos.

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

Exemplos

 s="This 1 is22a 3352sentence 50"

Inteiro

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

"Esta 3 is66a 10056sentença 150"


Número racional

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

"Esta -7,13 é-156,86a -23899,8sentença -356,5"


Número complexo

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

"Este -5 + 3 I é-110 + 66 Ia -16760 + 10056 Isenção -250 + 150 I"


11
Eu não conheço o Mathematica. Mas nos seus exemplos todos os números e palavras são separados por espaços. Funciona também para números diretamente anexados às letras, como "abc42"?
— Falko

Pois StringReplacenão faz diferença se existem espaços. Eu usei os exemplos originalmente dados por Chiperyman.
— 31414

Eu mudei para o exemplo atualizado. (Eu tinha usado o exemplo dado anteriormente por Chiperyman.) Pois StringReplacenão faz diferença se existem espaços.
— 31414

2

Ruby 40

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

Entrada de stdin.

Exemplo de execução:

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

Demonstração on-line: http://ideone.com/4BiHC8


2

Lua: 73 69 caracteres

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

Exemplo de execução:

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

11
Você pode jogar um pouco mais, colocando tudo em uma linha e instruindo as instruções ao lado de ")". Como "s = r () n = ()" está perfeitamente correto.
— AndoDaan

11
Doh, e eu li Dicas para jogar golfe em Lua apenas algumas semanas atrás. :( Obrigado, @AndoDaan.
— manatwork

2

JavaScript, ES6, 43 caracteres

Esta é a minha primeira tentativa de jogar golfe!

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

Execute isso no console mais recente do Firefox. A primeira entrada é o número e a segunda entrada é a sequência a partir da qual os números devem ser multiplicados pelo primeiro número de entrada.

O prompt final lista a saída.


JS Golf bastante agradável para um primeiro temporizador!
— Optimizer

Muitas outras respostas poderiam ser mais curtas se o número fosse lido primeiro. Isso foi muito mais fácil.
— manatwork

@ manatwork - Sim, mas a pergunta não dá nenhuma preferência ao pedido, então acho que deve estar bem.

Corrigir. Esta é uma falta da própria pergunta. Pessoalmente, eu preferi lidar com a entrada na seqüência de caracteres + ordem do número em minhas respostas para mantê-las comparáveis ​​com as outras.
— manatwork

1

Perl - 48 caracteres

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

Leia um número na primeira linha, depois leia uma frase e divida-a em pedaços de dígitos ou não. Imprima os não dígitos como estão e os números serão multiplicados.


1

J - 63 char

O programa lê o número e a frase.

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

Explicado por explosão:

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

Se usarmos a biblioteca PCRE de J e fizermos a frase primeiro, podemos reduzir para 54 caracteres :

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

Explicado por explosão:

                                                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 é ruim nisso, o que posso dizer. É um inconveniente, porque J é tão imperativo.

Alguns exemplos:

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

1

CJam - 35

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

Experimente em http://cjam.aditsu.net/

Entrada de amostra:

7
CJ4M W1LL H4V3 R3GUL4R 3XPR35510N5 L4T3R

Saída de amostra:

CJ28M W7LL H28V21 R21GUL28R 21XPR248570N35 L28T21R

Explicação:

O programa percorre cada caractere, coletando os dígitos na pilha e, para cada não dígito, primeiro imprime o número coletado (se houver) multiplicado pela entrada numérica e depois imprime o caractere.

li:X;lê a entrada numérica e a armazena em X
lN+lê a string e anexa uma nova linha (ajuda com números à direita)
{…}/para cada caractere na string
- _scopia o caractere e converte em string
- A,s-,remove todos os dígitos e conta os caracteres restantes; o resultado será 0 se o caractere for um dígito ou 1 se não
- {…}*executa o bloco se a contagem for 1 (ou seja, não dígito); para dígitos, não faz nada, então eles permanecem na pilha
- ]coleta os caracteres da pilha em uma matriz (isto é, uma string); os caracteres são quaisquer dígitos das iterações anteriores, mais o caractere atual
- )\separa o último item (o caractere atual) e o move antes da string (restante)
- _!!copia a string e a converte em um valor booleano - 0 se vazio, 1 se não
- {…}*executa o bloco se a string não estiver vazia, ou seja, tivemos alguns dígitos antes do caractere não dígito atual
--- iX*converte a string para inteiro e multiplica por X
- oimprime a parte superior da pilha - o número multiplicado ou a sequência vazia, se não tivermos um número
- o(a segunda) imprime a nova parte superior da pilha - a não atual caractere de dígito


Essa é uma abordagem muito mais saudável.
— Dennis

1

Haskell (161)

Golfe

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

Infelizmente, Haskell não tem uma biblioteca Regex em seu Prelude .


bom golfe; você poderia ter excluído o mais externo {}para um ganho de 1 caractere. Além disso, eu só postou esta solução Haskell com 70 bytes: codegolf.stackexchange.com/questions/37110/...
— haskeller orgulhoso

1

flex (-lexer) ( 94 89 caracteres)

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

Versão ungolfed que não falha automaticamente se você esquecer o argumento da linha de comando (não muito mais):

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

Ajuntar com:

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

Por exemplo:

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

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

Clique no título para ver o exemplo executável

Exemplos tentados:

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


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


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}

Exemplo de execução:

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

0

PHP - 75/115 68/109

Duas versões, versões mais recentes do php, podem fazer isso:

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

Versões mais antigas de php: eu não contei a nova linha, as adicionei para facilitar a leitura.

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

Exemplo de entrada + saída

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

Meio difícil, as palavras 'function' e 'preg_replace_callback' ocupam muitos caracteres.
O espaço após globale returnnão é necessário se seguido por um $ var (-2 caracteres)


Não há necessidade de colocar \dna classe de caracteres (-2 caracteres); não há necessidade de colocar a função entre aspas duplas (-2 caracteres); você precisa finalizar corretamente a instrução dentro da função com ponto e vírgula (+1 caractere). By the way, \dna cadeia de citação dupla deve ser escrito como \\d, para melhor mudar as aspas para aspas simples.
— Manatwork

Obrigado. Iniciado com [0-9], alterado 0-9para \ d. Não tinha certeza das aspas em torno da função, não posso testar essa, a versão do meu php local não permite.
— Martijn

A multa dupla citações de trabalho (pelo menos para mim) :)
— Martijn

0

C ( 142 134 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));}

Nova linha inserida para maior legibilidade. Passe o fator como o primeiro, a string como a segunda opção de linha de comando. Esta implementação requer a dprintffunção que faz parte do POSIX.1 2008 e pode não estar disponível no Windows. Aqui está a fonte não 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);
    }
}

Melhorias

  • 142 → 134: Use strspne, em strcspnvez de dar laços na corda.

0

Python 89

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

por exemplo:

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

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

0

Clojure - 141 140 128 caracteres

Eu sou um novato Clojure, mas FWIW:

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

Exemplo de execução:

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

Ungolfed (feio, mas espero um pouco mais fácil de ler):

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

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]!=''])

0

Java 218

Alguém tinha que fazer java. A sequência de entrada é de 2 token na linha 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);
    }
}

11
De acordo com o meu teste, a ifcondição também funciona com bit a bit |, que é 1 caractere menor.
— manatwork

Obrigado. Código atualizado. (Na verdade, ainda é um booleano ou, apenas sem atalho de avaliação).
— Florian F

0

Resposta dois: +

Festa pura (~ 262)

Primeiro, existe uma versão do bash pura e não tão curta (sem bifurcação, sem binários 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 mostrar:

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

(Que é uma frase totalmente improvável)

Perl pouco ofuscado (apenas por diversão)

Esta versão (baseada na resposta de @ Chilemagic ) não é mais curta, mas foi projetada como um script de totem :

cat <<eof >mn.pl

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

eof chmod +x mn.pl

Exemplo de execução:

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

0

Haskell, 70

Pena que eu estou muito atrasado IMHO isso é muito bom para esta pergunta e linguagem específica. a outra solução Haskell aqui tem 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

isso funciona usando a readsfunção que analisa parcialmente uma string. por exemplo reads "34abc" = [(34, "abc")],. obviamente isso é perfeito para esse desafio.

uso:

*Main> " This 1 is22a 3352sentence 50"%3
" This3 is66a10056sentence150"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.