文字列内のすべての数値を乗算します


19

勝者:Chilemagic、大規模な21バイト!

引き続き回答を送信できますが、勝つことはできません。元の投稿を保持:


あなたの目標は、文字列内のすべての数値を検索し、ユーザーが入力した値で各数値を個別に乗算することです

  • あなたは小数を心配する必要はありません
  • ユーザーは数字と文字列を入力します
  • ユーザーは、いくつかの点で数値と文字列、入力する必要があります、プログラムが、それは問題ではありません読み込む方法を。テキストファイルの読み取りなど、stdinを使用できますが、ユーザーはキーボードの9ボタンを(たとえば)ある時点で押す必要があります。
  • コンパイルして実行できるものなら何でも構いません

例:

文入力:この1は22a 3352文50です

数字入力:3

出力:この3は66a 10056文150です


  • このコンテストは2014年9月6日(投稿から7日)で終了します。
  • これはので、最短のコードが勝ちます

任意の数を乗算します。例を更新しました。
ジョン14

あなたのチャレンジにおける「9ボタンを押す」の重要性や使用法がわかりません。与えられた例ではどのように、またはどこに適用されますか
ダレンストーン14

3
@Darren彼は基本的に、あなたは番号をハードコードできないと言っています。
ベータ崩壊14

2
関連する数値のサイズ、特にオーバーフローの可能性について推測できますか?上記の結果に応じて、「-1234」を「-」の後に1234が続くか、または-1234として扱いますか?
アルキミスト14

1
@IlmariKaronenの質問に追加するには:「Bond is agent 007」->「Bond is agent 21」または「Bond is agent 0021」または「Bond is agent 021」などのように、先行ゼロをどう処理しますか?
ハーゲンフォンアイゼン14

回答:


24

アップデート-Perl-17

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

-iand -pフラグには15文字+ 2 。

-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入力を<>で読み取り、1つ以上の数字を検索し、数字と数字の積に置き換えます。g世界的である、eであるevalS ///の置き換えポーション。$&一致したものが含まれ、数値で乗算され$nます。

あなたはより多くについて読むことができますs///はperlopとより多くのPerlがで正規表現についてはperlre

別の解決策:

@ F.Hauriは、s スイッチを使用して$n変数を4に割り当てることもできると指摘しました。

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

<>=~代わりにを使用して、さらにいくつかの文字を保存できると思います_$=<>;。またs、初心者にとっては、正規表現の一部の意味を説明していただけますか?
タル14

@Tal文字列。
カズウォルフ

3
@Mew私はそれが「置換」のためだと確信しています
マーティン・エンダー14

1
1.使用した場合$&の代わりに$1、あなたが短縮することができます(\d)\d。あなたが使用している場合2. -pスイッチを、入力順序を変更するには、ドロップすることができますsay<>=~r
デニス

1
-sスイッチを使用して、ささやく$n=<>ことがperl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'できます:(レンダリング:This 4 is88a 13408sentence 200
F.ハウリ14

9

JavaScript(ES6)-48 44文字

@bebeに1文字を保存してくれてありがとう。更新:2016年3月8日、別の4文字を削除

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もちろん!気づかなかった!どうもありがとう!
ゴーランタンドン14

(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))別のもの(これは第1の乗算を要求する)は
BEBE

@bebeこれもありがとう!
ゴーランタンドン14

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と私(他の2つのPythonのサブミッション)が再実装を試みていた方法だと思います。それはとても簡単だったでしょう...私が学んだ他の何か!;)
ファルコ14

@ファルコはre.sub別として、あなたはゴルフのストリング交換ロジックで素晴らしい仕事をした
クリスティアン・ルパスク14

@Falko同意します、re.subまさに私が欲しかったものです!
ベータ崩壊14

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

2番目の入力:文字列s(たとえば、引用符付き"abc42")。


4

CJam、47 33 30バイト

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

STDINから数値と文字列を(この順序で、1つのスペースで区切って)読み取ります。

オンラインでお試しください。

実行例

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

これは今までで最も奇妙なコードです!!!
アゼラファティ14

1
@Bludream:これは私が書い最も奇妙なコードではありません。:P
デニス14

うーん、3 * 7 = 27?
aditsu

ええ、ええ両方に投票しました。これらは世界をより良い場所にするつもりはないが。一体どのように読みやすいはずのプログラミング言語がこれに変わったのでしょうか??
アゼラファティ14

@aditsu:分割vs反復、戦いは続きます。:P
デニス14

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
面白いアイデアが、これは文字列は任意のバッシュに特別な文字が含まれていない場合にのみ...これは私が文字列の一例である動作しますしません試してください:1 D4R3 Y0U: ; rm -rf /
デニス

@デニスはい、それはかなり不幸な警告です
デジタル外傷14

3

LINQPadのC#、124

