ทวีคูณตัวเลขทั้งหมดในสตริง


19

ผู้ชนะ: Chilemagicขนาดใหญ่ 21 ไบต์!

คุณสามารถส่งคำตอบของคุณต่อไปได้ แต่คุณจะไม่สามารถชนะได้อีกต่อไป โพสต์ต้นฉบับเก็บไว้:


เป้าหมายของคุณคือค้นหาตัวเลขทั้งหมดในสตริงและคูณแต่ละค่าด้วยการป้อนค่าโดยผู้ใช้

  • คุณไม่จำเป็นต้องกังวลเรื่องทศนิยม
  • ผู้ใช้จะใส่ตัวเลขและสตริง
  • ผู้ใช้จะต้องพิมพ์ตัวเลขและสตริงในบางจุดอย่างไรก็ตามวิธีการที่โปรแกรมอ่านไม่สำคัญ มันอาจจะเป็นกับ stdin อ่านไฟล์ข้อความ ฯลฯ อย่างไรก็ตามผู้ใช้จะต้องกดปุ่ม 9 บนแป้นพิมพ์ของพวกเขา (ตัวอย่าง) ในบางจุด
  • สิ่งใดก็ตามที่สามารถคอมไพล์และรันได้นั้นยอมรับได้

ตัวอย่าง:

อินพุตประโยค: 1 นี้คือ 22a 3352 ส่ง 50

ใส่ตัวเลข: 3

ผลลัพธ์: 3 นี้คือ 66a 10056 การส่ง 150


  • การประกวดนี้จะสิ้นสุดใน 6 กันยายน 2014 (7 วันจากการโพสต์)
  • นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ

หมายเลขใด ๆ ที่จะคูณ ฉันอัปเดตตัวอย่างของฉัน
Jon

ฉันไม่เข้าใจความสำคัญหรือการใช้ "กดปุ่ม 9" ในการท้าทายของคุณ นำไปใช้กับตัวอย่างที่กำหนดได้อย่างไรหรือที่ไหน?
Darren Stone

3
@Darren โดยทั่วไปเขาบอกว่าคุณไม่สามารถเข้ารหัสหมายเลขได้ยาก
สลายตัวเบต้า

2
เราสามารถตั้งสมมติฐานเกี่ยวกับขนาดของตัวเลขที่เกี่ยวข้องโดยเฉพาะความเป็นไปได้ของการล้นได้หรือไม่? เราปฏิบัติต่อ "-1234" ในฐานะ "-" ตามด้วย 1234 หรือตาม -1234 ขึ้นอยู่กับผลลัพธ์ข้างต้นหรือไม่
เล่นแร่แปรธาตุ

1
หากต้องการเพิ่มคำถามของ @ IlmariKaronen: จะทำอย่างไรกับศูนย์นำหน้าเช่น "Bond is agent 007" -> "Bond is agent 21" หรือ "Bond is agent 0021" หรือ "Bond is agent 021" หรือ ...
Hagen von Eitzen

คำตอบ:


24

อัพเดท - Perl - 17

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

15 ตัวอักษร + 2 สำหรับ-iและ-pธง

เราสามารถใช้การ-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อ่านอินพุตด้วย <> และค้นหาตัวเลขหนึ่งหลักขึ้นไปและแทนที่ด้วยตัวเลขคูณด้วยตัวเลข gis global, eเป็นevalpotion แทนที่ของ s /// มีสิ่งที่ถูกจับคู่และคูณด้วยจำนวนที่$&$n

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับs///ในperlopและอื่น ๆ เกี่ยวกับ Perl regexes ในperlre

ทางออกอื่น:

@ F.Hauri ชี้ให้เห็นว่าคุณยังสามารถใช้s สวิตช์เพื่อกำหนด$nตัวแปรให้กับ 4 ฉันไม่แน่ใจว่าจำนวนตัวละครนี้นับเป็น แต่ฉันจะทิ้งไว้ที่นี่:

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

