Tambahkan setiap angka dalam sebuah string

11

Diberikan string yang berisi angka desimal:

teststring134this 123test string54 100

tambahkan setiap angka dalam string ini dengan satu untuk memberikan string baru

teststring135this 124test string55 101.

String dapat diberikan sebagai:

  • argumen baris perintah
  • STDIN
  • variabel variabel atau argumen fungsi

Tutupi semua posisi yang memungkinkan untuk suatu nomor:

  • sebagai awalan untuk sebuah kata; 123test124test
  • sebagai akhiran untuk sebuah kata; test123test124
  • di dalam sebuah kata; te123stte124st
  • sendirian test 123 testtest 124 test

Berikut solusi non-golf dengan 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'))

Ini code-golfpertanyaan, kode terpendek menang.

The6P4C
sumber
5
Fakta menyenangkan: ini dapat dilakukan dengan 3 penggantian regex murni (tanpa panggilan balik) stackoverflow.com/questions/12941362/… (itu bukan cara golf)
Martin Ender
4
Anda menentukan input tetapi bukan output. Dari spec input Anda, saya menganggap STDOUT dan dan nilai pengembalian baik-baik saja. Tapi bisakah kita juga menyimpan hasilnya dalam variabel hardcoded (sama seperti kita dapat mengambil input dari itu)?
Martin Ender
1
Bagaimana dengan membawa? Apa yang terjadi pada 999?
halus
3
kemungkinan duplikat Gandakan semua angka dalam string
Digital Trauma
7
Bagaimana dengan angka negatif? Bagaimana dengan angka dengan titik desimal? Bagaimana dengan angka dengan titik desimal dan tidak ada sebelumnya (kecuali mungkin untuk tanda minus)?
Peter Taylor

Jawaban:

23

Perl, 14 byte

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

Membutuhkan -psaklar, yang saya hitung sebagai satu byte.

Contoh dijalankan

$ perl -p <(echo 's/\d+/$&+1/ge') <<< 'teststring134this 123test string54 100'
teststring135this 124test string55 101
Dennis
sumber
5
Sangat mirip dengan jawaban saya di sini haha codegolf.stackexchange.com/a/37113/29438
hmatt1
12

Ruby, 30 24 byte

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

Diharapkan input untuk disimpan s.

Martin Ender
sumber
3
Tidak $1.nextdapat digunakan di blok?
Agustus
@ Agug baik, terima kasih! Saya tidak tahu nextapakah itu canggih.
Martin Ender
11

Vim - 13 penekanan tombol

0qqqqq^Al@qq@q

Mengharapkan input menjadi baris saat ini.

Atau untuk banyak angka (misalnya 999) dalam penekanan tombol 8 + ceil (log (n)):

0qq^Alq999@q
coyotebush
sumber
Sepertinya saya tidak bisa membuat ini berhasil .... (Saya menggunakan vim 7.0.237)
Jerry Jeremiah
10

JavaScript (ES6) - 28

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

Jalankan dengan menggunakan H("test 123 234t").

soktinpk
sumber
1
Anda dapat mengambil H=dan hanya memiliki fungsi anonim.
Mama Fun Roll
8

Perl, 23

Mengasumsikan string input ditugaskan untuk $_

s/\d+/@{[$&+1]}/g;print
grc
sumber
8

Python 2 - 59

Masukkan string sebagai variabel n

import re;print re.sub('\d+',lambda x:`int(x.group())+1`,n)
Peluruhan Beta
sumber
6

C99 - 86 (GCC 4.9.0 dan Visual C ++ 2013)

Sunting: Baik GCC 4.9.0 (dengan -std = c99) dan Visual C ++ 2013 berhasil membangun (dengan peringatan) kode yang sama tanpa menyertakan. Saya tidak tahu Anda bisa melakukan itu! Terima kasih atas petunjuknya.

Sunting: Tidak terpikir oleh saya bahwa saya harus menulisnya ke layar dengan cepat alih-alih membuat string dan kemudian mencetaknya. Itu membuat perbedaan besar. Dennis terima kasih!

