Lipat gandakan semua angka dalam sebuah string

19

Pemenang: Chilemagic , 21 byte besar!

Anda dapat terus mengirimkan jawaban Anda, namun Anda tidak bisa lagi menang. Pos asli disimpan:


Tujuan Anda adalah menemukan semua angka dalam string, dan mengalikan masing-masing secara individual dengan input nilai oleh pengguna

  • Anda tidak perlu khawatir tentang desimal
  • Pengguna akan memasukkan angka dan string
  • Pengguna harus mengetikkan angka dan string di beberapa titik, namun metode yang dibaca program itu tidak masalah. Bisa dengan stdin, membaca file teks, dll, namun pengguna harus menekan tombol 9 pada keyboard mereka (misalnya) di beberapa titik
  • Apa pun yang dapat dikompilasi dan dijalankan dapat diterima

Contoh:

Input kalimat: 1 ini adalah22a 3352sensi 50

Input angka: 3

Output: 3 is66a 10056sentence 150 ini


  • Kontes ini berakhir pada 6 September 2014 (7 hari sejak posting).
  • Ini adalah , sehingga kode terpendek menang
Jon
sumber
Angka apa pun harus dikalikan. Saya memperbarui contoh saya.
Jon
Saya tidak mengerti pentingnya atau penggunaan "tekan tombol 9" dalam tantangan Anda. Bagaimana atau di mana penerapannya dalam contoh yang diberikan?
Darren Stone
3
@Darren Dia pada dasarnya mengatakan bahwa Anda tidak dapat membuat hardcode nomor tersebut.
Beta Decay
2
Bisakah kita membuat asumsi tentang ukuran angka yang terlibat, khususnya kemungkinan meluap? Bergantung pada hasil di atas, apakah kita memperlakukan "-1234" sebagai "-" diikuti oleh 1234 atau sebagai -1234?
Alchymist
1
Untuk menambah pertanyaan @ IlmariKaronen: Apa yang harus dilakukan dengan nol terkemuka seperti dalam "Bond is agent 007" -> "Bond adalah agent 21" atau "Bond is agent 0021" atau "Bond is agent 021" atau ...?
Hagen von Eitzen

Jawaban:

24

Perbarui - Perl - 17

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

15 karakter + 2 untuk -idan -pbendera.

Kita dapat menggunakan -iflag untuk memasukkan ekstensi file, tetapi karena kita tidak membaca file apa pun, kita dapat menggunakannya untuk mendapatkan nomor dan variabel $^Iakan ditugaskan padanya.

Jalankan dengan:

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

Perl - 21

Diperbarui sesuai komentar @ Dennis.

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

Jalankan dengan -pbendera.

Contoh dijalankan:

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

Penjelasan:

$n=<>; baca di nomor tersebut

-p mencetak hasilnya

s/\d+/$&*$n/geBaca input dengan <> dan cari satu digit atau lebih dan gantikan dengan digit dikalikan angka. gbersifat global, eadalah evalramuan ganti s ///. $&berisi apa yang cocok dan dikalikan dengan angka $n,.

Anda dapat membaca lebih lanjut tentang s///di perlop dan lebih lanjut tentang Perl regexes di perlre .

Solusi lain:

@ F. Hauri menunjukkan Anda juga dapat menggunakan s saklar untuk menetapkan $nvariabel ke 4. Saya tidak yakin berapa banyak karakter yang dihitung tetapi saya akan meninggalkannya di sini:

perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'
hmatt1
sumber
Saya pikir Anda dapat menyimpan beberapa karakter dengan menggunakan <>=~alih-alih _$=<>;. Bisakah Anda jelaskan apa arti sbagian dari regex, bagi kami pemula?
Tal
@Tal String.
Kaz Wolfe
3
@ Baru, saya cukup yakin itu untuk "substitusi"
Martin Ender
1
1. Jika Anda menggunakan $&alih-alih $1, Anda dapat menyingkat (\d)menjadi \d. 2. Jika Anda menggunakan -psakelar dan mengubah urutan input, Anda dapat menjatuhkan say<>=~dan r.
Dennis
1
Anda dapat menggunakan -sswitch, untuk whipe $n=<>out: perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'(jangan membuat: This 4 is88a 13408sentence 200)
F. Hauri
9

