เพิ่มทุกหมายเลขในสตริง


11

รับสตริงที่มีตัวเลขทศนิยม:

teststring134this 123test string54 100

เพิ่มทุก ๆ หมายเลขในสตริงนี้ทีละหนึ่งเพื่อกำหนดสตริงใหม่

teststring135this 124test string55 101.

สตริงสามารถให้เป็น:

  • อาร์กิวเมนต์บรรทัดคำสั่ง
  • STDIN
  • ตัวแปรฮาร์ดโค้ดหรืออาร์กิวเมนต์ของฟังก์ชัน

ครอบคลุมตำแหน่งที่เป็นไปได้ทั้งหมดสำหรับหมายเลข:

  • เป็นคำนำหน้าสำหรับคำ; 123test124test
  • เป็นคำต่อท้ายสำหรับคำ; test123test124
  • ภายในคำ; te123stte124st
  • เพียงอย่างเดียวtest 123 testtest 124 test

นี่คือวิธีแก้ปัญหาที่ไม่ใช่กอล์ฟใน Python:

NUMBERS = '0123456789'

def increment(s):
    out = ''

    number = ''
    for c in s:
        if c in NUMBERS:
            number += c
        else:
            if number != '':
                out += str(int(number) + 1)
                number = ''
            out += c

    if number != '':
        out += str(int(number) + 1)
        number = ''

    return out


print "\"%s\"" % (increment('teststring134this 123test string54 100'))

นี่คือcode-golfคำถามรหัสที่สั้นที่สุดชนะ


5
ความจริงเรื่องสนุก: สิ่งนี้สามารถทำได้ด้วยการทดแทน 3 regex บริสุทธิ์ (ไม่มีการเรียกกลับ) stackoverflow.com/questions/12941362/ … (ที่จะไม่เป็นวิธี golfiest แม้ว่า)
มาร์ติน Ender

4
คุณระบุอินพุต แต่ไม่ใช่เอาต์พุต จากข้อมูลจำเพาะอินพุตของคุณฉันถือว่าทั้ง STDOUT และและค่าส่งคืนนั้นใช้ได้ แต่เราสามารถเก็บผลลัพธ์ไว้ในตัวแปรฮาร์ดโค้ดได้ (เช่นเดียวกับที่เราสามารถรับข้อมูลจากมัน)
Martin Ender

1
เกี่ยวกับการพกพา เกิดอะไรขึ้นกับ 999
ปุย


7
แล้วตัวเลขลบล่ะ? แล้วตัวเลขที่มีจุดทศนิยม แล้วตัวเลขที่มีจุดทศนิยมและไม่มีอะไรมาก่อน (ยกเว้นเครื่องหมายลบ)
Peter Taylor

คำตอบ:


23

Perl, 14 ไบต์

s/\d+/$&+1/ge

ต้องใช้-pสวิตช์ซึ่งฉันนับเป็นหนึ่งไบต์

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

$ perl -p <(echo 's/\d+/$&+1/ge') <<< 'teststring134this 123test string54 100'
teststring135this 124test string55 101

5
คล้ายกันมากกับคำตอบของฉันที่นี่ฮ่าฮ่าcodegolf.stackexchange.com/a/37113/29438
hmatt1

12

Ruby, 30 24 ไบต์

$><<s.gsub(/\d+/,&:next)

sคาดว่าการป้อนข้อมูลจะถูกเก็บไว้ใน


3
ไม่$1.nextสามารถใช้ในบล็อกได้ใช่ไหม
สิงหาคม

@ ออกัสดีขอบคุณ! ฉันไม่รู้nextว่ามันซับซ้อนขนาดนั้น
Martin Ender

11

Vim - 13 การกดแป้น

0qqqqq^Al@qq@q

คาดว่าอินพุตเป็นบรรทัดปัจจุบัน

หรือสำหรับตัวเลขจำนวนมาก (เช่น 999) ในการกดแป้น 8 + ceil (log (n)):

0qq^Alq999@q

ฉันไม่สามารถทำงานนี้ได้ .... (ฉันใช้เป็นกลุ่ม 7.0.237)
Jerry Jeremiah

10

JavaScript (ES6) - 28

H=k=>k.replace(/\d+/g,k=>++k)

H("test 123 234t")ดำเนินการโดยใช้


1
คุณสามารถนำออกมาH=และเพียงแค่มันเป็นฟังก์ชั่นที่ไม่ระบุชื่อ
Mama Fun Roll



