Умножьте все числа в строке

19

Победитель: Chilemagic , массивный 21 байт!

Вы можете продолжить отправлять свой ответ, однако вы больше не можете выиграть. Исходное сообщение сохранилось:


Ваша цель - найти все числа в строке и умножить каждое по отдельности на значение, введенное пользователем.

  • Вам не нужно беспокоиться о десятичных дробях
  • Пользователь введет число и строку
  • Пользователь должен ввести число и строку в какой-то момент, однако метод, который читает программа, не имеет значения. Это может быть стандартный ввод, чтение текстового файла и т. Д., Однако пользователь должен нажать кнопку 9 на клавиатуре (например) в какой-то момент
  • Все, что можно скомпилировать и запустить, приемлемо

Пример:

Ввод предложения: Это 1 is22a 3352sentence 50

Ввод числа: 3

Вывод: это 3 is66a 10056sentence 150


  • Этот конкурс заканчивается 6 сентября 2014 года (7 дней с момента публикации).
  • Это , поэтому выигрывает самый короткий код
Джон
источник
Любое число должно быть умножено. Я обновил свой пример.
Джон
Я не понимаю значение или использование «нажмите кнопку 9» в вашем вызове. Как или где это применимо в приведенном примере?
Даррен Стоун
3
@Darren Он в основном говорит, что вы не можете жестко закодировать номер.
Бета-распад
2
Можем ли мы сделать предположения о размере задействованных чисел, особенно о возможности переполнения? В зависимости от результатов вышеупомянутого, мы рассматриваем «-1234» как «-», сопровождаемый 1234 или как -1234?
Алхимик
1
Чтобы добавить к вопросу @ IlmariKaronen: Что делать с ведущими нулями, как в «Бонд является агентом 007» -> «Бонд является агентом 21» или «Бонд является агентом 0021» или «Бонд является агентом 021» или ...?
Хаген фон Айцен

Ответы:

24

Обновление - Perl - 17

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

15 символов + 2 для -iи -pфлаги.

Мы можем использовать -iфлаг для ввода расширения файла, но поскольку мы не читаем никаких файлов, мы можем использовать его для получения номера, и переменная $^Iбудет присвоена ему.

Бежать с:

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

Perl - 21

Обновлено в соответствии с комментарием @ Деннис.

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

Беги с -pфлагом.

Пример выполнения:

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

Объяснение:

$n=<>; читать по номеру

-p печатает вывод

s/\d+/$&*$n/geПрочитайте ввод с помощью <>, найдите одну или несколько цифр и замените их цифрами, умноженными на число. gявляется глобальным, eявляется evalзаменой зелья s ///. $&содержит то, что было найдено и умножено на число $n.

Вы можете прочитать больше о s///в perlop и больше о Perl регулярных выражений в perlre .

Другое решение:

@ F.Hauri указал, что вы также можете использовать s переключатель для присвоения $nпеременной 4. Я не уверен, сколько символов это считается, но я оставлю это здесь:

perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'
hmatt1
источник
Я думаю, что вы можете сохранить еще несколько символов, используя <>=~вместо _$=<>;. Также не могли бы вы объяснить, что значит sчасть регулярного выражения для нас, новичков?
Тал
@Tal Строка.
Kaz Wolfe
3
@ Мью, я почти уверен, что это для "замены"
Мартин Эндер
1
1. Если вы используете $&вместо $1, вы можете сократить (\d)до \d. 2. Если вы используете -pпереключатель и измените порядок ввода, вы можете удалить say<>=~и r.
Деннис
1
Вы можете использовать -sпереключатель, чтобы whipe $n=<>из: perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'(действительно делают: This 4 is88a 13408sentence 200)
F. Hauri
9

JavaScript (ES6) - 48 44 символов

Спасибо @bebe за сохранение одного символа. Обновление: 8 марта / 16, удалены еще четыре символа

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 символа:

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

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

Требуется ввод числа, а затем предложение. Вырежьте еще один символ здесь, спасибо @bebe снова!

Гауранг Тандон
источник
вам не нужно анализировать ввод числа
bebe
@bebe Конечно! Я не заметил! Большое спасибо!
Гауранг Тандон
(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))еще один (но это сначала требует множителя)
bebe
@bebe Спасибо за это тоже!
Гауранг Тандон
6

Python 2 (79)

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

Пробный прогон

Входные данные:
$ python mult.py
3
"This 1 is22a 3352sentence 50"
Выход:
This 3 is66a 10056sentence 150

Демо онлайн: http://ideone.com/V6jpyQ