JavaScript (ES6) - 48 44 karakter

Terima kasih kepada @bebe karena telah menyimpan satu karakter. Pembaruan: 8 / Mar / 16, menghapus empat karakter lainnya

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

Tidak Disatukan :

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

Membutuhkan input angka terlebih dahulu dan kemudian kalimat. Potong satu char lagi di sini, terima kasih @bebe lagi!

Gaurang Tandon
sumber
Anda tidak perlu mengurai input angka
bebe
@ Bebe Tentu saja! Saya tidak memperhatikan! Terima kasih banyak!
Gaurang Tandon
(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))satu lagi (tapi ini meminta pengganda dulu)
bebe
@ Bebe Terima kasih untuk ini juga!
Gaurang Tandon
6

Python 2 (79)

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

Contoh dijalankan

Memasukkan:
$ python mult.py
3
"This 1 is22a 3352sentence 50"
Keluaran:
This 3 is66a 10056sentence 150

Demo online: http://ideone.com/V6jpyQ

Cristian Lupascu
sumber
Cemerlang. Saya kira re.submetode Beta Decay dan saya (dua pengiriman Python lainnya) sedang mencoba untuk mengimplementasikan kembali. Itu akan sangat mudah ... Hal lain yang telah saya pelajari! ;)
Falko
@Falko re.subsamping, Anda telah melakukan pekerjaan yang sangat baik di golf logika ganti string
Cristian Lupascu
@Falko Saya setuju, re.subitulah yang saya inginkan!
Beta Decay
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

Input pertama: integer n.

Input kedua: string s(dengan tanda kutip, misalnya "abc42").

Falko
sumber
4

CJam, 47 33 30 byte

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

Membaca angka dan string (dalam urutan itu dan dipisahkan oleh satu spasi) dari STDIN.

Cobalah online.

Contoh dijalankan

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

Bagaimana itu bekerja

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.     ";
Dennis
sumber
Ini adalah kode paling aneh yang pernah ada !!!
azerafati
1
@Bludream: Ini bahkan bukan kode paling aneh yang saya tulis . : P
Dennis
Hmm, 3 * 7 = 27?
aditsu
lol, ya memilih keduanya. Padahal ini tidak akan membuat dunia menjadi tempat yang lebih baik. Bagaimana bahasa pemrograman yang seharusnya bisa dibaca berubah menjadi ini ??
azerafati
@ Aditsu: Memisahkan vs berulang, pertempuran berlanjut. : P
Dennis
4

Bash + coreutils, 38 byte

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

Membaca string input dari STDIN dan pengganda sebagai parameter baris perintah.

Keluaran:

$ ./multstr.sh 3 <<< "This 1 is22a 3352sentence 50"
This 3 is66a 10056sentence 150
$ 
Trauma Digital
sumber
6
Ide yang menarik, tetapi ini hanya akan berfungsi jika string tidak mengandung karakter yang spesial untuk Bash ... Ini adalah contoh string yang tidak akan saya coba:1 D4R3 Y0U: ; rm -rf /
Dennis
@ Dennis ya itu peringatan yang agak disayangkan
Digital Trauma
3

C # di LINQPad, 124

Mudah. Silakan gunakan CTRL + 2 di LINQPad (Bahasa: Pernyataan C #).

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

Jika pengali diberikan sebagai parameter input pertama, itu dapat dilakukan dalam 116 karakter:

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

EDIT:

Berkat komentar Abbas di bawah ini, ini bahkan dapat dipasangkan lebih banyak dengan menggunakan metode statis Regex , daripada membuat contoh:

var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int‌​.Parse(t.Value)*k).Dump();
Yakub
sumber
Bagus, kode-golf di C # tidak mudah! Saya tidak ingin mendapatkan perwakilan dari upaya Anda, jadi saya akan memberi Anda tip alih-alih memposting jawaban saya sendiri: gunakan Regex statis. Ganti (string, string, string), bukan Regex baru ("...") .Menggantikan(...); Berikut versi multiplier-pertama pendek: var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int.Parse(t.Value)*k).Dump();. Dalam kedua versi ini menyimpan 5 karakter lain, membuat Anda mendapatkan 119 untuk versi panjang dan 111 untuk versi pengali-pertama
Abbas
1
Terima kasih atas tipnya, namun, saya memutuskan untuk tidak mengubah jawaban asli saya, sehingga orang lain akan dapat belajar apa yang tidak boleh dilakukan dari saya, dan apa yang harus dilakukan dari Anda - mengenai C # Regex Golfing.
Yakub
Saya mengerti Anda tetapi Anda juga bisa menambahkan tip saya dalam jawaban Anda sebagai hasil edit . Pengguna cenderung membaca ini lebih dari daftar komentar dengan tip.
Abbas
Tentu. Jawabannya telah diedit.
Jacob
2