6

C99 - 86 (GCC 4.9.0 และ Visual C ++ 2013)

แก้ไข: ทั้ง GCC 4.9.0 (พร้อม -std = c99) และ Visual C ++ 2013 สร้างเรียบร้อยแล้ว (พร้อมคำเตือน) รหัสเดียวกันโดยไม่มีการรวม ฉันไม่รู้ว่าคุณสามารถทำได้! ขอบคุณสำหรับคำใบ้

แก้ไข: มันไม่ได้เกิดขึ้นกับฉันว่าฉันควรจะเขียนมันลงบนหน้าจอได้ทันทีแทนที่จะสร้างสตริงแล้วพิมพ์มัน นั่นทำให้เกิดความแตกต่างอย่างมาก ขอบคุณเดนนิส!

นี่คือการใช้สตริงที่เข้ารหัสยาก แต่เนื้อหาของสตริงจะไม่ถูกนับรวมทั้งหมด (การนับ = "" จะถูกนับ)

main(i){for(char*q,*s="test123test999test-1test";i=strtol(s,&q,0),*s;q>s?printf("%d",i+1,s=q):putchar(*s++));}

โดยพื้นฐานแล้วมันจะวิ่งผ่านสตริงหนึ่งตัวอักษรในแต่ละครั้งเพื่อตรวจสอบว่ามันเป็นจำนวนเต็มหรือไม่ หากเป็นเช่นนั้นจะเป็นการเพิ่มจำนวนเต็มและเขียนลงในเอาต์พุตมิฉะนั้นจะคัดลอกอักขระปัจจุบันไปยังเอาต์พุต

สิ่งนี้รั่วสตริง hardcoded เพราะมันเพิ่มขึ้น


1
ฉันแน่ใจว่าคุณสามารถกำจัดบางส่วนincludeและจะยังคงรวบรวมดีกับ gcc
Martin Ender

1
จะทำงานกับสตริงที่มีเช่นนี้99หรือไม่
anatolyg

@ MartinBüttner: ใช่ แต่มันจะไม่ถูกต้อง C เพียงบางสิ่งที่เกิดขึ้นกับการทำงานกับ gcc
. GitHub หยุดช่วยน้ำแข็ง

@R .. ที่อนุญาตโดยทั่วไปใน PPCG แม้ว่า ฉันเคยเห็น (และทำต่อมา) มันค่อนข้างบ่อยโดยไม่มีใครบ่น
Martin Ender

ใช่แล้วมันเป็นเรื่องน่าฉุนเฉียวทั่วไปของฉัน ภาษาควรถูกระบุว่าเป็น "GCC" หรือ "C ใน [arch พิเศษ / etc. แฮ็คเกิดขึ้นกับ]" หรือคล้ายกันมากกว่า C ถ้ามันไม่ถูกต้อง C. :-)
R .. GitHub STOP ช่วย ICE

5

J (20)

aคาดว่าการป้อนข้อมูลจะถูกเก็บไว้ในตัวแปร

'\d+'>:&.".rxapply a

ทดสอบ:

   a=:'teststring134this 123test string54 100'
   '\d+'>:&.".rxapply a
teststring135this 124test string55 101

5

(f?) lex (39)

ไฟล์inc.l:

%%
[0-9]+ printf("%d",atoi(yytext)+1);

รวบรวม:

$ flex inc.l
$ gcc lex.yy.c -o inc -lfl

วิ่ง:

$ echo 'teststring134this 123test string54 100' | ./inc
teststring135this 124test string55 101

$ i='(-: 2 empty bottles of beer :-)'
$ tty=$(tty)
$ for n in {2..5} ; do i=$(./inc<<<$i|tee $tty) ; done
(-: 3 empty bottles of beer :-)
(-: 4 empty bottles of beer :-)
(-: 5 empty bottles of beer :-)
(-: 6 empty bottles of beer :-)

lexผมไม่ได้ทดสอบนี้กับต้นฉบับ ความคิดเห็นยินดีต้อนรับ


1
คุณสามารถวางส่วนต่อท้าย%%เนื่องจากไม่มีรหัสผู้ใช้: flex.sourceforge.net/manual/…
Josh

