Bir dizedeki tüm sayıları çarpma


19

Kazanan: Chilemagic , büyük bir 21 bayt!

Cevabınızı göndermeye devam edebilirsiniz, ancak artık kazanamazsınız. Orijinal yayın saklandı:


Amacınız bir dizedeki tüm sayıları bulmak ve her birini kullanıcı tarafından bir değer girişi ile tek tek çarpmaktır

  • Ondalık sayılar için endişelenmenize gerek kalmayacak
  • Kullanıcı bir sayı ve bir dize girer
  • Kullanıcı bir noktada sayı ve dizeyi yazmalıdır, ancak programın okuduğu yöntem önemli değildir. Stdin ile olabilir, bir metin dosyasını okuyabilir, ancak kullanıcı bir noktada klavyesindeki 9 düğmesine (örneğin) basmalıdır.
  • Derleyebilen ve çalışabilen her şey kabul edilebilir

Misal:

Cümle girişi: Bu 1 is22a 3352sentence 50

Sayı girişi: 3

Çıktı: Bu 3 is66a 10056sentence 150


  • Bu yarışma 6 Eylül 2014'te sona erecektir (kayıt tarihinden itibaren 7 gün).
  • Bu bir , bu yüzden en kısa kod kazanıyor

Herhangi bir sayı çarpılmalıdır. Örneğimi güncelledim.
Jon

Zorluğunuzda "9 düğmesine basın" ın önemini veya kullanımını anlamıyorum. Verilen örnekte nasıl veya nerede uygulanır?
Darren Stone

3
@Darren Temel olarak numarayı kodlayamayacağınızı söylüyor.
Beta Çürümesi

2
İlgili sayıların büyüklüğü, özellikle taşma olasılığı hakkında varsayımlar yapabilir miyiz? Yukarıdakilerin sonuçlarına bağlı olarak, "-1234" e "-" ve ardından 1234 veya -1234 olarak mı davranıyoruz?
Simyacı

1
IlmariKaronen sorusuna @ eklemek için: ne ilgisi lider olduğu gibi sıfır "Bond ajanı 007" -> ... ya da "Bond ajanı 0021 olduğu" veya "Bond ajanı 021 olduğu" veya "Bond ajanı 21'dir"?
Hagen von Eitzen

Yanıtlar:


24

Güncelleme - Perl - 17

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

15 karakter + 2 -ive -pbayraklar için.

-iBayrağı bir dosya uzantısı girmek için kullanabiliriz , ancak herhangi bir dosya okumadığımız için, numarayı almak için kullanabiliriz ve değişken $^Iona atanacaktır.

Şununla çalıştır:

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

Perl - 21

@ Dennis'in yorumuna göre güncellendi.

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

-pBayrağı ile çalıştırın .

Örnek çalışma:

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

Açıklama:

$n=<>; numarayı oku

-p çıktıyı yazdırır

s/\d+/$&*$n/ge<> Tuşuyla girişi okuyun ve bir veya daha fazla rakam arayın ve rakamları rakam sayısıyla çarpın. ggeneldir, eolduğu evals /// ait değiştirin iksir. $&eşleşenleri içerir ve sayıyla çarpılır $n.

Perlop hakkında s///ve perlre'deki Perl regexes hakkında daha fazla bilgi edinebilirsiniz .

Başka bir çözüm:

@ F.Hauri , değişkeni 4'e atamak için s anahtarı da kullanabileceğinizi belirtti $n. Bunun kaç karakter olduğunu bilmiyorum ama burada bırakacağım:

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

Bunun <>=~yerine kullanarak birkaç karakter daha kaydedebilirsiniz _$=<>;. Ayrıca sregex'in bizim için yeni bölümlerinin ne anlama geldiğini açıklayabilir misiniz ?
Tal

@Tal dize.
Kaz Wolfe

3
@Mew "substitüsyon" olduğundan eminim
Martin Ender