Cobra - 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]")
Suram
sumber
2

Python 3 - 141

Saya tidak berpikir saya bisa bermain golf ini lagi ...

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)

Contoh:

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

10
hello100 hello100
hello1000 hello1000
Peluruhan Beta
sumber
2
Sayangnya pendekatan ini tidak berhasil. Untuk n=2dan s="1 2"hasilnya 4 4, karena replacememodifikasi angka pertama dua kali. Itu masalah yang sama yang saya hadapi sekarang dengan Python 2 ...;)
Falko
@Falko Saya sudah berhasil memperbaiki masalah, meskipun membuat kode saya lebih lama dalam proses
Beta Decay
Oh, bagus sekali! Hanya beberapa komentar kecil: tidak akan m=input()menyelamatkan Anda. Dan x=intsebenarnya 2 byte lebih lama dari memanggil int(...)dua kali.
Falko
2

Mathematica 71 61

Dengan 10 karakter tersimpan, terima kasih kepada Martin Buttner.

Spasi dalam kode adalah untuk keterbacaan.

fadalah fungsi di mana sadalah string input dan nnomor untuk mengalikan angka string yang ditemukan oleh.

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

Contohnya

 s="This 1 is22a 3352sentence 50"

Bilangan bulat

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

"3 is66a 10056sentence 150"


Bilangan rasional

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

"-7.13 ini adalah-156.86a -23899.8sentence -356.5"


Bilangan kompleks

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

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

DavidC
sumber
1
Saya tidak tahu Mathematica. Tetapi dalam contoh Anda semua angka dan kata dipisahkan oleh spasi. Apakah itu berfungsi untuk angka-angka yang secara langsung dilampirkan pada huruf juga, seperti "abc42"?
Falko
Sebab StringReplacetidak ada bedanya apakah ada spasi. Saya menggunakan contoh-contoh yang awalnya diberikan oleh Chiperyman.
DavidC
Saya beralih ke contoh yang diperbarui. (Saya telah menggunakan contoh yang diberikan sebelumnya oleh Chiperyman.) Untuk StringReplaceitu tidak ada bedanya apakah ada spasi.
DavidC
2

Ruby 40

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

Masukan dari stdin.

Contoh dijalankan:

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

Demo online: http://ideone.com/4BiHC8

Cristian Lupascu
sumber
2

Lua: 73 69 karakter

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

Contoh dijalankan:

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
manatwork
sumber
1
Anda bisa bermain golf sedikit lebih banyak dengan meletakkan semuanya pada satu baris, dan instruksi smoohing di sebelah ")". Seperti "s = r () n = ()" tidak apa-apa.
AndoDaan
1
Doh, dan saya membaca Tip untuk bermain golf di Lua hanya beberapa minggu yang lalu. :( Terima kasih, @AndoDaan.
manatwork
2

JavaScript, ES6, 43 karakter

Ini adalah usaha pertama saya bermain golf!

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

Jalankan ini di Konsol Firefox terbaru. Input pertama adalah angka dan input kedua adalah string dari mana angka-angka harus dikalikan dengan nomor input pertama.

Prompt terakhir berisi daftar output.


sumber
JS Golf yang cukup bagus untuk timer pertama!
Pengoptimal
Banyak jawaban lain bisa lebih pendek jika nomor dibaca terlebih dahulu. Itu jauh lebih mudah.
manatwork
@manatwork - Ya, tapi pertanyaannya tidak memberikan preferensi pada pesanan, jadi saya pikir itu harus baik-baik saja.
Benar. Ini adalah kurangnya pertanyaan itu sendiri. Secara pribadi saya lebih suka menangani input dalam urutan nomor string dalam jawaban saya agar mereka dapat dibandingkan dengan yang lain.
manatwork
1

Perl - 48 karakter

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

Baca angka di baris pertama, lalu baca sebuah kalimat dan pisahkan menjadi beberapa bagian baik digit maupun non-digit. Cetak non-digit apa adanya, dan angkanya dikalikan.

Tal
sumber
1

J - 63 char

Program membaca angka, dan kemudian kalimat.

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

Dijelaskan oleh ledakan:

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

Jika kita bisa menggunakan pustaka PCRE J dan membuat kalimat menjadi yang utama, kita bisa merobohkannya menjadi 54 karakter :

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

Dijelaskan oleh ledakan:

                                                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 buruk dalam hal ini, apa yang bisa saya katakan. Ini merepotkan karena J sangat tidak imperatif.

Beberapa contoh:

   ;(*&.".&(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
algoritme hiu
sumber
1

CJam - 35

li:X;lN+{_sA,s-,{])\_!!{iX*}*oo}*}/