เฮ้ ... ใช่! ฉันพยายาม แต่ไม่มีการขึ้นบรรทัดใหม่และล้มเหลว ... จากนั้นฉันไม่ได้พยายามเพิ่มบรรทัดใหม่สุดท้าย ... ;-) ... ความผิดพลาดโง่ ๆ !

3

Emacs - 20 ตัวอักษร

C-M-% [0-9]+ RET \,(1+ \#0) RET !

ต้องใช้ข้อความที่จะประมวลผลเพื่อให้ปรากฏในบัฟเฟอร์ปัจจุบัน ฉันนับ CM-% เป็นหนึ่งอักขระที่นี่เนื่องจากสามารถป้อนด้วยการกดแป้นเดียวเมื่อกดค้างที่ตัวดัดแปลงสามตัว


3

GNU sed, 304 (รวม 1 สำหรับแฟล็ก -r)

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

แรงบันดาลใจจากตัวอย่างนี้จากเอกสารประกอบ sedแม้ว่าจะต้องมีงานบางอย่างในการจัดการตัวเลขหลายตัวในสตริง:

:d
s/9([^0-9]+|$)/_\1/g
td
s/8(_*)([^0-9]+|$)/9\1\2/g
s/7(_*)([^0-9]+|$)/8\1\2/g
s/6(_*)([^0-9]+|$)/7\1\2/g
s/5(_*)([^0-9]+|$)/6\1\2/g
s/4(_*)([^0-9]+|$)/5\1\2/g
s/3(_*)([^0-9]+|$)/4\1\2/g
s/2(_*)([^0-9]+|$)/3\1\2/g
s/1(_*)([^0-9]+|$)/2\1\2/g
s/0(_*)([^0-9]+|$)/1\1\2/g
s/(^|[^0-9_]+)(_+)/\11\2/g
y/_/0/

เอาท์พุท:

$ for s in "teststring134this 123test string54 100" "123test" "test123" "te123st" "test 123 test" ; do echo "$s" | sed -rf incr.sed ; done
teststring135this 124test string55 101
124test
test124
te124st
test 124 test
$ 

โปรดทราบว่าการแทรก_ตัวอักขระชั่วคราวจึงอาจนำไปสู่ผลลัพธ์ที่ไม่ถูกต้องหากมี_ในสตรีมอินพุต เพื่อลดสิ่งนี้เราสามารถแทนที่_สคริปต์ sed ด้วยอักขระที่ไม่สามารถพิมพ์ได้ (เช่น ASCII 0x07 BEL) และสมมติว่าอินพุตสตรีมมี ASCII ที่พิมพ์ได้เท่านั้น ดูเหมือนว่าจะทำงานได้ดีเมื่อฉันทดสอบ



2

Lua - 68 ตัวอักษร

d='(%D-)'for k,i,j in s:gmatch(d..'(%d+)'..d)do io.write(k,i+1,j)end

คาดว่าอินพุตจะถูกเก็บไว้ใน s


2

CJam, 67 58 53 48 31 ตัวอักษร

คำถามนี้เหมือนกับคำถามที่แย่ที่สุดสำหรับ CJam ไม่มี regex ไม่มีการจับคู่รูปแบบไม่มีข้อยกเว้น แต่เราไปกันแล้ว(#YOLO)

Sl+_A,sNerN%\[_A,s-Ner~]:)]zs1>

อันนี้แยกสตริงในกลุ่มของตัวอักษรเพียงแค่ตัวเลข การเพิ่มทีละหลักและเย็บกลับสองอาร์เรย์โดยใช้หนึ่งองค์ประกอบของแต่ละครั้ง


โซลูชันก่อนหน้า:

L_l{:Ci57-zA<:RC*+:N\R!N*NNW?i):NL?+RLC?@R*}/NL?

ลองออนไลน์ได้ที่นี่

มันทำงานอย่างไร:

แนวคิดพื้นฐานคือการจัดเก็บอักขระแยกต่างหากในสตริงหากเป็นตัวเลขและทิ้งค่าที่เพิ่มขึ้นไปยังสตริงสุดท้ายเมื่อเราได้รับอักขระที่ไม่ใช่ตัวเลข