1
Eğer kullanırsanız 1. $&yerine $1, sen kısaltabilirsiniz (\d)için \d. Eğer kullanırsanız 2. -panahtarı ve giriş sırasını değiştirmek, bırakın say<>=~ve r.
Dennis

1
Sen kullanabilir -swhipe için, anahtarı $n=<>dışarı: perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'(işlemek do: This 4 is88a 13408sentence 200)
F. Hauri

9

JavaScript (ES6) - 48 44 karakter

@Bebe'ye bir karakter kaydettiği için teşekkürler . Güncelleme: 8 / Mar / 16, başka bir dört karakter kaldırıldı

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

Kurtulmamış :

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

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

alert(sentence);

43 karakter:

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

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

Önce sayı girişi sonra da cümle gerektirir. Burada bir karakter daha kesin @bebe tekrar teşekkürler!


sayı girdisini ayrıştırmanıza gerek yok
bebe

@bebe Tabii ki! Fark etmedim! Çok teşekkürler!
Gaurang Tandon

(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))başka bir (ama bu ilk çarpanı ister)
bebe

@bebe Bunun için teşekkürler!
Gaurang Tandon

6

Python 2 (79)

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

Örnek çalışma

Giriş:
$ python mult.py
3
"This 1 is22a 3352sentence 50"
Çıktı:
This 3 is66a 10056sentence 150

Çevrimiçi demo: http://ideone.com/V6jpyQ


Parlak. Sanırım re.subBeta Çürüme ve ben (diğer iki Python sunumu) yeniden uygulamaya çalışıyordum. O kadar kolay olurdu ... Başka bir şey öğrendim! ;)
Falko

@Falko bir re.subyana, dize değiştirme mantığını golf mükemmel bir iş
başardın

@Falko katılıyorum, re.subtam olarak istediğim şey!
Beta Çürümesi

4

Python 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

İlk giriş: tamsayı n.

İkinci giriş: dize s(tırnak işaretleri ile, örneğin "abc42").


4

CJam, 47 33 30 bayt

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

STDIN'den sayı ve dizeyi (bu sırayla ve tek bir boşlukla ayrılmış) okur.

Çevrimiçi deneyin.

Örnek çalışma

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

Nasıl çalışır

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

Bu şimdiye kadarki en tuhaf kod parçası !!!
azerafati

1
@Bludream: Bu yazdığım en garip kod bile değil . : P
Dennis

Hmm, 3 * 7 = 27?
aditsu

lol, evet her ikisi için de oy kullandı. Gerçi bunlar dünyayı daha iyi bir yer haline getirmeyecek. Okunabilir olması gereken yeryüzündeki programlama dilleri buna nasıl dönüştü ??
azerafati

@aditsu: Yinelemeye karşı yineleme, savaş devam ediyor. : P
Dennis

4

Bash + coreutils, 38 bayt

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

STDIN ve çarpanından girdi dizesini komut satırı parametresi olarak okur.

Çıktı:

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

6
Dize herhangi Bash'e özel karakterler içermiyorsa İlginç bir fikir, ama bu sadece çalışacaktır ... Bu benim bir dize örneğidir olmaz deneyin:1 D4R3 Y0U: ; rm -rf /
Dennis

@Dennis evet bu oldukça talihsiz bir uyarı
Digital Trauma

3

LINQPad'deki C #, 124

Basit. LINQPad'de CTRL + 2 kullanın (Dil: C # Deyimleri).

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

Çarpan ilk giriş parametresi olarak verilirse, 116 karakterle yapılabilir:

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

DÜZENLE:

Abbas'ın aşağıdaki yorumu sayesinde, bunu örneklemek yerine Regex statik yöntemini kullanarak daha da golf oynayabilir :

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