ฉันคิดว่าคุณสามารถบันทึกตัวอักษรอีกไม่กี่โดยใช้แทน<>=~ _$=<>;คุณสามารถอธิบายsความหมายของ regex ให้เรารู้ได้อย่างไร
Tal

@Tal String.
Kaz วูล์ฟ

3
@Mew ฉันค่อนข้างแน่ใจว่ามันเป็น "การทดแทน"
Martin Ender

1
1. ถ้าคุณใช้$&แทน$1คุณสามารถร่นไป(\d) \d2. ถ้าคุณใช้-pสวิทช์และเปลี่ยนลำดับการป้อนข้อมูลที่คุณสามารถวางและsay<>=~ r
เดนนิส

1
คุณอาจจะใช้-sสวิทช์เพื่อ whipe $n=<>ออก: perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'(ไม่แสดงผล: This 4 is88a 13408sentence 200)
เอฟ HAURI

9

JavaScript (ES6) - 48 44 ตัวอักษร

ขอบคุณ@bebeสำหรับการบันทึกอักขระหนึ่งตัว อัปเดต: 8 / Mar / 16 ลบออกอีกสี่ตัวอักษร

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

Ungolfed :

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 แน่นอน! ฉันไม่ได้สังเกต! ขอบคุณมาก!
Gaurang Tandon

(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))อีกอันหนึ่ง (แต่สิ่งนี้จะขอตัวทวีคูณก่อน)
bebe

@bebe ขอบคุณสำหรับสิ่งนี้ด้วย!
Gaurang Tandon

6

Python 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 และ I (อีกสอง Python ที่ส่งมา) กำลังพยายามปรับใช้อีกครั้ง คงเป็นเรื่องง่ายมาก ... อย่างอื่นที่ฉันได้เรียนรู้! ;)
Falko

@Falko re.subกันคุณได้ทำงานที่ยอดเยี่ยมในการเล่นสตริงแทนที่ตรรกะ
Cristian Lupascu

@Falko ฉันเห็นด้วยre.subเป็นสิ่งที่ฉันต้องการ!
สลายตัวเบต้า

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

แรกอินพุท: nจำนวนเต็ม

อินพุตที่สอง: สตริงs(ที่มีเครื่องหมายคำพูดเช่น"abc42")


4

CJam, 47 33 30 ไบต์

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

อ่านตัวเลขและสตริง (ตามลำดับนั้นและคั่นด้วยช่องว่างเดียว) จาก STDIN

ลองออนไลน์

ตัวอย่างการวิ่ง

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

นี่เป็นโค้ดที่แปลกประหลาดที่สุด !!!
azerafati

1
@Bludream: นี่คือไม่ได้รหัสที่แปลกประหลาดผมเคยเขียน : P
Dennis

อืม 3 * 7 = 27?
aditsu

ฮ่า ๆ ใช่โหวตให้ทั้งสอง แม้ว่าสิ่งเหล่านี้จะไม่ทำให้โลกนี้น่าอยู่ขึ้น วิธีการเขียนโปรแกรมภาษาบนโลกที่ควรจะอ่านกลายเป็นนี้?
azerafati

@aditsu: การแยก vs iterating การต่อสู้ดำเนินต่อไป : P
Dennis

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 /
เดนนิส

@ เดนนิสใช่นั่นเป็นข้อแม้ที่ค่อนข้างโชคร้าย
Digital Trauma

3

C # ใน LINQPad, 124