Кристиан Лупаску
источник
Brilliant. Я предполагаю re.sub, что метод Beta Decay и я (два других представления Python) пытались переопределить. Это было бы так легко ... Что-то еще, что я узнал! ;)
Фалько
@ Фалько re.sub, ты отлично справился с логикой замены струн
Кристиан Лупаску,
@ Фалько Я согласен, re.subэто именно то, что я хотел!
бета-распад
4

Питон 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

Первый вход: целое число n.

Второй ввод: строка s(с кавычками, например "abc42").

Фалько
источник
4

CJam, 47 33 30 байт

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

Считывает число и строку (в том порядке и через один пробел) из STDIN.

Попробуйте онлайн.

Пример запуска

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

Как это устроено

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.     ";
Деннис
источник
Это самый странный кусок кода когда-либо !!!
Азерафати
1
@Bludream: Это даже не самый странный код, который я написал . : P
Деннис
Хм, 3 * 7 = 27?
aditsu
лол, да, проголосовал за оба. Хотя это не сделает мир лучше. Как на земле языки программирования, которые должны быть читабельными, превратились в это ??
Азерафати
@aditsu: Раскол против итерации, битва продолжается. : P
Деннис
4

Bash + coreutils, 38 байт

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

Читает входную строку из STDIN и множитель в качестве параметра командной строки.

Выход:

$ ./multstr.sh 3 <<< "This 1 is22a 3352sentence 50"
This 3 is66a 10056sentence 150
$ 
Цифровая травма
источник
6
Интересная идея, но это будет работать только в том случае, если строка не содержит символов, характерных для Bash ... Это пример строки, которую я бы не стал использовать :1 D4R3 Y0U: ; rm -rf /
Деннис
@ Денис: да, это довольно неприятное предупреждение
Digital Trauma
3

C # в LINQPad, 124

Непосредственная. Пожалуйста, используйте CTRL + 2 в LINQPad (язык: C # Statements).

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

Если в качестве первого входного параметра указан множитель, это можно сделать из 116 символов:

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

РЕДАКТИРОВАТЬ:

Благодаря приведенному ниже комментарию Аббаса, это может быть даже лучше, если использовать статический метод Regex , а не создавать его:

var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int‌​.Parse(t.Value)*k).Dump();
Иаков
источник
Хороший, код-гольф в C # не так просто! Я не хочу получать репутацию от ваших усилий, поэтому я дам вам совет вместо публикации своего собственного ответа: используйте статический Regex.Replace (string, string, string) вместо нового Regex ("...") .Надеть (...); Вот короткий множитель первого варианта: var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int.Parse(t.Value)*k).Dump();. В обеих версиях это сохраняет еще 5 символов, что дает вам 119 для длинной версии и 111 для версии с множителем
Abbas
1
Спасибо за совет, однако, я решил не менять свой первоначальный ответ, чтобы другие могли узнать, что мне нельзя делать, а что вам делать - в отношении C # Regex Golfing.
Джейкоб
Я вас понимаю, но вы также можете добавить мой отзыв в свой ответ в качестве правки . Пользователи склонны читать это больше, чем список комментариев с советами.
Аббас
Конечно. Ответ был отредактирован.
Джейкоб
2

Кобра - 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
источник
2

Питон 3 - 141

Я не думаю, что смогу больше играть в гольф ...

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)

Пример:

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

10
hello100 hello100
hello1000 hello1000
Бета распад
источник
2
К сожалению, этот подход не работает. Для n=2и s="1 2"это дает 4 4, так как replaceизменяет первое число дважды. Это та же проблема, с которой я сталкиваюсь сейчас с Python 2 ...;)
Falko
@ Фалько Мне удалось решить эту проблему, хотя в процессе мой код стал длиннее
Beta Decay
О, молодец! Несколько замечаний: m=input()ничего не спасет. И x=intна самом деле на 2 байта длиннее, чем вызов в int(...)два раза.
Фалько
2

Mathematica 71 61

Благодаря 10 символам сэкономлено благодаря Мартину Буттнеру.

Пробелы в коде предназначены для удобства чтения.

fявляется функцией, в которой вводится sстрока и nявляется числом, на которое умножаются обнаруженные номера строк.

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

Примеры

 s="This 1 is22a 3352sentence 50"

целое число

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

«Это 3 is66a 10056sentence 150»


Рациональное число

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

«Это -7,13 -156,86a -23899,8 предложение -356,5»


Комплексное число

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

«Это -5 + 3 I-110 + 66 Ia -16760 + 10056 Isentence -250 + 150 I»