簡単です。LINQPadでCTRL + 2を使用してください(言語: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();

編集:

以下のAbbasのコメントのおかげで、これをインスタンス化するのではなく、Regex静的メソッドを使用することでさらにゴルフをすることができます:

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

良いことですが、C#のコードゴルフは簡単ではありません。私はあなたの努力の担当者になりたくないので、私自身の答えを投稿する代わりにヒントを提供します:new Regex( "...")の代わりに静的 Regex.Replace(string、string、string)を使用します .Replace(...); これが、乗数優先の短いバージョンですvar k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int.Parse(t.Value)*k).Dump();。どちらのバージョンでも、これによりさらに5文字が節約され、ロングバージョンで119、乗数優先バージョンで111になります
アッバス

1
しかし、ヒントのおかげで、C#Regex Golfingに関して、他の人が私から何をすべきか、あなたから何をすべきかを学ぶことができるように、元の答えを変更しないことにしました。
ジェイコブ14

あなたを理解していますが、あなたの答えに編集として私のヒントを加えることもできます。ユーザーは、ヒントのあるコメントのリストよりもこれを読む傾向があります。
アッバス

確かに。答えが編集されました。
ジェイコブ

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

Python 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=2s="1 2"それがもたらし4 4たので、replace修正最初の数回。これは、Python 2で今直面しているのと同じ問題です
;;

@Falko私は問題を修正することができましたが、プロセスでコードを長くしました
ベータ崩壊14

ああ、よくやった!ちょっとしたちょっとしたコメント:m=input()何も保存しません。またx=int、実際には2 int(...)回呼び出すよりも2バイト長くなります。
ファルコ14

2

Mathematica 71 61

Martin Buttnerのおかげで10文字が節約されました。

コード内のスペースは読みやすくするためのものです。

fs入力文字列でnあり、検出された文字列番号を乗算する数値です。

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

 s="This 1 is22a 3352sentence 50"

整数

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

「この3は66a 10056文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」のように、文字に直接付けられた数字でも機能しますか?
ファルコ14

なぜならStringReplace、スペースが存在するかどうかに違いはありません。私は元々Chiperymanが提供した例を使用しました。
DavidC 14

更新された例に切り替えました。(Chiperymanによって以前に与えられた例を使用しました。)StringReplaceスペースがあるかどうかは違いがありません。
DavidC 14


2

ルア: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
すべてを1行で入力し、「)」の横にある指示をスムージングすることで、もう少しゴルフを楽しむことができます。「s = r()n =()」のように完全に問題ありません。
AndoDaan

1
Dohと私は、ほんの数週間前にLuaでのゴルフのヒントを読みました。:(@ AndoDaanに感謝します。
manatwork 14

2

JavaScript、ES6、43文字

これがゴルフの私の最初の試みです!

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

これを最新のFirefoxのコンソールで実行します。最初の入力は数値であり、2番目の入力は、数値に最初の入力数値を乗算する文字列です。

最後のプロンプトに出力が一覧表示されます。


初めてのタイマーにぴったりのJSゴルフ!
オプティマイザー14

最初に数字を読んだ場合、他の多くの回答は短くなる可能性があります。それははるかに簡単でした。
マナトワーク14

@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はこれが苦手です。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;数値入力を
lN+読み取り、Xに格納し、文字列を読み取り、文字列の
{…}/各文字に改行を追加します(末尾の数字に役立ちます)
- 文字を_sコピーして文字列に変換します
- A,s-,すべての数字を削除し、残りの文字をカウントします。文字が数字か1だった場合でない場合、結果は0になります1ない場合、0であれば、空-ブール値にコピーした文字列と変換それを - 文字列が空にされなかった場合はブロックを実行すなわち我々はいくつかの数字を持っていました、現在の数字以外の文字の前に --- Xによる整数と乗算に文字列を変換 - スタックの先頭を印刷します-私たちは番号を持っていなかった場合は、逓倍数または空の文字列のいずれかを
{…}*場合は1になります - カウントが1(つまり、数字以外)の場合、ブロックを実行します。彼らはスタック上に残っているので数字のためには、何もしません
- ]配列(すなわち列)にスタックから文字を収集し、文字は前の反復からの任意の数字と現在の文字
- )\最後の項目(現在の文字)を分離し、(残りの)文字列の前に移動します
-_!!
{…}*
iX*
o
- o(2番目の)スタックの新しいトップ-現在の非数字文字を出力します


それは非常に賢明なアプローチです。
デニス14

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のPreludeにはRegexライブラリがありません。


素敵なゴルフ; あなた{}は1文字の利益のために最も外側を削除することができました。:また、私はちょうど70バイトで、このHaskellのソリューション投稿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は22a 3352文50
3
この3は66a 10056文150


この1は22a 3352文50
42
この42は924a 140784文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

2つのバージョン、新しい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」という言葉は多くの文字を必要とします。$ var(-2文字)が後に続く場合に必要な
スペースglobalreturnアレント


\d文字クラス(-2文字)を入れる必要はありません。関数を二重引用符(-2文字)で囲む必要はありません。関数内のステートメントをセミコロン(+1文字)で適切に終了する必要があります。ちなみに、\d二重引用符で囲まれた文字列はとして記述する必要がある\\dため、引用符を一重引用符に変更する方が適切です。
マナトワーク14

ありがとう。[0-9]で始まり、0-9\ d に変更されました。関数を囲む引用符については確信が持てませんでした。それをテストすることはできません。私のローカルphpのバージョンでは許可されていません。
マーティン14

二重引用符は(少なくとも私にとっては)うまく機能します:)
Martijn 14

0

C(142134文字)

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

読みやすくするために改行が挿入されました。最初の要素として係数を、2番目のコマンドラインオプションとして文字列を渡します。この実装には、dprintfPOSIX.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:文字列をループする代わりにstrspnand 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


ゴルフをしていない:

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(ugいですが、うまくいけば多少読みやすくなります):

(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文字短くなります。
マナトワーク14

ありがとう。コードが更新されました。(実際にはまだブール値であるか、評価のショートカットがないだけです)。
フロリアンF 14

0

2つの答え: +

純粋なバッシュ(〜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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.