ซื่อตรง กรุณาใช้CTRL + 2ใน LINQPad (ภาษา: คำสั่ง 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 # ไม่ใช่เรื่องง่าย! ฉันไม่ต้องการรับความพยายามของคุณดังนั้นฉันจะให้คำแนะนำแทนการโพสต์คำตอบของฉัน: ใช้Regex แบบคงที่ แทนที่ (สตริง, สตริง, สตริง)แทน Regex ใหม่ ("... ") .Replace ( ... ); var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int.Parse(t.Value)*k).Dump();ต่อไปนี้เป็นรุ่นแรกคูณสั้น: ในทั้งสองรุ่นนี้ช่วยประหยัดอีก 5 ตัวอักษรรับคุณใน 119 สำหรับรุ่นยาวและ 111 สำหรับรุ่นตัวคูณแรก
Abbas

1
ขอบคุณสำหรับเคล็ดลับ แต่ฉันตัดสินใจที่จะไม่เปลี่ยนคำตอบดั้งเดิมของฉันเช่นที่คนอื่นจะสามารถเรียนรู้สิ่งที่ไม่ต้องทำจากฉันและสิ่งที่ต้องทำจากคุณ - เกี่ยวกับ C # Regex Golfing
จาค็อบ

ฉันเข้าใจคุณ แต่คุณสามารถเพิ่มเคล็ดลับในคำตอบของคุณเป็นการแก้ไขได้ ผู้ใช้มักจะอ่านสิ่งนี้มากกว่ารายการความคิดเห็นพร้อมเคล็ดลับ
Abbas

แน่ใจ คำตอบถูกแก้ไข
จาค็อบ

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=2และs="1 2"มันให้ผล4 4ตั้งแต่การreplaceแก้ไขตัวเลขแรกสองครั้ง นั่นเป็นปัญหาแบบเดียวกันกับที่ฉันกำลังเผชิญหน้ากับ Python 2 ... ;)
Falko

@Falko ฉันจัดการเพื่อแก้ไขปัญหาแม้ว่าจะทำให้รหัสของฉันยาวขึ้นในกระบวนการ
Beta Decay

โอ้ทำได้ดีมาก! ข้อสังเกตเล็กน้อย: m=input()ช่วยให้คุณไม่มีอะไร และx=intมีความยาวเกิน 2 ไบต์กว่าการโทรint(...)สองครั้ง
Falko

2

Mathematica 71 61

ด้วย 10 ตัวอักษรที่บันทึกไว้ต้องขอบคุณ Martin Buttner

ช่องว่างในรหัสมีไว้สำหรับการอ่าน

fเป็นฟังก์ชั่นที่sเป็นสตริงป้อนข้อมูลและ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 is-156.86a -23899.8sentence -356.5"


จำนวนเชิงซ้อน

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

"นี่ -5 + 3 ฉัน -110 + 66 Ia -16760 + 10056 Isentence -250 + 150 I"


1
ฉันไม่รู้ Mathematica แต่ในตัวอย่างของคุณตัวเลขและคำทั้งหมดคั่นด้วยช่องว่าง ใช้งานได้กับตัวเลขที่แนบกับตัวอักษรโดยตรงเช่น "abc42" หรือไม่
Falko

สำหรับStringReplaceมันทำให้ไม่มีความแตกต่างไม่ว่าจะมีช่องว่าง ฉันใช้ตัวอย่างที่ Chiperyman ให้มา แต่เดิม
DavidC

ฉันเปลี่ยนเป็นตัวอย่างที่อัปเดตแล้ว (ฉันได้ใช้ตัวอย่างที่ได้รับก่อนหน้านี้โดย Chiperyman.) StringReplaceมันทำให้ไม่มีความแตกต่างไม่ว่าจะมีช่องว่าง
DavidC

2

ทับทิม 40

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

ข้อมูลจาก stdin

ตัวอย่างการเรียกใช้:

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

การสาธิตออนไลน์: http://ideone.com/4BiHC8


2

Lua: 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
คุณสามารถตีกอล์ฟเพิ่มอีกนิดโดยใส่ทุกอย่างไว้ในบรรทัดเดียวและคำแนะนำที่เรียบเนียนถัดจาก ")" เช่นเดียวกับ "s = r () n = ()" นั้นดีมาก
AndoDaan

