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.