Nhân tất cả các số trong một chuỗi


19

Người chiến thắng: Chilemagic , 21 byte khổng lồ!

Bạn có thể tiếp tục gửi câu trả lời của mình, tuy nhiên bạn không còn có thể giành chiến thắng. Bài gốc được lưu giữ:


Mục tiêu của bạn là tìm tất cả các số trong một chuỗi và nhân từng số một với giá trị đầu vào của người dùng

  • Bạn sẽ không cần phải lo lắng về số thập phân
  • Người dùng sẽ nhập một số và một chuỗi
  • Người dùng phải nhập số và chuỗi tại một số điểm, tuy nhiên phương thức mà chương trình đọc nó không quan trọng. Nó có thể là với stdin, đọc tệp văn bản, v.v. Tuy nhiên, người dùng phải nhấn nút 9 trên bàn phím của họ (ví dụ) tại một số điểm
  • Bất cứ điều gì có thể biên dịch và chạy đều được chấp nhận

Thí dụ:

Đầu vào câu: 1 này là 22a 3352sentence 50

Số đầu vào: 3

Đầu ra: 3 is66a 10056sentence 150 này


  • Cuộc thi này kết thúc vào ngày 6 tháng 9 năm 2014 (7 ngày kể từ ngày đăng).
  • Đây là một , do đó chiến thắng mã ngắn nhất

Bất kỳ số nào sẽ được nhân lên. Tôi đã cập nhật ví dụ của tôi.
Jon

Tôi không hiểu tầm quan trọng hoặc việc sử dụng "nhấn nút 9" trong thử thách của bạn. Làm thế nào hoặc ở đâu nó áp dụng trong ví dụ đưa ra?
Darren Stone

3
@Darren Về cơ bản, anh ấy nói rằng bạn không thể mã hóa số.
Beta Decay

2
Chúng ta có thể đưa ra các giả định về kích thước của các con số liên quan, đặc biệt là khả năng tràn? Tùy thuộc vào kết quả của những điều trên, chúng ta sẽ coi "-1234" là "-" theo sau là 1234 hay -1234?
Alchymist

1
Để thêm vào câu hỏi của @ IlmariKaronen: Phải làm gì với các số 0 hàng đầu như trong "Bond là đại lý 007" -> "Bond là đại lý 21" hoặc "Bond là đại lý 0021" hoặc "Bond là đại lý 021" hoặc ...?
Hagen von Eitzen

Câu trả lời:


24

Cập nhật - Perl - 17

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

15 ký tự + 2 cho -i-p cờ.

Chúng tôi có thể sử dụng -icờ để nhập phần mở rộng tệp, nhưng vì chúng tôi không đọc bất kỳ tệp nào, chúng tôi có thể sử dụng nó để lấy số và biến đó$^I sẽ được gán cho nó.

Chạy với:

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

Perl - 21

Cập nhật theo nhận xét của @ Dennis.

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

Chạy với -p cờ.

Chạy ví dụ:

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

Giải trình:

$n=<>; đọc số

-p in đầu ra

s/\d+/$&*$n/geĐọc đầu vào bằng <> và tìm kiếm một hoặc nhiều chữ số và thay thế chúng bằng các chữ số nhân với số. glà toàn cầu, eevalthuốc thay thế của s ///. $&chứa những gì được khớp và nó nhân với số,$n .

Bạn có thể đọc thêm về s///trong perlop và nhiều hơn nữa về Perl regexes trong perlre .

Giải pháp khác:

@ F.Hauri chỉ ra rằng bạn cũng có thể sử dụng công s tắc để gán $nbiến cho 4. Tôi không chắc số này có bao nhiêu ký tự nhưng tôi sẽ để nó ở đây:

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

Tôi nghĩ rằng bạn có thể lưu thêm một vài ký tự bằng cách sử dụng <>=~thay vì _$=<>;. Ngoài ra, bạn có thể vui lòng giải thích sphần của regex có nghĩa là gì, đối với người mới?
Tal

@Tal String.
Kaz Wolfe

3
@Mew Tôi khá chắc chắn đó là "sự thay thế"
Martin Ender

1
1. Nếu bạn sử dụng $&thay vì $1, bạn có thể rút ngắn (\d)tới \d. 2. Nếu bạn sử dụng công -ptắc và thay đổi thứ tự đầu vào, bạn có thể thả say<>=~r.
Dennis

1
Bạn có thể sử dụng -scông tắc, để $n=<>xóa sổ: perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'(thực hiện This 4 is88a 13408sentence 200:)
F. Hauri

9

JavaScript (ES6) - 48 44 ký tự

Cảm ơn @bebe vì đã cứu một nhân vật. Cập nhật: 8/8/16, xóa bốn ký tự khác

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

Ung dung :

var sentence = prompt(),
    num = parseInt(prompt(), 10); // base 10