DavidC
источник
1
Я не знаю Mathematica. Но в ваших примерах все числа и слова разделены пробелами. Работает ли это для чисел, непосредственно прикрепленных к буквам, например, «abc42»?
Фалько
Ибо StringReplaceне имеет значения, есть ли пробелы. Я использовал примеры, приведенные Chiperyman.
DavidC
Я перешел на обновленный пример. (Я использовал пример, приведенный ранее Чипериманом.) Поскольку StringReplaceне имеет значения, есть ли пробелы.
DavidC
2

Рубин 40

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

Ввод от стандартного ввода.

Пример выполнения:

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

Демо онлайн: http://ideone.com/4BiHC8

Кристиан Лупаску
источник
2

Lua: 73 69 символов

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

Образец прогона:

bash-4.3$ lua -e 'r=io.read;s=r()n=r()s=s:gsub("%d+",function(m)return m*n end)print(s)' <<< $'This 1 is22a 3352sentence 50\n3'
This 3 is66a 10056sentence 150
manatwork
источник
1
Вы можете играть в гольф немного больше, поместив все в одну строку, и добавив инструкции «)». Как и "s = r () n = ()" прекрасно.
AndoDaan
1
До, и я прочитал Советы по игре в гольф в Луа всего пару недель назад. :( Спасибо, @AndoDaan.
manatwork
2

JavaScript, ES6, 43 символа

Это моя первая попытка игры в гольф!

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

Запустите это в последней консоли Firefox. Первый ввод - это число, а второй ввод - это строка, из которой числа должны быть умножены на первый ввод.

Последнее приглашение отображает вывод.


источник
Довольно хороший JS Golf для первого таймера!
Оптимизатор
Многие другие ответы могут быть короче, если сначала прочитать число. Это было намного проще.
Манатворк
@manatwork - Да, но вопрос не отдает предпочтения порядку, поэтому я думаю, что все должно быть в порядке.
Верный. Это отсутствие самого вопроса. Лично я предпочел обрабатывать ввод в порядке строка + число в моих ответах, чтобы они были сопоставимы с остальными.
Манатворк
1

Perl - 48 символов

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

Прочитайте число в первой строке, затем прочитайте предложение и разбейте его на куски, состоящие из цифр или не цифр. Выведите не цифры, как они есть, и числа умножаются.

Tal
источник
1

J - 63 символа

Программа читает номер, а затем предложение.

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

Объяснил взрывом:

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

Если мы используем библиотеку J PCRE и делаем предложение первым, мы можем сократить это до 54 символов :

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

Объяснил взрывом:

                                                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 плохо в этом, что я могу сказать. Это неудобно, потому что Дж так бездействует.

Несколько примеров:

   ;(*&.".&(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
источник
1

CJam - 35

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

Попробуйте это на http://cjam.aditsu.net/

Пример ввода:

7
CJ4M W1LL H4V3 R3GUL4R 3XPR35510N5 L4T3R

Образец вывода:

CJ28M W7LL H28V21 R21GUL28R 21XPR248570N35 L28T21R

Объяснение:

Программа просматривает каждый символ, собирая цифры в стеке, и для каждого нецифрового числа сначала печатает собранное число (если оно есть), умноженное на числовой ввод, а затем печатает символ.

li:X;читает числовой ввод и сохраняет его в X
lN+читает строку и добавляет новую строку (это помогает с конечными числами)
{…}/для каждого символа в строке
- _sкопирует символ и преобразует в строку
- A,s-,удаляет все цифры и считает оставшиеся символы; результат будет 0, если символ был цифрой, или 1, если нет
- {…}*выполняет блок, если счет был 1 (т. е. не цифра); для цифр он ничего не делает, поэтому они остаются в стеке
- ]собирает символы из стека в массив (т. е. строку); символы - это любые цифры из предыдущих итераций, плюс текущий символ
- )\отделяет последний элемент (текущий символ) и перемещает его перед (оставшейся) строкой
- _!!копирует строку и преобразует ее в логическое значение - 0, если пусто, 1, если нет
- {…}*выполняет блок, если строка не была пустой, т.е. у нас было несколько цифр, прежде чем текущий нецифровый символ
--- iX*преобразует строку в целое число и умножается на X
- oпечатает вершину стека - либо умноженное число, либо пустую строку, если у нас не было числа
- o(2-е число) печатает новую вершину стека - текущий цифра

aditsu
источник
Это гораздо более разумный подход.
Деннис
1

Хаскелл (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}

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

К сожалению, Haskell не имеет библиотеки Regex в своей Prelude .