Ini menggunakan string kode keras tetapi isi string tidak dihitung terhadap total (the = "" dihitung).

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

Pada dasarnya itu berjalan melalui string satu karakter pada suatu waktu memeriksa masing-masing untuk melihat apakah itu bilangan bulat Jika ya maka akan menambah bilangan bulat dan menulisnya ke output jika tidak maka menyalin karakter saat ini ke output.

Ini membocorkan string hardcoded karena peningkatan s.

Jerry Jeremiah
sumber
1
Saya yakin Anda dapat menyingkirkan beberapa includedan masih dapat dikompilasi dengan gcc.
Martin Ender
1
Apakah ini akan berfungsi dengan string yang berisi misalnya 99?
anatolyg
@ MartinBüttner: Ya tapi kemudian itu tidak valid C, hanya sesuatu yang terjadi pada gcc.
R .. GitHub BERHENTI MEMBANTU ICE
@R .. Itu umumnya diizinkan di PPCG. Saya telah melihat (dan kemudian melakukannya) cukup sering tanpa ada yang mengeluh.
Martin Ender
Ya, dan itu adalah kesal saya. Bahasa harus didaftar sebagai "GCC" atau "C pada [lengkungan tertentu / dll. Peretasan bekerja pada]" atau serupa, daripada C, jika itu tidak benar-benar valid C. :-)
R .. GitHub STOP MEMBANTU ICE
5

J (20)

Mengharapkan input disimpan dalam variabel a.

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

Uji:

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

(f?) lex (39)

File inc.l:

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

Menyusun:

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

Lari:

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

Saya tidak menguji ini dengan yang asli lex. Komentar diterima.


sumber
1
Anda dapat menghapus trailing %%karena ini bukan kode pengguna: flex.sourceforge.net/manual/…
Josh
Hei ... ya! Saya mencoba tetapi tanpa membuntuti baris baru dan itu gagal ... maka saya tidak mencoba untuk menambah baris baru ... ;-) ... kesalahan bodoh!
3

Emacs - 20 karakter

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

Membutuhkan teks untuk diproses agar ada di buffer saat ini. Saya menghitung CM-% sebagai satu karakter di sini karena dapat dimasukkan dengan satu keystroke ketika menahan tiga pengubah.

pengguna16727
sumber
3

GNU sed, 304 (termasuk 1 untuk -r flag)

Saya menutup pertanyaan ini sebagai duplikat yang mungkin, tetapi ini mungkin bertentangan dengan itu karena jawaban ini tidak dapat diubah sepele untuk bekerja di sana. Sejauh ini jawaban terpanjang.

Terinspirasi oleh contoh ini dari sed dokumentasi , meskipun perlu beberapa pekerjaan untuk menangani beberapa angka dalam sebuah string:

: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/

Keluaran:

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

Perhatikan ini menyisipkan _karakter sementara , sehingga dapat menyebabkan hasil yang salah jika ada _dalam aliran input. Sebagai mitigasi untuk ini, kita dapat mengganti _skrip sed dengan beberapa karakter yang tidak dapat dicetak (mis. ASCII 0x07 BEL), dan menganggap aliran input hanya berisi ASCII yang dapat dicetak. Ini sepertinya berfungsi dengan baik ketika saya mengujinya.

Trauma Digital
sumber
3

Racket 74