sentence = sentence.replace(/\d+/g, digit => digit * num);

alert(sentence);

43 ký tự:

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

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

Yêu cầu nhập số trước rồi mới câu. Cắt thêm một char ở đây cảm ơn @bebe một lần nữa!


bạn không cần phải nhập số phân tích cú pháp
bebe

@bebe Tất nhiên rồi! Tôi đã không thông báo! Cảm ơn rất nhiều!
Gaurang Tandon

(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))nhau (nhưng điều này yêu cầu nhân đầu tiên)
bebe

@bebe Cảm ơn vì điều này quá!
Gaurang Tandon

6

Con trăn 2 (79)

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

Chạy mẫu

Đầu vào:
$ python mult.py
3
"This 1 is22a 3352sentence 50"
Đầu ra:
This 3 is66a 10056sentence 150

Bản demo trực tuyến: http://ideone.com/V6jpyQ


Rực rỡ. Tôi đoán re.sublà phương pháp Beta Decay và tôi (hai bài nộp Python khác) đang cố gắng thực hiện lại. Nó thật dễ dàng ... Một thứ khác mà tôi đã học được! ;)
Falko

@Falko re.subsang một bên, bạn đã hoàn thành công việc tuyệt vời khi chơi golf thay thế chuỗi logic
Cristian Lupascu

@Falko Tôi đồng ý, re.subchính xác là điều tôi muốn!
Beta Decay

4

Con trăn 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

Đầu vào đầu tiên: số nguyên n.

Đầu vào thứ hai: chuỗi s(có dấu ngoặc kép, ví dụ "abc42").


4

CJam, 47 33 30 byte

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

Đọc số và chuỗi (theo thứ tự đó và được phân tách bằng một khoảng trắng) từ STDIN.

Hãy thử trực tuyến.

Chạy ví dụ

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

Làm thế nào nó hoạt động

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

Đây là đoạn mã kỳ lạ nhất từ ​​trước đến nay !!!
azerafati

1
@Bludream: Đây thậm chí không phải là mã kỳ lạ nhất mà tôi đã viết . : P
Dennis

Hừm, 3 * 7 = 27?
aditsu

lol, yeah đã bình chọn cho cả hai. Mặc dù những điều này sẽ không làm cho thế giới tốt đẹp hơn. Làm thế nào trên các ngôn ngữ lập trình trái đất, những người được cho là có thể đọc được biến thành thế này ??
azerafati

@aditsu: Chia tách vs lặp đi lặp lại, trận chiến tiếp tục. : P
Dennis

4

Bash + coreutils, 38 byte

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

Đọc chuỗi đầu vào từ STDIN và số nhân dưới dạng tham số dòng lệnh.

Đầu ra:

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

6
Ý tưởng thú vị, nhưng điều này sẽ chỉ hoạt động nếu chuỗi không chứa bất kỳ ký tự nào đặc biệt đối với Bash ... Đây là một ví dụ về chuỗi tôi sẽ không thử:1 D4R3 Y0U: ; rm -rf /
Dennis

@Dennis vâng, đó là một cảnh báo khá đáng tiếc
Chấn thương kỹ thuật số

3

C # trong LINQPad, 124

Nói thẳng ra. Vui lòng sử dụng CTRL + 2 trong LINQPad (Ngôn ngữ: Báo cáo C #).

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

Nếu số nhân được đưa ra làm tham số đầu vào đầu tiên, nó có thể được thực hiện trong 116 ký tự:

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

CHỈNH SỬA:

Nhờ nhận xét của Abbas bên dưới, điều này thậm chí có thể được đánh gôn nhiều hơn bằng cách sử dụng phương pháp tĩnh Regex , thay vì khởi tạo nó:

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

Đẹp đấy, chơi golf trong C # không dễ! Tôi không muốn nhận diện về nỗ lực của bạn vì vậy tôi sẽ cung cấp cho bạn một mẹo thay vì gửi bài trả lời của riêng tôi: sử dụng tĩnh Regex.Replace (string, string, string) thay vì Regex mới ( "...") .Thay thế(...); Đây là phiên bản số nhân ngắn đầu tiên : var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int.Parse(t.Value)*k).Dump();. Trong cả hai phiên bản, điều này giúp tiết kiệm thêm 5 ký tự, giúp bạn có được 119 phiên bản dài và 111 cho phiên bản số nhân đầu tiên
Abbas

1
Tuy nhiên, cảm ơn vì tiền boa, tôi quyết định không thay đổi câu trả lời ban đầu của mình, để những người khác có thể học những điều không nên làm từ tôi và những việc cần làm từ bạn - liên quan đến C # Regex Golfing.
Jacob

Tôi hiểu bạn nhưng bạn cũng có thể thêm mẹo của tôi vào câu trả lời của bạn dưới dạng chỉnh sửa . Người dùng có xu hướng đọc điều này nhiều hơn họ sẽ một danh sách các bình luận với các mẹo.
Abbas

Chắc chắn rồi. Câu trả lời đã được chỉnh sửa.
Jacob

2

Rắn hổ mang - 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

Trăn 3 - 141

Tôi không nghĩ rằng tôi có thể chơi gôn này nữa ...

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)