L_                                               "Push two empty strings to stack,"
                                                 "first representing the final string"
                                                 "and second, the current ongoing number";
  l{                                       }/    "Run this block for each character of input string";
    :Ci                                          "Store the character to C and convert to"
                                                 "its ASCII equivalent integer";
       57-zA<:R                                  "Subtract 57 from the integer and compare"
                                                 "its absolute value with 10. Numeric character"
                                                 "would result to true here. Store the result in R";
               C*+:N                             "Take either 0 or 1 characters from C based"
                                                 "on value of R, add it to the second string"
                                                 "from first step. Also store the value in N";
                    \                            "Switch the strings. Now the string containing"
                                                 "the final result string is at top of stack";
                     R!N*                        "If the character was not a digit and N contains a number in it";
                         NNW?i):NL?+             "Convert N to number and increment it."
                                                 "If N is blank, take 0 instead. Put the final"
                                                 "value back in N and add it to the final result string";
                                    RLC?         "If the character was not a digit, push it to stack";
                                        @R*      "Put the ongoing numeric string back to top of stack";
                                             NL? "This is to handle the case when the last number"
                                                 "is not followed by a string, so stack will"
                                                 "have a string at top. Push the value of N to stack in that case";


1

C # - 178 169 157 ตัวอักษร

สิ่งนี้ถือว่าตัวเลขเช่น 999 ได้รับอนุญาตให้ล้นไปถึง 000 และ - +, E ไม่ได้เป็นส่วนหนึ่งของตัวเลข

class T{static void Main(){var a="".ToCharArray();for(int b=1,c,i=a.Length;i-->0;b=48>c|c>57?7:b>0?c>56?a[i]='0':++a[i]*0:b)c=a[i];System.Console.Write(a);}}

แบบอ่านที่ดีกว่า:

class T
{
    static void Main()
    {
        var a="7teststring134this 123test string59 100".ToCharArray();

        for (int b=3, c, i=a.Length; i-->0;
            b=48>c|c>57
                ?7
                :b>2
                    ?c>56?a[i]='0':++a[i]*0
                    :b
        ) c=a[i];

        System.Console.Write(a);
        System.Console.ReadKey();
    }
}

ฉันใหม่ที่นี่ไม่เคยลองรหัสกอล์ฟมาก่อนลองทำดู :)

ฉันสงสัยว่าใครมีความคิดที่จะทำให้มันสั้นกว่านี้ ...

หากต้องการเข้าร่วมกับ C # จะเป็นการดีถ้าเราสามารถละเว้นเฟรมเวิร์กที่จำเป็นทั้งหมดเกี่ยวกับรหัสจริง - นี่จะมี 82 ตัวอักษรเท่านั้นและโดยที่ไม่เรียกฟังก์ชันของระบบที่ทรงพลัง


เช่นเดียวกับพอยน์เตอร์ (182 ตัวอักษร):

class T
{
    unsafe static void Main()
    {
        char[] a="7teststring134this 123test string59 100".ToCharArray();

        int b=3;
        fixed (char* s=&a[0])
            for (var p=s+a.Length; p-->s; )
                b=*p<48|*p>57
                    ?7
                    :b>2
                        ?*p>56?*p='0':++*p*0
                        :b;

        System.Console.Write(a);
        System.Console.ReadKey();
    }
}

ตอนนี้โดยไม่ต้องโอเวอร์โฟลว์สิ่งนี้จะจัดการเคส 999 รายการ (223 ตัวอักษร) อย่างถูกต้อง:

class T
{
    static void Main()
    {
        var s=new System.Text.StringBuilder("9999teststring134this 123test string99 100");

        for (int b=3, c, i=s.Length; i-->0; )
        {
            c=s[i];
            b=48>c|c>57
                ?b>8?8:7
                :b>2
                    ?c>56?c-(s[i]='0'):++s[i]*0
                    :b;
            if (b>8&i<1|b==8) s.Insert(i+9-b, '1');
        }

        System.Console.Write(s);
        System.Console.ReadKey();
    }
}

อีกอันหนึ่งที่เก่ากว่านั้นจะอ่านจากอินพุตมาตรฐานและใช้การเรียกซ้ำ:

namespace System {
    using C=Console;
    class T {
        class t {
            byte b=1;
            string s="";
            void R() {
                var c=C.Read();
                if (c>31) {
                    R();
                    if (48>c|c>57) b=1;
                    else if (b==1) c=c==57?48:++c*b--;
                    s=(char)c+s;
                }
            }
            public t() {
                R();
                C.Write(s);
            }
        }
        static void Main() {
            new t();
            C.ReadKey();
        }
    }
}

หมายเหตุ: Console.ReadKey();และไม่ควรนับสตริงเอง