Güzel bir, C # kod golf kolay değil! Bu yüzden kendi cevabımı göndermek yerine size bir ipucu vereceğim için çabanızı almak istemiyorum : yeni Regex ("..." yerine statik Regex.Replace (string, string, string) kullanın .Kapağı (...); İşte kısa çarpan ilk sürümü: var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int.Parse(t.Value)*k).Dump();. Her iki versiyonda da bu 5 karakter daha kaydederek uzun versiyon için 119 ve çarpan ilk versiyon için 111'e
Abbas

1
Bununla birlikte, bahşiş için teşekkürler, orijinal cevabımı değiştirmemeye karar verdim, böylece C # Regex Golf ile ilgili olarak başkaları benden ne yapmamayı ve ne yapman gerektiğini öğrenebilsin.
Jacob

Seni anlıyorum ama cevabını düzenleme olarak da ekleyebilirsin . Kullanıcılar bunu ipuçları içeren yorumların bir listesinden daha fazla okuma eğilimindedir.
Abbas

Elbette. Cevap düzenlendi.
Jacob

2

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

Artık golf oynayabileceğimi sanmıyorum ...

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)

Misal:

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

10
hello100 hello100
hello1000 hello1000

2
Ne yazık ki bu yaklaşım işe yaramıyor. İçin n=2ve s="1 2"verir 4 4, çünkü replaceilk sayıyı iki kez değiştirir. Python 2 ile şu an karşılaştığım aynı sorun ...;)
Falko

@Falko Kodumu süreçte daha uzun hale getirmeme rağmen sorunu çözmeyi başardım
Beta Çürüme

Ah, aferin! Sadece bazı küçük açıklamalar: m=input()size hiçbir şey kazandırmaz. Ve x=intaslında int(...)iki kez çağırmaktan 2 bayt daha uzun .
Falko

2

Mathematica 71 61

Martin Buttner sayesinde 10 karakter kurtardı.

Koddaki alanlar okunabilirlik içindir.

fsgirdi dizesi ve nkeşfedilen dize numaralarını çarpma sayısı olan bir işlevdir .

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

Örnekler

 s="This 1 is22a 3352sentence 50"

tamsayı

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

"Bu 3 is66a 10056sentence 150"


Rasyonel sayı

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

"Bu -7.13-156.86a -23899.8sentence -356.5"


Karmaşık sayı

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

"Bu -5 + 3 I-110 + 66 Ia -16760 + 10056 Isentence -250 + 150 I"


1
Mathematica'yı tanımıyorum. Ancak örneklerinizde tüm sayılar ve kelimeler boşluklarla ayrılmıştır. Doğrudan "abc42" gibi harflere eklenmiş sayılar için de çalışır mı?
Falko

Çünkü StringReplaceboşluk olup olmadığı hiç fark etmez. Başlangıçta Chiperyman tarafından verilen örnekleri kullandım.
DavidC

Güncellenmiş örneğe geçtim. (Daha önce Chiperyman tarafından verilen örneği kullanmıştım.) Çünkü StringReplaceboşluk olup olmadığı hiç fark etmiyor.
DavidC

2

Yakut 40

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

Stdin'den girdi.

Örnek çalışma:

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

Çevrimiçi demo: http://ideone.com/4BiHC8


2

Lua: 73 69 karakter

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

Örnek çalışma:

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
Her şeyi bir satıra koyarak ve ")" yanındaki yönergeleri smooshing ile biraz daha golf yapabilirsiniz. "S = r () n = ()" gibi gayet iyi.
AndoDaan

1
Doh ve ben sadece birkaç hafta önce Lua'da golf oynamak için ipuçlarını okudum . :( Teşekkürler, @AndoDaan.
manatwork

2

JavaScript, ES6, 43 karakter

Bu benim ilk golf girişimim!

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

Bunu en son Firefox'un Konsolunda çalıştırın. İlk giriş sayıdır ve ikinci giriş sayıların ilk giriş numarasıyla çarpılacağı dizedir.

