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.