(define(f x)(regexp-replace* #px"\\d+"x(λ(m)(~a(+ 1(string->number m))))))
Matthew Butterick
sumber
2

Lua - 68 karakter

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

Mengharapkan input untuk disimpan dalam s.

AndoDaan
sumber
2

CJam, 67 58 53 48 31 karakter

Pertanyaan ini seperti pertanyaan terburuk untuk CJam. Tanpa regex, tidak ada pencocokan pola, tidak terkecuali penangkapan. Tapi ini dia (#YOLO)

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

Ini membagi string dalam kelompok hanya huruf dan hanya angka. Peningkatan setiap digit dan menjahit kembali dua array dengan mengambil satu elemen dari masing-masing sekaligus.


Solusi sebelumnya:

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

Cobalah online di sini

Bagaimana itu bekerja:

Ide dasarnya adalah untuk tetap menyimpan karakter secara terpisah dalam string jika itu adalah angka dan membuang nilai yang ditambahkan ke string terakhir setelah kita mendapatkan karakter yang bukan digit.

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";
Pengoptimal
sumber
1

Cobra - 88

do(s='')=RegularExpressions.Regex.replace(s,'\d+',do(m as Match)='[int.parse("[m]")+1]')
Suram
sumber
1

C # - 178 169 157 karakter

Ini mengasumsikan bahwa angka-angka seperti 999 diizinkan untuk melimpah ke 000 dan bahwa - +, E bukan bagian dari angka.

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

Formulir lebih mudah dibaca:

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

Saya baru di sini, tidak pernah mencoba kode golf sebelumnya, hanya mencobanya :)

Saya ingin tahu apakah ada yang punya ide untuk membuatnya lebih pendek ...

Untuk berpartisipasi dengan C # alangkah baiknya jika kita bisa menghilangkan semua kerangka kerja yang diperlukan di sekitar kode aktual - maka ini hanya akan memiliki 82 karakter, dan tanpa memanggil fungsi sistem yang kuat.


Sama dengan pointer (182 karakter):

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

Sekarang tanpa meluap, ini dengan benar menangani kasus 999 (223 karakter):

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

Satu lagi yang berbeda, itu dibaca dari input standar dan menggunakan rekursi:

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

catatan: Console.ReadKey(); dan string itu sendiri tidak harus dihitung.

Saya memperbaiki ini sudah beberapa kali, lihat komentar. Masih ada ruang untuk perbaikan lebih lanjut, saya akan mengatakan :) Dan maaf untuk panjangnya, tapi saya pikir versi yang berbeda cukup menarik untuk menjaga mereka ...

maf-lembut
sumber
tidak, menyingkirkan "lingkungan" tidak diizinkan. Saya rasa dalam kode kedua if(c==57)Anda setelah Anda bisa menulis, c--;bukan c=48;, bagaimana dengan operator ternary juga. ada banyak trik golf. mungkin Anda harus mengunjungi codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
bangga haskeller
Terima kasih, saya tidak tahu apa-apa tentang golf :) semua yang Anda lihat di sini diciptakan oleh saya ;-) 57-1 bukan 48. Jadi saya tidak mengerti.
maf-soft
Ups :-) :-) :-) :-)
bangga haskeller
Aku tidak benar-benar tahu C # dengan baik, tapi saya rasa Anda dapat menggunakan beberapa operator untuk tetap mereka bersama-sama seperti... ? ... : c++*b--
haskeller bangga
btw maaf telah mengirimi Anda tips C alih-alih tips C #: codegolf.stackexchange.com/questions/173/…
bangga haskeller
1

Groovy, 38 byte

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

Uggghhh ... Aku benar-benar benci kata-kata itu replacedan all, mereka merusak semua golf regex untukku.

Guci Gurita Ajaib
sumber
1
(it as int)+1it.next()
manatwork
0

PHP - 91 Bytes

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

Saya tidak ingin menggunakan ekspresi reguler. PHP tidak mampu secara langsung menambah string offset, jadi, saya perlu menambahkan beberapa byte pada langkah kenaikan. Skrip satu baris ini mengingatkan saya pada usia yang sangat gelap dari skrip PHP ...

Alexandre Teles
sumber
Saya baru saja mengamati bahwa pertanyaan itu meminta Anda untuk menambah jumlah hasil dari urutan algarisme. Jawaban ini salah. Tetapi saya benar-benar merasa bahwa op harus menambahkan rincian lebih lanjut tentang apa yang dia inginkan.
Alexandre Teles
0

K, 56