Son istem çıktıyı listeler.


İlk çekim için oldukça güzel JS Golf!
Doktor

Önce sayı okunduysa, diğer birçok yanıt daha kısa olabilir. Bu çok daha kolaydı.
manatwork

@manatwork - Evet, ama soru sipariş üzerinde herhangi bir tercih vermiyor, bu yüzden iyi olması gerektiğini düşünüyorum.

Doğru. Bu sorunun kendisinin eksikliği. Şahsen cevaplarımda diğerleriyle karşılaştırılabilir tutmak için string + number düzeninde girdi işlemeyi tercih ettim.
manatwork

1

Perl - 48 karakter

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

İlk satırdaki bir sayıyı okuyun, ardından bir cümleyi okuyun ve rakamlardan oluşan veya olmayan rakamlardan ayırın. Sayı olmayanları oldukları gibi yazdırın ve sayılar çarpılır.


1

J - 63 karakter

Program önce sayıyı ve sonra cümleyi okur.

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

Patlama ile açıklanıyor:

;(*&.".&(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'nin PCRE kütüphanesini kullanırsak ve cümlenin önce gelmesini sağlarsak, bunu 54 karaktere indirebiliriz :

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

Patlama ile açıklanıyor:

                                                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 bu konuda kötü, ne diyebilirim. Bu elverişsiz çünkü J çok zorlayıcı.

Bazı örnekler:

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

Örnek giriş:

7
CJ4M W1LL H4V3 R3GUL4R 3XPR35510N5 L4T3R

Örnek çıktı:

CJ28M W7LL H28V21 R21GUL28R 21XPR248570N35 L28T21R

Açıklama:

Program her karakterden geçer ve yığındaki rakamları toplar ve her rakam olmayan için önce toplanan sayıyı (varsa) sayısal girişle çarparak yazdırır, sonra karakteri yazdırır.

li:X;sayısal girdiyi okur ve bunu X'te saklar
lN+, dizeyi okur ve dizedeki
{…}/her karakter için yeni bir satır ekler (izleyen sayılarla yardımcı olur)
- _skarakteri kopyalar ve dizeye dönüştürür
- A,s-,tüm basamakları kaldırır ve kalan karakterleri sayar; karakter bir rakamsa sonuç 0 veya değilse 1 olur
- sayı 1 ise {…}*bloğu yürütür (örn. rakam olmayan); basamaklar için hiçbir şey yapmaz, bu nedenle yığın üzerinde kalırlar
- yığındaki ]karakterleri bir diziye (yani bir dizeye) toplar; karakterler önceki iterasyonlardan herhangi bir rakam ve artı mevcut karakter
- )\son öğeyi (geçerli karakter) ayırır ve (kalan) dizeden önce taşır
- _!!dizeyi kopyalar ve bir boole değerine dönüştürür - boşsa 0, değilse 1
- {…}*dize boş değilse bloğu yürütür, yani geçerli sayısal olmayan karakterden önce bazı rakamlar vardı
--- iX*dizeyi dönüştürür X ile tamsayı ve çoğalır için
- oyığının üst basar - bir dizi yoktu çarpılan sayı veya boş dize
- o(2 bir) istifin tepesine basar - mevcut olmayan rakam karakteri


Bu daha akılcı bir yaklaşım.
Dennis

1