Cobalah di http://cjam.aditsu.net/

Input sampel:

7
CJ4M W1LL H4V3 R3GUL4R 3XPR35510N5 L4T3R

Output sampel:

CJ28M W7LL H28V21 R21GUL28R 21XPR248570N35 L28T21R

Penjelasan:

Program melewati setiap karakter, mengumpulkan digit pada tumpukan, dan untuk setiap non-digit pertama-tama mencetak angka yang dikumpulkan (jika ada) dikalikan dengan input numerik, kemudian mencetak karakter.

li:X;membaca input numerik dan menyimpannya dalam X
lN+membaca string dan menambahkan baris baru (ini membantu dengan membuntuti angka)
{…}/untuk setiap karakter dalam string
- _smenyalin karakter dan mengubahnya menjadi string
- A,s-,menghapus semua digit dan menghitung karakter yang tersisa; hasilnya akan 0 jika karakter adalah digit atau 1 jika tidak
- {…}*mengeksekusi blok jika hitung adalah 1 (yaitu non-digit); untuk digit itu tidak melakukan apa-apa, jadi mereka tetap berada di stack
- ]mengumpulkan karakter dari stack ke dalam array (yaitu string); karakter adalah setiap digit dari iterasi sebelumnya, ditambah karakter saat ini
- )\memisahkan item terakhir (karakter saat ini) dan memindahkannya sebelum string (tersisa)
- _!!menyalin string dan mengubahnya menjadi nilai boolean - 0 jika kosong, 1 jika tidak
- {…}*mengeksekusi blok jika string tidak kosong, yaitu kami memiliki beberapa digit sebelum karakter non-digit saat ini
--- iX*mengonversi string untuk integer dan dikalikan dengan X
- omencetak bagian atas tumpukan - baik angka yang dikalikan atau string kosong jika kita tidak memiliki nomor
- o(yang ke-2) mencetak bagian atas tumpukan yang baru - yang saat ini tidak karakter digit

aditsu
sumber
Itu pendekatan yang jauh lebih waras.
Dennis
1

Haskell (161)

Golf

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}

Tidak disatukan

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

Sayangnya, Haskell tidak memiliki perpustakaan Regex di Prelude -nya .

Zeta
sumber
golf yang bagus; Anda dapat menghapus bagian terluar {}untuk mendapatkan 1 karakter. juga, saya baru saja memposting solusi Haskell ini dengan 70 byte: codegolf.stackexchange.com/questions/37110/…
bangga haskeller
1

flex (-lexer) ( 94 89 karakter)

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

Versi tidak dikelompokkan yang tidak segfault jika Anda lupa argumen baris perintah (tidak lebih lama):

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

Kompilasi dengan:

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

atau:

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

Misalnya:

$ ./m 163
This 1 is22a 3352sentence 50
This 163 is3586a 546376sentence 8150
Rici
sumber
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

Klik pada judul untuk melihat contoh runnable

Contoh Mencoba:

Ini 1 is22a 3352ensi 50
3
Ini 3 is66a 10056ensi 150


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

Anak kecil
sumber
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}

Contoh dijalankan:

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
manatwork
sumber
0

