Помножте всі числа в рядку


19

Переможець: Чилімагік , масовий 21 байт!

Ви можете продовжувати надсилати свою відповідь, однак перемогти більше не можете. Оригінальна публікація збережена:


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

  • Вам не потрібно буде турбуватися про десяткові знаки
  • Користувач введе число та рядок
  • Користувач повинен ввести число і рядок в якийсь момент, однак спосіб, який програма читає, це не має значення. Це може бути за допомогою stdin, читання текстового файлу тощо, однак користувач повинен в якийсь момент натиснути кнопку 9 на клавіатурі (наприклад)
  • Все, що можна компілювати та запускати, є прийнятним

Приклад:

Введення вироку: Це 1 22a 3352 сенс 50

Число введення: 3

Вихід: Цей 3 is66a 10056sentence 150


  • Цей конкурс закінчується 6 вересня 2014 року (7 днів від публікації).
  • Це , тому виграє найкоротший код

Будь-яке число потрібно помножити. Я оновив свій приклад.
Jon

Я не розумію значення або використання "натисніть кнопку 9" у вашому виклику. Як або де це застосовується у наведеному прикладі?
Даррен Стоун

3
@Darren Він в основному говорить, що ви не можете ввести жорсткий код.
Бета-розпад

2
Чи можна робити припущення щодо розміру залучених чисел, особливо щодо можливості переповнення? Залежно від результатів вище, чи трактуємо "-1234" як "-", а потім 1234 або як -1234?
Алхімік

1
Щоб додати до питання @ IlmariKaronen: Що робити з провідними нулями, як у "Bond is agent 007" -> "Bond is agent 21" або "Bond is agent 0021" or "Bond is agent 021" or ...?
Хаген фон Ейтцен

Відповіді:


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

Оновлено відповідно до коментаря @ Dennis.

$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
@Mew Я майже впевнений, що це "заміна"
Мартін Ендер

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

Безголівки :

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 Дякую також за це!
Gaurang Tandon,

6

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


Блискуча. Я здогадуюсь re.sub, що метод Beta Decay і я (інші два подання Python) намагалися повторно реалізуватися. Це було б так просто ... Щось ще я дізнався! ;)
Фалько

@Falko re.subубік, ви зробили чудову роботу в гольфі на логіку заміни струни
Крістіан Лупаску

@Falko Я згоден, 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.     ";

Це най дивніший фрагмент коду коли-небудь !!!
azerafati

1
@Bludream: Це навіть не найсмішніший код, який я написав . : P
Денніс

Хм, 3 * 7 = 27?
aditsu

хаха, так, проголосували за обох. Хоча вони не збираються зробити світ кращим. Як на мовах програмування Землі, які повинні бути читабельні, перетворилися на це ??
azerafati

@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 /
Dennis,

@Dennis так, це досить прикрий застереження
Digital Trauma

3

C # в LINQPad, 124

Прямо. Будь ласка, використовуйте CTRL + 2 у LINQPad (Мова: C # Заяви).

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 (рядок, рядок, рядок) замість нового 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

Математика 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 10056sensence 150"


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

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

"Це -7.13 становить-156,86а -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

Я перейшов на оновлений приклад. (Я використовував приклад, поданий раніше Chiperyman.) Для 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 char

Програма читає число, а потім речення.

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

Якщо нам вдасться використати бібліотеку PCRE J, і запропонувати речення першим, ми можемо збити це до 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 поганий у цьому, що я можу сказати. Це незручно, тому що 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(другий) друкує нову вершину стека - поточний нецифровий символ


Це набагато безпечніший підхід.
Денніс

1

Хаскелл (161)

Гольф

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}

Безумовно

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 .


приємний гольф; ви могли б видалити найбільш віддалені {}для отримання 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 char). До речі, \dу подвійному котируваному рядку слід писати як \\d, тому краще змініть лапки на одиничні лапки.
манатурка

Спасибі. Почав з [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

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


Безголівки:

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 'Це 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 символ коротший.
манатура

Спасибі. Код оновлено. (Насправді це все-таки булева або, просто без ярлика оцінки).
Флоріан F

0

Дві відповіді: +

Чистий баш (~ 262)

По- перше, це не так коротка чиста версія Баш (без вилки, ніяких зовнішніх бінарних файлів)!

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 трохи затуманений (лише для розваги)

Ця версія (заснована на відповіді @ Чилімагіка ) не коротша, але розроблена як тотемний сценарій:

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

занадто погано, я занадто пізно IMHO, це досить добре для цього конкретного питання та мови. інше рішення 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.