Haskell (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

Ne yazık ki, Haskell'in Prelude'sunda bir Regex kütüphanesi yok .


güzel golf; en dıştaki {}değeri 1 karakterlik bir kazanç için silebilirsiniz . Ayrıca, bu Haskell çözümünü 70 bayt ile gönderdim: codegolf.stackexchange.com/questions/37110/…
proud haskeller 26:14

1

flex (-lexer) ( 94 89 karakter)

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

Komut satırı argümanını unutursanız segfault olmayan sürüm (çok daha uzun değil):

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

Şununla derleyin:

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

veya:

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

Örneğin:

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

Çalıştırılabilir örneği görmek için başlığa tıklayın

Denenen Örnekler:

Bu 122a 3352sentence 50
3
Bu 366a 10056sentence 150


Bu 1 is22a 3352sentence 50
42
Bu 42 is924a 140784sentence 2100


0

GNU Awk: 86 karakter

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

Örnek çalışma:

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

İki sürüm, daha yeni php sürümleri bunu yapabilir:

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

Eski php sürümleri: Ben newline saymadım, okunabilirlik için ekledi.

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

Örnek giriş + çıkış

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

Çok zor, 'işlev' ve 'preg_replace_callback' kelimeleri çok fazla karakter alıyor.
Ardından $ var (-2 karakter) gelirse arkasından globalve arkasından returngereken boşluk


\dKarakter sınıfına girmeye gerek yok (-2 karakter); işlevi çift tırnak içine almanıza gerek yoktur (-2 karakter); noktalı virgülle (+1 karakter) işlevin içindeki ifadeyi düzgün bir şekilde sonlandırmanız gerekir. Bu arada, \dçift ​​tırnaklı dize olarak yazılmalıdır \\d, bu yüzden daha iyi tırnak tek tırnak olarak değiştirin.
manatwork

Teşekkürler. [0-9] ile başladı, 0-9\ d olarak değiştirildi . İşlev etrafında tırnak hakkında emin değildi, ben bir test edemez, benim yerel php sürümü izin vermez.
Martijn

Çift tırnak işaretleri iyi çalışıyor (en azından benim için) :)
Martijn

0

C ( 142134 karakter)

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

Geliştirilmiş okunabilirlik için satırsonu eklendi. Faktörü ilk olarak, dizeyi ikinci komut satırı seçeneği olarak iletin. Bu uygulama dprintfPOSIX.1 2008'in bir parçası olan ve Windows'ta bulunmayan bir işlevi gerektirir . İşte küçülmemiş kaynak:

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

İyileştirmeler

  • 142 → 134: Dize üzerinde döngü yapmak yerine strspnve strcspnkullanın.

0

Python 89

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

Örneğin:

# python numberstring.py 3 '1shoop da2 w007p!'
3shoop da6 w21p!

0

Asi - 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 karakter

Ben Clojure'lu bir acemiyim ama FWIW:

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

Örnek çalışma:

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

Ungolfed (çirkin ama umarım biraz daha kolay):

(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

Birisi java yapmak zorundaydı. Giriş dizesi, komut satırında 2 jetondur.

java M 'Bu 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
Testime göre, ifdurum |1 karakter daha kısa olan bitsel olarak da çalışıyor .
manatwork

Teşekkürler. Kod güncellendi. (Aslında hala bir boole veya sadece değerlendirme kısayolu olmadan).
Florian F

0

İki cevap: +

Saf bash (~ 262)

İlk olarak, çok kısa olmayan saf bir bash versiyonu var (çatal yok, harici ikili yok)!

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
}

Haydi göster:

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

(Bu tamamen imkansız bir cümledir)

Perl biraz şaşırttı (sadece eğlence için)

Bu sürüm ( @ Chilemagic'in cevabına dayanarak ) daha kısa değil, bir totem komut dosyası olarak tasarlanmıştır :

cat <<eof >mn.pl

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

eof chmod +x mn.pl

Örnek çalışma:

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

0

Haskell, 70

çok kötü Çok geç kaldım IMHO bu özel soru ve dil için oldukça iyi. buradaki diğer Haskell çözümü 161 karakterdir ..

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

Bu, readsbir dizeyi Kısmen ayrıştıran işlevi kullanarak çalışır . örneğin reads "34abc" = [(34, "abc")],. bu açıkça bu meydan okuma için mükemmel yapar.

kullanımı:

*Main> " This 1 is22a 3352sentence 50"%3
" This3 is66a10056sentence150"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.