Thí dụ:

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

10
hello100 hello100
hello1000 hello1000

2
Thật không may, phương pháp này không hiệu quả. Cho n=2s="1 2"nó mang lại 4 4, vì replacesửa đổi số đầu tiên hai lần. Đó là cùng một vấn đề tôi đang phải đối mặt với Python 2 ...;)
Falko

@Falko Tôi đã cố gắng khắc phục sự cố, mặc dù làm cho mã của tôi dài hơn trong quá trình
Beta Decay

Ồ tốt đấy! Chỉ cần một số nhận xét nhỏ: m=input()tiết kiệm cho bạn không có gì. Và x=intthực sự dài hơn 2 byte so với gọi int(...)hai lần.
Falko

2

Toán học 71 61

Với 10 ký tự được lưu nhờ Martin Buttner.

Không gian trong mã là để dễ đọc.

flà một hàm trong đó slà chuỗi đầu vào và nlà số để nhân số chuỗi được phát hiện với.

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

Ví dụ

 s="This 1 is22a 3352sentence 50"

Số nguyên

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

"3 này là66a 10056sentent 150"


Số hợp lý

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

"-7,13 này là-156,86a -23899,8sentent -356,5"


Số phức

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

"Đây -5 + 3 I là-110 + 66 Ia -16760 + 10056 Isentence -250 + 150 I"


1
Tôi không biết Mathicala. Nhưng trong ví dụ của bạn, tất cả các số và từ được phân tách bằng dấu cách. Nó có hoạt động với các số được gắn trực tiếp vào các chữ cái không, như "abc42"?
Falko

Đối với StringReplacenó làm cho không có sự khác biệt cho dù có không gian. Tôi đã sử dụng các ví dụ ban đầu được đưa ra bởi Chiperyman.
DavidC

Tôi chuyển sang ví dụ cập nhật. (Tôi đã sử dụng ví dụ được đưa ra trước đó bởi Chiperyman.) Vì StringReplacenó không có sự khác biệt cho dù có không gian.
DavidC

2

Hồng 40

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

Đầu vào từ stdin.

Chạy ví dụ:

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

Bản demo trực tuyến: http://ideone.com/4BiHC8


2

Lua: 73 69 ký tự

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

Chạy mẫu:

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
You can golf it a bit more by putting everything on one line, and smooshing instructions next to ")". Like "s=r()n=()" is perfectly fine.
AndoDaan

1
Doh, and I read Tips for golfing in Lua just a couple of weeks ago. :( Thank you, @AndoDaan.
manatwork

2

JavaScript, ES6, 43 characters

This is my first attempt at golfing!

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

Run this in latest Firefox's Console. The first input is the number and the second input is the string from which the numbers are to be multiplied with the first input number.

The final prompt lists the output.


Pretty nice JS Golf for a first timer!
Optimizer

Many other answers could be shorter if number was read first. That was is much easier.
manatwork

@manatwork - Yeah, but the question does not give any preference on the order, so I think it should be fine.

Correct. This is a lack of the question itself. Personally I preferred to handle input in string+number order in my answers to keep them comparable with the others.
manatwork

1

Perl - 48 chars

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

Read a number on the first line, then read a sentence and break it into chunks of either digits or non digits. Print the non digits as they are, and the numbers get multiplied.


1

J - 63 char

Chương trình đọc trong số, và sau đó câu.

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

Giải thích bằng vụ nổ:

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

Nếu chúng ta có thể sử dụng thư viện PCRE của J và đặt câu trước, chúng ta có thể hạ xuống 54 ký tự :

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

Giải thích bằng vụ nổ:

                                                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 là xấu về điều này, tôi có thể nói gì. Thật là bất tiện vì J quá vô dụng.

Vài ví dụ:

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

Dùng thử tại http://cjam.aditsu.net/

Đầu vào mẫu:

7
CJ4M W1LL H4V3 R3GUL4R 3XPR35510N5 L4T3R

Đầu ra mẫu:

CJ28M W7LL H28V21 R21GUL28R 21XPR248570N35 L28T21R

Giải trình:

The program goes through each character, collecting the digits on the stack, and for each non-digit it first prints the collected number (if any) multiplied by the numeric input, then prints the character.

li:X;đọc đầu vào số và lưu nó trong X
lN+đọc chuỗi và nối thêm một dòng mới (nó giúp với các số ở cuối)
{…}/cho mỗi ký tự trong chuỗi
- _ssao chép ký tự và chuyển thành chuỗi
- A,s-,xóa tất cả các chữ số và đếm các ký tự còn lại; kết quả sẽ là 0 nếu ký tự là một chữ số hoặc 1 nếu không
- {…}*thực thi khối nếu số đếm là 1 (tức là không phải chữ số); đối với các chữ số thì không có gì, vì vậy chúng vẫn nằm trên ngăn xếp
- ]thu thập các ký tự từ ngăn xếp thành một mảng (tức là một chuỗi); các ký tự là bất kỳ chữ số nào từ các lần lặp trước, cộng với ký tự hiện tại
- )\tách mục cuối cùng (ký tự hiện tại) và di chuyển nó trước chuỗi (còn lại)
- _!!sao chép chuỗi và chuyển đổi nó thành giá trị boolean - 0 nếu trống, 1 nếu không
- {…}*thực thi khối nếu chuỗi không trống, tức là chúng ta có một số chữ số trước ký tự không có chữ số hiện tại
--- iX*chuyển đổi chuỗi thành số nguyên và nhân với X
- oin đỉnh của ngăn xếp - hoặc là số nhân hoặc chuỗi trống nếu chúng ta không có số
- o(chuỗi thứ 2) in đỉnh mới của ngăn xếp - ký tự không có chữ số hiện tại