1
Doh และฉันอ่านคำแนะนำในการเล่นกอล์ฟใน Luaเมื่อสองสามสัปดาห์ที่แล้ว :( ขอบคุณ @AndoDaan.
จัดการ

2

JavaScript, ES6, 43 ตัวอักษร

นี่เป็นครั้งแรกที่ฉันพยายามตีกอล์ฟ!

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

รันสิ่งนี้ในคอนโซลล่าสุดของ Firefox อินพุตแรกคือตัวเลขและอินพุตที่สองคือสตริงที่ตัวเลขจะถูกคูณด้วยหมายเลขอินพุตแรก

พรอมต์สุดท้ายแสดงรายการเอาต์พุต


JS Golf เป็นคนแรกที่น่ารัก!
เครื่องมือเพิ่มประสิทธิภาพ

คำตอบอื่น ๆ อีกมากมายอาจสั้นลงถ้าอ่านตัวเลขก่อน นั่นง่ายกว่ามาก
จัดการ

@ 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

หากเราใช้ไลบรารี่ PCRE ของ J และทำให้ประโยคเป็นอันดับแรกเราสามารถเคาะได้ถึง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 แย่มากในเรื่องนี้ฉันจะพูดอะไรดี มันไม่สะดวกเพราะเจไม่ได้ให้ความสำคัญ

ตัวอย่างบางส่วน:

   ;(*&.".&(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;อ่านอินพุตตัวเลขและเก็บไว้ใน X
lN+อ่านสตริงและต่อท้ายบรรทัดใหม่ (ช่วยในการตามหลังตัวเลข)
{…}/สำหรับอักขระแต่ละตัวในสตริง
- _sคัดลอกอักขระและแปลงเป็นสตริง
- A,s-,ลบตัวเลขทั้งหมดและนับจำนวนอักขระที่เหลือ ผลลัพธ์จะเป็น 0 ถ้าตัวละครเป็นตัวเลขหรือ 1 ถ้าไม่ใช่
- {…}*ดำเนินการบล็อกถ้าการนับเป็น 1 (เช่นไม่ใช่ตัวเลข) สำหรับตัวเลขมันไม่ทำอะไรเลยดังนั้นมันจึงยังคงอยู่ในสแต็ก
- ]รวบรวมอักขระจากสแต็กเป็นอาร์เรย์ (เช่นสตริง) ตัวละครเป็นตัวเลขใด ๆ จากการทำซ้ำก่อนหน้านี้รวมทั้งตัวละครปัจจุบัน
- )\แยกรายการสุดท้าย (ตัวละครปัจจุบัน) และย้ายมันก่อนที่สตริง (เหลือ)
- _!!คัดลอกสตริงและแปลงเป็นค่าบูลีน - 0 ถ้าว่างเปล่า 1 ถ้าไม่ใช่
- {…}*ดำเนินการบล็อกถ้าสตริงไม่ว่างนั่นคือเรามีตัวเลขบางส่วนก่อนอักขระที่ไม่ใช่ตัวเลขปัจจุบัน
--- iX*แปลงสตริง เป็นจำนวนเต็มและคูณด้วย X
- oพิมพ์ด้านบนของสแต็ก - ทั้งจำนวนที่คูณหรือสตริงว่างถ้าเราไม่มีตัวเลข
- o(อันดับที่ 2) พิมพ์ด้านบนใหม่ของสแต็ก ตัวละครหลัก


นั่นเป็นวิธีที่สนุกมาก
เดนนิส

1

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

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

แต่น่าเสียดายที่ Haskell ไม่ได้มีห้องสมุดใน Regex ของโหมโรง


กอล์ฟที่ดี; คุณสามารถลบสิ่งที่อยู่นอกสุด{}เพื่อให้ได้ 1 char นอกจากนี้ฉันเพิ่งโพสต์โซลูชั่น Haskell นี้ด้วย 70 ไบต์: 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));}