ฉันปรับปรุงมันแล้วหลายครั้งแล้วเห็นความคิดเห็น ยังคงมีพื้นที่สำหรับการปรับปรุงเพิ่มเติมฉันจะบอกว่า :) และขออภัยสำหรับความยาว แต่ฉันคิดว่ารุ่นต่าง ๆ น่าสนใจพอที่จะทำให้พวกเขา ...


ไม่ได้รับอนุญาตให้กำจัด "สภาพแวดล้อม" ฉันคิดในรหัสที่สองของคุณหลังจากที่if(c==57)คุณสามารถเขียนc--;แทนc=48;สิ่งที่เกี่ยวกับผู้ประกอบการที่ประกอบไปด้วย มีเคล็ดลับการเล่นกอล์ฟมากมาย บางทีคุณควรเยี่ยมชมcodegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
ความภาคภูมิใจ haskeller

ขอบคุณฉันไม่รู้อะไรเกี่ยวกับกอล์ฟ :) ทุกอย่างที่คุณเห็นที่นี่ถูกคิดค้นโดยฉัน ;-) 57-1 ไม่ใช่ 48 ดังนั้นฉันจึงไม่เข้าใจ
maf-soft

อุ๊ปส์ :-) :-) :-) :-)
ภูมิใจ haskeller

ฉันไม่รู้จัก C # จริงๆ แต่ฉันคิดว่าคุณสามารถใช้โอ... ? ... : c++*b--
เปอร์

btw ขออภัยในการส่งเคล็ดลับ C แทนเคล็ดลับ C #: codegolf.stackexchange.com/questions/173/…
ภูมิใจ haskeller

1

Groovy ขนาด 38 ไบต์

{it.replaceAll(/\d+/,{(it as int)+1})}

Uggghhh ... ฉันเกลียดคำreplaceและallพวกเขาทำลาย regex golfs ทั้งหมดสำหรับฉัน


1
(it as int)+1it.next()
จัดการ

0

PHP - 91 ไบต์

<?$i=fgets(STDIN);for($n=0;$n<strlen($i);$n++)if(is_numeric($i[$n]))$i[$n]=$i[$n]+1;echo$i;

ฉันไม่ต้องการใช้นิพจน์ทั่วไป PHP ไม่สามารถเพิ่มการชดเชยสตริงได้โดยตรงดังนั้นฉันต้องเพิ่มไบต์ในขั้นตอนการเพิ่ม สคริปต์บรรทัดนี้จะจดจำอายุของสคริปต์ PHP ที่มืดมนมาก ...


ฉันได้สังเกตแล้วว่าคำถามนี้ขอให้คุณเพิ่มจำนวนผลลัพธ์ของลำดับ algarisms คำตอบนี้ไม่ถูกต้อง แต่ฉันรู้สึกว่า op ควรเพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่เขาต้องการ
Alexandre Teles


0

sed and bash - 40 (รวมถึงการเรียกใช้และไพพ์)

$ cat << EOF |sed 's/[0-9]\+/$((\0+1))/g;s/^/echo /'|bash
teststring134this 123test string54 100
123test
test123
te123st
test 123 test
EOF

ขาออก:

teststring135this 124test string55 101
124test
test124
te124st
test 124 test

ฉันลองชุดทดสอบนี้: 42;rm -rf /มันใช้ได้ครั้งแรก
เดนนิส