Đó là một cách tiếp cận nhiều hơn.
Dennis

1

Haskell (161)

Chơi gôn

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}

Bị đánh cắp

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

Thật không may, Haskell không có thư viện Regex trong Prelude .


chơi golf đẹp; bạn có thể đã xóa phần ngoài cùng {}để kiếm được 1 char. Ngoài ra, tôi vừa đăng giải pháp Haskell này với 70 byte: codegolf.stackexchange.com/questions/37110/ mẹo
tự hào

1

flex (-lexer) ( 94 89 ký tự)

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

Phiên bản không được mã hóa mà không segfault nếu bạn quên đối số dòng lệnh (không lâu hơn nữa):

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

Biên dịch với:

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

hoặc là:

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

Ví dụ:

$ ./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

Nhấp vào tiêu đề để xem ví dụ runnable

Ví dụ đã thử:

Đây là 1 is22a 3352sent 50
3
Đây là 3 is66a 10056sentence 150


Đây là 1 is22a 3352sent 50
42
Đây là 42 is924a 140784sent 2100


0

GNU Awk: 86 ký tự

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

Chạy mẫu:

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

Hai phiên bản, phiên bản php mới hơn có thể làm điều này:

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

Older php versions: I did not count the newline, added those for readability.

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

Example input+output

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

Kinda difficult, the words 'function' and 'preg_replace_callback' take up a lot of chars.
The space after global and return arent needed if followed by a $var (-2 chars)


No need to put \d in character class (-2 chars); no need to enclose the function in double quotes (-2 chars); you have to properly terminate the statement inside the function with semicolon (+1 char). By the way, \d in double quoted string should be written as \\d, so better change the quotes to single quotes.
manatwork

Thanks. Started with [0-9], changed 0-9 to \d. Wasnt sure about the quotes around the function, I cant test that one, my local php's version doesnt allow it.
Martijn

The double quotes work fine (at least for me) :)
Martijn

0

C (142 134 characters)

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

Newline inserted for enhanced legibility. Pass the factor as the first, the string as the second command line option. This implementation requires the dprintf function which is part of POSIX.1 2008 and might not be available on Windows. Here is the unminified source:

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

Improvements

  • 142 → 134: Use strspn and strcspn instead of looping over the string.

0

Python 89

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

eg:

# 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 chars

I'm a Clojure newbie, but FWIW:

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

Sample run:

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

Ungolfed (ugly but hopefully somewhat easier to read):

(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

Someone had to do java. The input string are 2 token on the command line.

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
According to my test, the if condition works with bitwise | too, which is 1 character shorter.
manatwork

Thanks. Code updated. (It is actually still a boolean or, just without evaluation shortcut).
Florian F

0

Two answer: +

Pure bash (~262)

First, there is an not so short pure bash version (no fork, no external binaries)!

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
}

Let's show:

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

(Which is a totally improbable sentence)

Perl little obfuscated (for fun only)

This version (based on @Chilemagic's answer) is not shorter, but designed as a totem script:

cat <<eof >mn.pl

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

eof chmod +x mn.pl

Sample run:

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

0

Haskell, 70

too bad I'm too late IMHO this is pretty good for this specific question and language. the other Haskell solution here is 161 characters..

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

this works by using the reads function which parses a string Partially. for example, reads "34abc" = [(34, "abc")]. this obviously makes it perfect for this challenge.

usage:

*Main> " This 1 is22a 3352sentence 50"%3
" This3 is66a10056sentence150"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.