PHP - 75/115 68/109

Dua versi, versi php yang lebih baru dapat melakukan ini:

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

Versi php yang lebih lama: Saya tidak menghitung baris baru, menambahkannya agar mudah dibaca.

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

Contoh input + output

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

Agak sulit, kata-kata 'fungsi' dan 'preg_replace_callback' membutuhkan banyak karakter.
Ruang setelah globaldan tidak returndiperlukan jika diikuti oleh $ var (-2 chars)

Martijn
sumber
Tidak perlu dimasukkan ke \dkelas karakter (-2 karakter); tidak perlu melampirkan fungsi dalam tanda kutip ganda (-2 karakter); Anda harus menghentikan pernyataan di dalam fungsi dengan semicolon (+1 char) dengan benar. By the way, \ddalam string dikutip ganda harus ditulis \\d, jadi lebih baik mengubah tanda kutip menjadi tanda kutip tunggal.
manatwork
Terima kasih. Dimulai dengan [0-9], diubah 0-9ke \ d. Tidak yakin tentang tanda kutip di sekitar fungsi, saya tidak bisa menguji yang satu, versi php lokal saya tidak mengizinkannya.
Martijn
Kutipan ganda berfungsi dengan baik (setidaknya untuk saya) :)
Martijn
0

C ( 142 134 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));}

Baris baru dimasukkan untuk meningkatkan keterbacaan. Lewati faktor sebagai yang pertama, string sebagai opsi baris perintah kedua. Implementasi ini memerlukan dprintffungsi yang merupakan bagian dari POSIX.1 2008 dan mungkin tidak tersedia di Windows. Berikut adalah sumber yang tidak dijinakkan:

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

Perbaikan

  • 142 → 134: Gunakan strspndan strcspnbukannya melompati string.
FUZxxl
sumber
0

Python 89

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

misalnya:

# python numberstring.py 3 '1shoop da2 w007p!'
3shoop da6 w21p!
Sammitch
sumber
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


Tidak Disatukan:

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
draegtun
sumber
0

Clojure - 141 140 128 karakter

Saya seorang pemula Clojure, tetapi FWIW:

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

Contoh dijalankan:

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

Tidak disatukan (jelek tapi mudah-mudahan agak lebih mudah dibaca):

(let [[a b] *command-line-args*]
    (println ( (fn [s n] 
                    (clojure.string/replace 
                        s 
                        #"\d+" 
                        #(str (* (read-string %) (read-string n)))))
                    a b)))
Michael Easter
sumber
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]!=''])
Xirion11
sumber
0

Jawa 218

Seseorang harus melakukan java. String input adalah 2 token pada baris perintah.

java M '1 ini adalah22a 3352sensi 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);
    }
}
Florian F
sumber
1
Menurut pengujian saya, ifkondisinya bekerja dengan bitwise |juga, yaitu 1 karakter lebih pendek.
manatwork
Terima kasih. Kode diperbarui. (Ini sebenarnya masih boolean atau, hanya tanpa jalan pintas evaluasi).
Florian F
0

Dua jawaban: +

Bash murni (~ 262)

Pertama, ada versi bash murni yang tidak terlalu pendek (tanpa garpu, tidak ada binari eksternal)!

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
}

Mari kita tunjukkan:

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

(Yang merupakan kalimat yang benar-benar mustahil)

Perl sedikit dikaburkan (hanya untuk bersenang-senang)

Versi ini (berdasarkan jawaban @ Chilemagic ) tidak lebih pendek, tetapi dirancang sebagai skrip totem :

cat <<eof >mn.pl

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

eof chmod +x mn.pl

Contoh dijalankan:

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

Haskell, 70

Sayang sekali aku terlambat IMHO ini cukup bagus untuk pertanyaan dan bahasa khusus ini. solusi Haskell lainnya di sini adalah 161 karakter ..

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

ini bekerja dengan menggunakan readsfungsi yang mem-parsing string secara parsial. misalnya reads "34abc" = [(34, "abc")],. ini jelas membuatnya sempurna untuk tantangan ini.

pemakaian:

*Main> " This 1 is22a 3352sentence 50"%3
" This3 is66a10056sentence150"
haskeller bangga
sumber