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


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'

Я думаю, что вы можете сохранить еще несколько символов, используя <>=~вместо _$=<>;. Также не могли бы вы объяснить, что значит 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]")

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»


1
Я не знаю Mathematica. Но в ваших примерах все числа и слова разделены пробелами. Работает ли это для чисел, непосредственно прикрепленных к буквам, например, «abc42»?
— Фалько

Ибо StringReplaceне имеет значения, есть ли пробелы. Я использовал примеры, приведенные Chiperyman.
— DavidC

Я перешел на обновленный пример. (Я использовал пример, приведенный ранее Чипериманом.) Поскольку StringReplaceне имеет значения, есть ли пробелы.
— DavidC


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

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)

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


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

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-е число) печатает новую вершину стека - текущий цифра


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

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 .


хороший гольф; Вы могли бы удалить самое внешнее, {}чтобы получить 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

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

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вместо циклического перебора строки.

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!

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

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

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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.