2
คุณสามารถเปลี่ยน\0เป็น&(-1 อักขระ) $((…))เป็น$[…](-2 ตัวอักษร) s/^/echo /ถึงiecho \\(-2 ตัวอักษร) เพื่อย่อรหัสปัจจุบันของคุณ อย่างไรก็ตามแก้ไขข้อผิดพลาดที่กล่าวถึงโดย @Dennis ให้ดีขึ้นก่อน (เขาเขียนว่า“มันทำงานเป็นครั้งแรก” เพื่อความสนุกสนานและเป็นคำแนะนำเกี่ยวกับปัญหาจริงรหัสของคุณล้มเหลวในการป้อนข้อมูลที่มี. ;, #, `…`, $(…)และอักขระพิเศษอื่น ๆ อาจจะเกินไป.)
manatwork

การใช้รหัสโดย
อำเภอใจ

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

ค่อนข้างสั้น: eval echo `sed 's/[0-9]\+/$[&+1]/g'`- ยังคงมีปัญหาการฉีดรหัส แต่เป็นต่อคำตอบของฉันคำถามอื่นที่คล้ายกันcodegolf.stackexchange.com/a/37145/11259
ดิจิตอลบาดเจ็บ

0

Java 7, 119 ไบต์

void c(String s){for(String x:s.split("(?=[^\\d]+)|(?<=[^\\d]+)"))System.out.print(x.matches("\\d+")?new Long(x)+1:x);}

หากข้อกำหนดเป็นโปรแกรมแทนที่จะเป็นเพียงฟังก์ชั่นแสดงว่าเป็น149 ไบต์:

class M{public static void main(String[]a){for(String x:a[0].split("(?=[^\\d]+)|(?<=[^\\d]+)"))System.out.print(x.matches("\\d+")?new Long(x)+1:x);}}

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

class M{
  static void c(String s){
    for(String x : s.split("(?=[^\\d]+)|(?<=[^\\d]+)")){
      System.out.print(x.matches("\\d+")
                        ? new Long(x) + 1
                        : x);
    }
  }

  public static void main(String[] a){
    c("123test");
    System.out.println();
    c("test123");
    System.out.println();
    c("te123st");
    System.out.println();
    c("test 123 test");
    System.out.println();
    c("7teststring134this 123test string59 100");
  }
}

เอาท์พุท:

124test
test124
te124st
test 124 test
8teststring135this 124test string60 101


0

DASH , 16 ไบต์ (ไม่ใช่การแข่งขัน)

rstr[R"\d+""g"+1

ส่งคืนฟังก์ชัน / แอปพลิเคชันบางส่วน

การใช้งาน:

rstr[R"\d+""g"+1]"test 123 234t"

คำอธิบาย

rstr[          #. replace any parts of the input
  R "\d+" "g"  #. matching /\d+/g
  +1           #. with its incremented form
]

คำตอบนี้ไม่ใช่การแข่งขันหรือไม่?
เดนนิส

โอ้ rip :( ฉันคิดว่านี่เป็นคำถามเกี่ยวกับแคตตาล็อก
Mama Fun Roll

0

CJam, 18 ไบต์

q_A,s-_:(:`ers~]:)

ลองที่นี่

คำอธิบาย

q         e# Read input.
_A,s-     e# Duplicate and remove digits.
_         e# Duplicate.
:(:`      e# Decrement and get the string representation of each character.
er        e# Map the characters to the decremented string representation.
s~        e# Flatten to string and evaluate.
]:)       e# Wrap in an array and increment each element.

0

R, 83 ไบต์

ไปงานเลี้ยงสาย xถือว่าการป้อนข้อมูลจะถูกเก็บไว้ในตัวแปร อาจไม่จำเป็นต้องใช้regmatchesเพื่อแก้ปัญหานี้ แต่ฉันไม่สามารถหาการแทนที่ vectorized โดยไม่มีแพ็คเกจภายนอก

paste0(el(r(x,m<-gregexpr("\\d+",x),T)),c(as.numeric(el(r(x,m)))+1,""),collapse="")

Ungolfed และอธิบาย

r=regmatches                                        # Alias for regmatch
y=r(x<-scan(,""),m<-gregexpr("\\d+",x))             # return match digits
i=r(x,m,T)                                          # return inverted match (non-digits)
paste0(el(i),c(as.numeric(el(y))+1,""),collapse="") # join digits+1 and non-digits, element-wise

ตัวอย่างผลลัพธ์

input: 
"teststring135this 124test string55 101"

output:
[1] "teststring136this 125test string56 102"

0

C # (Visual C # Interactive Compiler)พร้อมตัวเลือกบรรทัดคำสั่ง/u:System.Text.RegularExpressions.Regex;System.Int3240 ไบต์

Replace(n,"\\d+",m=>Parse(m.Value)+1+"")

คาดว่าอินพุตจะอยู่ในตัวแปรที่ชื่อว่า n

ลองออนไลน์!


2
ไม่ถูกต้องไม่สามารถคาดหวังอินพุตในตัวแปร
ASCII เท่านั้น

@ ascii-only คำถามนี้ดูเหมือนจะอนุญาตอย่างชัดเจนว่า 'ส่วนตัวฉันจะพยายามทำตามมาตรฐานการป้อนข้อมูลของวันนี้
Jo King

โอ้เดี๋ยวก่อน: / ew คำถามนี้
เท่านั้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.