{" "/:{,/$(`$a)^`$$1+"I"$a:_[;x]@&~~':x in .Q.n}'" "\:x}
tmartin
sumber
0

sed dan bash - 40 (termasuk doa dan pipa)

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

Output:

teststring135this 124test string55 101
124test
test124
te124st
test 124 test
mgjk
sumber
Saya mencoba string tes ini: 42;rm -rf /Ini bekerja pertama kali.
Dennis
2
Anda dapat mengubah \0ke &(-1 char), $((…))ke $[…](-2 chars), s/^/echo /ke iecho \\(-2 chars) untuk mempersingkat kode Anda saat ini . Namun lebih baik perbaiki bug yang disebutkan oleh @Dennis terlebih dahulu. (Dia menulis “Ini bekerja pertama kalinya” untuk bersenang-senang dan sebagai petunjuk tentang masalah Sebenarnya kode Anda gagal pada input yang mengandung. ;, #, `…`, $(…)Dan karakter khusus mungkin lain juga.)
manatwork
Eksekusi kode sewenang-wenang adalah fitur :-)
mgjk
Mungkin tidak ada cara untuk pergi rute ini tanpa semacam batasan input dan menjaga kode kecil. Sifat solusinya adalah menerjemahkan input dan menggunakan penerjemah untuk melakukan perhitungan karena sed tidak dapat melakukannya. Segera setelah input pengguna mengenai seorang juru bahasa, pelolosan itu gila. Singkat dari contoh sed sebelumnya, sed tidak dapat melakukan matematika.
mgjk
Agak lebih pendek: eval echo `sed 's/[0-9]\+/$[&+1]/g'`- masih memiliki masalah kode injeksi, sesuai jawaban saya untuk pertanyaan serupa lainnya codegolf.stackexchange.com/a/37145/11259
Digital Trauma
0

Java 7, 119 byte

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

Jika persyaratannya adalah program, bukan hanya fungsi, maka itu 149 byte:

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

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

124test
test124
te124st
test 124 test
8teststring135this 124test string60 101
Kevin Cruijssen
sumber
0

Gema, 14 karakter

<D>=@add{$1;1}

Contoh dijalankan:

bash-4.3$ gema '<D>=@add{$1;1}' <<< 'teststring134this 123test string54 100'
teststring135this 124test string55 101
manatwork
sumber
0

DASH , 16 byte (tidak bersaing)

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

Ini mengembalikan fungsi / aplikasi parsial.

Pemakaian:

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

Penjelasan

rstr[          #. replace any parts of the input
  R "\d+" "g"  #. matching /\d+/g
  +1           #. with its incremented form
]
Mama Fun Roll
sumber
Apakah jawaban ini tidak bersaing?
Dennis
oh rip :( Saya entah bagaimana berpikir ini adalah pertanyaan katalog.
Mama Fun Roll
0

CJam, 18 byte

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

Coba di sini.

Penjelasan

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.
jimmy23013
sumber
0

R, 83 byte

Terlambat ke pesta. Mengasumsikan input disimpan dalam variabel x. Mungkin tidak perlu digunakan regmatchesuntuk menyelesaikan ini, tetapi saya tidak bisa menemukan penggantian vektor tanpa paket eksternal.

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

Tidak diikat dan dijelaskan

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

Contoh output

input: 
"teststring135this 124test string55 101"

output:
[1] "teststring136this 125test string56 102"
Billywob
sumber
0

C # (Visual C # Interactive Compiler) dengan opsi baris perintah /u:System.Text.RegularExpressions.Regex;System.Int32, 40 byte

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

Mengharapkan input berada dalam variabel bernama n.

Cobalah online!

Perwujudan Ketidaktahuan
sumber
2
Tidak valid, tidak dapat mengharapkan input dalam variabel
hanya ASCII
@ ascii-only Pertanyaan ini tampaknya secara eksplisit mengizinkannya 'meskipun secara pribadi, saya akan mencoba untuk tetap berpegang pada standar input hari ini
Jo King
Oh, tunggu: / ew pertanyaan ini
ASCII