Zeta
источник
хороший гольф; Вы могли бы удалить самое внешнее, {}чтобы получить 1 символ. Кроме того, я только что опубликовал это решение на Haskell с 70 байтами: codegolf.stackexchange.com/questions/37110/…
гордый haskeller
1

flex (-lexer) ( 94 89 символов)

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

Неуправляемая версия, которая не работает по умолчанию, если вы забыли аргумент командной строки (ненадолго):

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

Компилировать с:

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

или:

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

Например:

$ ./m 163
This 1 is22a 3352sentence 50
This 163 is3586a 546376sentence 8150
RICi
источник
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

Нажмите на заголовок, чтобы увидеть работающий пример

Пробные примеры:

Это 1 is22a 3352sentence 50
3
Это 3 is66a 10056sentence 150


Это 1 is22a 3352sentence 50
42
Это 42 is924a 140784sentence 2100

Маленький ребенок
источник
0

GNU Awk: 86 символов

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

Образец прогона:

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
manatwork
источник
0

PHP - 75/115 68/109

Две версии, более новые версии PHP могут сделать это:

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

Старые версии php: я не считал перевод строки, добавил их для удобства чтения.

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

Пример ввода + вывода

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

Вроде сложно, слова «функция» и «preg_replace_callback» занимают много символов.
Пробел после globalи не returnтребуется, если за ним следует $ var (-2 символа)

Мартейн
источник
Не нужно вводить \dв класс персонажа (-2 символа); нет необходимости заключать функцию в двойные кавычки (-2 символа); Вы должны правильно завершить оператор внутри функции точкой с запятой (+1 символ). Кстати, \dв двойных кавычках строка должна быть записана как \\d, поэтому лучше поменять кавычки на одинарные кавычки.
manatwork
Благодарю. Началось с [0-9], изменено 0-9на \ d. Не уверен насчет кавычек вокруг функции, я не могу проверить это, моя локальная версия php не позволяет это.
Мартейн
Двойные кавычки работают хорошо (по крайней мере, для меня) :)
Martijn
0

C ( 142 134 знака)

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

Новая строка вставлена ​​для улучшения читаемости. Передайте коэффициент как первый, строку как второй параметр командной строки. Для этой реализации требуется dprintfфункция, которая является частью POSIX.1 2008 и может быть недоступна в Windows. Вот единый источник:

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

улучшения

  • 142 → 134: используйте strspnи strcspnвместо циклического перебора строки.
FUZxxl
источник
0

Python 89

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

например:

# python numberstring.py 3 '1shoop da2 w007p!'
3shoop da6 w21p!
Sammitch
источник
0

Реболь - 117

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


Ungolfed:

n: do input 
d: charset "0123456789"

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

print s
draegtun
источник
0

Clojure - 141 140 128 символов

Я новичок Clojure, но FWIW:

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

Образец прогона:

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

Ungolfed (некрасиво, но, надеюсь, несколько легче читать):

(let [[a b] *command-line-args*]
    (println ( (fn [s n] 
                    (clojure.string/replace 
                        s 
                        #"\d+" 
                        #(str (* (read-string %) (read-string n)))))
                    a b)))
Майкл Пасха
источник
0

Питон - 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
источник
0

Java 218

Кто-то должен был сделать Java. Входная строка 2 токена в командной строке.

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);
    }
}
Флориан Ф
источник
1
Согласно моему тесту, ifусловие работает также с побитовым |, что на 1 символ короче.
manatwork
Благодарю. Код обновлен. (Это на самом деле все еще логическое или, просто без ярлыка оценки).
Флориан Ф
0

Два ответа: +

Чистая Баш (~ 262)

Во-первых, есть не очень короткая версия чистого bash (без форка, без внешних двоичных файлов)!

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
}

Давайте покажем:

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

(Это совершенно невероятное предложение)

Perl немного запутан (только для удовольствия)

Эта версия (основанная на ответе @ Chilemagic ) не короче, а разработана как тотемный скрипт:

cat <<eof >mn.pl

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

eof chmod +x mn.pl

Образец прогона:

./mn.pl -n=2 <<<$'This 1 is22a 3352sentence 50\n21.'
This 2 is44a 6704sentence 100
42.
Ф. Хаури
источник
0

Хаскелл, 70

слишком плохо, я слишком поздно ИМХО, это довольно хорошо для этого конкретного вопроса и языка. другое решение на Haskell - 161 символ ..

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

это работает с использованием readsфункции, которая анализирует строку частично. например,reads "34abc" = [(34, "abc")] ,. это, очевидно, делает его идеальным для этой задачи.

использование:

*Main> " This 1 is22a 3352sentence 50"%3
" This3 is66a10056sentence150"
гордый хаскеллер
источник