เวอร์ชันที่ไม่ได้รับการอัปเดตซึ่งไม่ได้ segfault หากคุณลืมอาร์กิวเมนต์บรรทัดคำสั่ง (ไม่มาก):

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

คลิกที่ชื่อเพื่อดูตัวอย่าง runnable

ตัวอย่างที่พยายาม:

1 อันนี้คือ 22a 3352sentence 50
3
นี่คือ 3a66a 10056 เซ็นต์ 150


1 อันนี้คือ 22a 3352sentence 50
42
นี่ 42 คือ 924a 140784sentence 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

สองเวอร์ชันรุ่น 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' ใช้ตัวอักษรจำนวนมาก
ช่องว่างหลังจากglobalและreturnarent จำเป็นถ้าตามด้วย $ var (-2 ตัวอักษร)


ไม่จำเป็นต้องใส่\dคลาสอักขระ (-2 ตัวอักษร); ไม่จำเป็นต้องใส่ฟังก์ชันในเครื่องหมายคำพูดคู่ (-2 ตัวอักษร); คุณต้องยกเลิกคำสั่งอย่างถูกต้องในฟังก์ชั่นด้วยเครื่องหมายอัฒภาค (+1 ถ่าน) โดยวิธีการ\dในสตริงที่ยกมาสองครั้งควรจะเขียนเป็น\\dดังนั้นให้เปลี่ยนราคาเป็นคำพูดเดียว
จัดการ

ขอบคุณ เริ่มต้นด้วย [0-9] เปลี่ยน0-9เป็น \ d ไม่แน่ใจเกี่ยวกับเครื่องหมายคำพูดรอบฟังก์ชั่นฉันไม่สามารถทดสอบได้ว่าเวอร์ชัน php ในเครื่องของฉันไม่อนุญาต
Martijn

เครื่องหมายคำพูดคู่ใช้งานได้ดี (อย่างน้อยสำหรับฉัน) :)
Martijn

0

C ( 142 134 ตัวอักษร)

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

แทรกบรรทัดใหม่เพื่อเพิ่มความชัดเจน ส่งค่าปัจจัยเป็นสตริงตัวแรกเป็นตัวเลือกบรรทัดคำสั่งที่สอง การใช้งานนี้ต้องการdprintfฟังก์ชั่นซึ่งเป็นส่วนหนึ่งของ POSIX.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: ใช้strspnและ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

Rebol - 117

n: do input d: charset"0123456789"parse s: input[any[b: some d e:(e: insert b n * do take/part b e):e | skip]]print s


Ungolfed:

n: do input 
d: charset "0123456789"

parse s: input [
    any [
        b: some d e: (e: insert b n * do take/part b e) :e
        | skip
    ]
]

print s

0

Clojure - 141 140 128 ตัวอักษร

ฉันเป็นมือใหม่ 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 (น่าเกลียด แต่หวังว่าจะอ่านง่ายกว่า):

(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

บางคนต้องทำจาวา สตริงอินพุตคือ 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สภาพใช้งานได้กับ bitwise |ด้วยซึ่งสั้นกว่า 1 ตัวอักษร
จัดการ

ขอบคุณ อัปเดตรหัสแล้ว (จริงๆแล้วมันยังคงเป็นบูลีนหรือเพียงแค่ไม่มีทางลัดการประเมิน)
Florian F

0

สองคำตอบ: +

ทุบตีบริสุทธิ์ (~ 262)

อันดับแรกมีเวอร์ชั่นทุบตีบริสุทธิ์ที่สั้นมาก (ไม่มีทางแยกไม่มีไบนารีภายนอก)!

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 ) จะไม่สั้นลง แต่ได้รับการออกแบบเป็นสคริปต์totem :

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

Haskell, 70

แย่เกินไปฉันสายเกินไป IMHO ซึ่งค่อนข้างดีสำหรับคำถามและภาษานี้โดยเฉพาะ โซลูชัน 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.