Zwiększaj każdą liczbę w ciągu

11

Podany ciąg zawierający liczby dziesiętne:

teststring134this 123test string54 100

zwiększ każdą liczbę w tym ciągu o jeden, aby dać nowy ciąg

teststring135this 124test string55 101.

Ciąg może być podany jako:

  • argument wiersza poleceń
  • STDIN
  • argument zmiennej lub funkcji zakodowany na stałe

Obejmuj wszystkie możliwe pozycje dla liczby:

  • jako przedrostek słowa; 123test124test
  • jako przyrostek dla słowa; test123test124
  • wewnątrz słowa; te123stte124st
  • sam test 123 testtest 124 test

Oto rozwiązanie do gry w golfa w Pythonie:

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

To code-golfpytanie, wygrywa najkrótszy kod.

The6P4C
źródło
5
Ciekawostka: można tego dokonać za pomocą 3 czystych podstawień wyrażeń regularnych (bez wywołań zwrotnych) stackoverflow.com/questions/12941362/... (to nie byłby najbardziej golfowy sposób)
Martin Ender
4
Podano dane wejściowe, ale nie dane wyjściowe. Z twojej specyfikacji wejściowej zakładam, że zarówno STDOUT, jak i zwracana wartość są w porządku. Ale czy możemy również zapisać wynik w zmiennej zakodowanej na stałe (tak jak możemy pobierać z niego dane wejściowe)?
Martin Ender
1
Co z noszeniem? Co stanie się z 999?
puszysty
3
możliwy duplikat Pomnóż wszystkie liczby w ciągu
Digital Trauma
7
Co z liczbami ujemnymi? Co z liczbami po przecinku? Co z liczbami z kropką dziesiętną i przed nią nic (może poza znakiem minus)?
Peter Taylor

Odpowiedzi:

23

Perl, 14 bajtów

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

Wymaga -pprzełącznika, który liczyłem jako jeden bajt.

Przykładowy przebieg

$ perl -p <(echo 's/\d+/$&+1/ge') <<< 'teststring134this 123test string54 100'
teststring135this 124test string55 101
Dennis
źródło
5
Bardzo podobny do mojej odpowiedzi tutaj haha codegolf.stackexchange.com/a/37113/29438
hmatt1
12

Rubinowy, 30 24 bajtów

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

Oczekuje, że dane wejściowe zostaną zapisane s.

Martin Ender
źródło
3
Nie $1.nextmożna użyć w bloku?
sierpnia
@ August nice, dzięki! Nie wiedziałem, nextże to było tak wyrafinowane.
Martin Ender
11

Vim - 13 naciśnięć klawiszy

0qqqqq^Al@qq@q

Oczekuje, że wejście będzie bieżącą linią.

Lub dla skończonej liczby (np. 999) w 8 + suficie (log (n)):

0qq^Alq999@q
kojotebusz
źródło
Nie mogę sprawić, żeby to zadziałało .... (Używam vima 7.0.237)
Jerry Jeremiah
10

JavaScript (ES6) - 28

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

Uruchom za pomocą H("test 123 234t").

soktinpk
źródło
1
Możesz wyjąć H=i po prostu mieć anonimową funkcję.
Mama Fun Roll
8

Perl, 23

Zakłada, że ​​ciąg wejściowy jest przypisany $_

s/\d+/@{[$&+1]}/g;print
grc
źródło
8

Python 2 - 59

Podaj ciąg jako zmienną n

import re;print re.sub('\d+',lambda x:`int(x.group())+1`,n)
Rozpad beta
źródło
6

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

Edycja: Zarówno GCC 4.9.0 (z -std = c99), jak i Visual C ++ 2013 pomyślnie zbudowały (z ostrzeżeniami) ten sam kod bez dołączeń. Nie wiedziałem, że możesz to zrobić! Dzięki za podpowiedź.

Edycja: Nawet nie przyszło mi do głowy, że powinienem napisać go na ekranie w locie zamiast tworzyć ciąg, a następnie drukować. To ogromna różnica. Dzięki Dennis!

Używa to łańcucha zakodowanego na stałe, ale zawartość łańcucha nie jest wliczana do sumy (liczone jest = "").

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

Zasadniczo przebiega przez ciąg po jednym znaku, sprawdzając każdy z nich, aby sprawdzić, czy jest liczbą całkowitą. Jeśli tak, to zwiększa liczbę całkowitą i zapisuje ją na wyjściu, w przeciwnym razie kopiuje bieżący znak na wyjście.

To przecieka zakodowany na stałe ciąg, ponieważ zwiększa on s.

Jerry Jeremiasz
źródło
1
Jestem pewien, że możesz pozbyć się niektórych includes i nadal będzie dobrze kompilować się z gcc.
Martin Ender
1
Czy to zadziała z ciągiem zawierającym np. 99?
anatolyg
@ MartinBüttner: Tak, ale to nie byłby prawidłowy C, tylko coś, co akurat działa na gcc.
R .. GitHub ZATRZYMAJ LÓD
@R .. Jest to jednak ogólnie dozwolone w PPCG. Widziałem to (a potem robiłem) dość często bez narzekań.
Martin Ender
Tak, i to moje ogólne wkurzenie. Język powinien być wymieniony jako „GCC” lub „C na [konkretnym łuku / itp., Na którym hacki działają]] lub podobny, a nie C, jeśli nie jest prawidłowy C. :-)
R .. GitHub STOP HELPING ICE
5

J (20)

Oczekuje, że dane wejściowe zostaną zapisane w zmiennej a.

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

Test:

   a=:'teststring134this 123test string54 100'
   '\d+'>:&.".rxapply a
teststring135this 124test string55 101
marinus
źródło
5

(f?) lex (39)

Plik inc.l:

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

Skompilować:

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

Biegać:

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

Nie testowałem tego z oryginałem lex. Komentarze są mile widziane.


źródło
1
Możesz porzucić końcowy znak,%% ponieważ nie jest to kod użytkownika: flex.sourceforge.net/manual/…
Josh
Hej ... tak! Próbowałem, ale bez końca nowej linii i to się nie udało ... to nie próbowałem dodać ostatniej nowej linii ... ;-) ... głupi błąd!
3

Emacs - 20 znaków

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

Wymaga przetworzenia tekstu w obecnym buforze. Liczyłem CM-% jako jeden znak, ponieważ można go wprowadzić jednym naciśnięciem klawisza, przytrzymując trzy modyfikatory.

użytkownik16727
źródło
3

GNU sed, 304 (w tym 1 dla flagi -r)

Głosowałem za tym pytaniem jako możliwym duplikatem, ale być może jest to sprzeczne z tym, ponieważ nie można w prosty sposób zmienić tej odpowiedzi, aby tam działała. Zdecydowanie najdłuższa odpowiedź.

Zainspirowany tym przykładem z dokumentacji sed , choć wymagał trochę pracy, aby obsłużyć wiele liczb w ciągu:

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

Wynik:

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

Zauważ, że tymczasowo wstawia _znaki, więc może prowadzić do niepoprawnych wyników, jeśli są one _w strumieniu wejściowym. Aby to złagodzić, możemy zamienić _skrypt w sed na znak niedrukowalny (np. ASCII 0x07 BEL) i założyć, że strumień wejściowy zawiera tylko drukowalny ASCII. To wydaje się działać dobrze, kiedy go testuję.

Cyfrowa trauma
źródło
3

Rakieta 74

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

Lua - 68 znaków

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

Oczekuje, że dane wejściowe zostaną zapisane w s.

AndoDaan
źródło
2

CJam, 67 58 53 48 31 znaków

To pytanie jest jak najgorsze pytanie dla CJam. Bez wyrażenia regularnego, bez dopasowania wzorca, bez wychwytywania wyjątków. Ale zaczynamy (#YOLO)

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

Ten dzieli ciąg na grupę tylko alfabetów i samych cyfr. Inkrementuje każdą cyfrę i zszywa dwie tablice, biorąc po jednym elemencie na raz.


Poprzednie rozwiązanie:

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

Wypróbuj online tutaj

Jak to działa:

Podstawową ideą jest przechowywanie osobnego znaku w ciągu, jeśli jest on cyfrą i zrzucenie przyrostowej wartości na końcowy ciąg, gdy otrzymamy znak inny niż cyfrowy.

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";
Optymalizator
źródło
1

Kobra - 88

do(s='')=RegularExpressions.Regex.replace(s,'\d+',do(m as Match)='[int.parse("[m]")+1]')
Obrzydliwe
źródło
1

C # - 178 169 157 znaków

Zakłada się, że liczby takie jak 999 mogą przepełnić się do 000 i że - + ,. E nie są częścią liczby.

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

Lepsza czytelna forma:

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

Jestem tu nowy, nigdy nie próbowałem golfa kodowego, po prostu spróbowałem :)

Zastanawiam się, czy ktoś ma pomysły, aby skrócić go jeszcze bardziej ...

Aby wziąć udział w C #, byłoby miło, gdybyśmy mogli pominąć wszystkie niezbędne ramy wokół rzeczywistego kodu - wtedy miałoby to tylko 82 znaki, i to bez wywoływania żadnych potężnych funkcji systemowych.


To samo dotyczy wskaźników (182 znaków):

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

Teraz bez przepełnienia poprawnie obsługuje skrzynkę 999 (223 znaków):

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

Kolejny inny starszy, odczytuje ze standardowego wejścia i używa rekurencji:

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

Uwaga: Console.ReadKey();i sam łańcuch nie powinien być liczony.

Poprawiłem to już wiele razy, patrz komentarze. Powiedziałbym, że jest jeszcze miejsce na więcej ulepszeń :) Przykro mi z powodu długości, ale myślę, że różne wersje są wystarczająco interesujące, aby je zachować ...

maf-soft
źródło
nie, pozbycie się „środowiska” jest niedozwolone. Liczę na twój drugi kod po if(c==57)tym, jak możesz napisać c--;zamiast c=48;, a co z operatorem trójskładnikowym. istnieje wiele sztuczek golfowych. może powinieneś odwiedzić codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
dumny haskeller
Dzięki, nie wiem nic o golfie :) wszystko, co tu widzicie, zostało wymyślone przeze mnie ;-) 57-1 to nie 48. Więc nie rozumiem.
maf-soft
Ups :-) :-) :-) :-)
dumny haskeller
Naprawdę nie znam dobrze C #, ale myślę, że możesz użyć jakiegoś operatora, aby skleić je razem... ? ... : c++*b--
dumny haskeller
btw przepraszam za przesłanie ci wskazówek C zamiast C #: codegolf.stackexchange.com/questions/173/…
dumny haskeller
1

Groovy, 38 bajtów

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

Uggghhh ... Absolutnie nienawidzę tych słów, replacea allone niszczą dla mnie wszystkie regexowe golfa.

Urna Magicznej Ośmiornicy
źródło
1
(it as int)+1it.next()
manatwork
0

PHP - 91 bajtów

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

Nie chciałem używać wyrażeń regularnych. PHP nie jest w stanie bezpośrednio zwiększyć przesunięcia łańcucha, więc musiałem dodać kilka bajtów w kroku przyrostu. Ten jednoliniowy skrypt przypomina mi bardzo mroczny wiek skryptów PHP ...

Alexandre Teles
źródło
Zauważyłem właśnie teraz, że pytanie wymaga od ciebie zwiększenia liczby sekwencji sekwencji algarizmów. Ta odpowiedź jest niepoprawna. Ale naprawdę uważam, że operacja powinna dodać więcej szczegółów na temat tego, czego chce.
Alexandre Teles,
0

K, 56

{" "/:{,/$(`$a)^`$$1+"I"$a:_[;x]@&~~':x in .Q.n}'" "\:x}
tartin
źródło
0

sed i bash - 40 (w tym wywołanie i fajki)

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

Wyjścia:

teststring135this 124test string55 101
124test
test124
te124st
test 124 test
mgjk
źródło
Wypróbowałem ten ciąg testowy: 42;rm -rf /zadziałał za pierwszym razem.
Dennis
2
Możesz zmienić \0na &(-1 znak), $((…))na $[…](-2 znaki), s/^/echo /na iecho \\(-2 znaki), aby skrócić swój obecny kod. Lepiej jednak najpierw popraw błąd wymieniony przez @Dennis. (Pisał „Udało się po raz pierwszy” dla zabawy i jako wskazówkę na temat problemu Właściwie Twój kod nie działa na wejście zawierające. ;, #, `…`, $(…)I może też inne znaki specjalne.)
manatwork
Wykonanie dowolnego kodu jest cechą :-)
mgjk
Może nie być sposobu, aby przejść tę trasę bez ograniczeń wprowadzania danych i niewielkiego kodu. Rozwiązaniem jest tłumaczenie danych wejściowych i użycie matematyki do wykonania matematyki, ponieważ sed nie może tego zrobić. Gdy tylko dane wejściowe użytkownika trafią do interpretera, ucieczka jest szalona. W przeciwieństwie do poprzedniego przykładu sed, sed nie potrafi matematyki.
mgjk
Nieco krótszy: eval echo `sed 's/[0-9]\+/$[&+1]/g'`- nadal występuje problem z wstrzykiwaniem kodu, zgodnie z moją odpowiedzią na inne podobne pytanie codegolf.stackexchange.com/a/37145/11259
Digital Trauma
0

Java 7, 119 bajtów

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

Jeśli wymaganiem jest program zamiast funkcji, to 149 bajtów:

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

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wynik:

124test
test124
te124st
test 124 test
8teststring135this 124test string60 101
Kevin Cruijssen
źródło
0

Gema, 14 znaków

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

Przykładowy przebieg:

bash-4.3$ gema '<D>=@add{$1;1}' <<< 'teststring134this 123test string54 100'
teststring135this 124test string55 101
człowiek w pracy
źródło
0

DASH , 16 bajtów (niekonkurencyjny)

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

Zwraca funkcję / częściową aplikację.

Stosowanie:

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

Wyjaśnienie

rstr[          #. replace any parts of the input
  R "\d+" "g"  #. matching /\d+/g
  +1           #. with its incremented form
]
Mama Fun Roll
źródło
Czy ta odpowiedź nie jest konkurencyjna?
Dennis,
oh rip :( Jakoś pomyślałem, że to pytanie z katalogu.
Mama Fun Roll
0

CJam, 18 bajtów

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

Wypróbuj tutaj.

Wyjaśnienie

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
źródło
0

R, 83 bajty

Późno na imprezę. Zakłada, że ​​dane wejściowe są przechowywane w zmiennej x. Prawdopodobnie nie jest potrzebny do regmatchesrozwiązania tego problemu, ale nie mogłem wymyślić wektorowych zamienników bez żadnych zewnętrznych pakietów.

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

Nie golfił i wyjaśnił

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

Przykładowe dane wyjściowe

input: 
"teststring135this 124test string55 101"

output:
[1] "teststring136this 125test string56 102"
Billywob
źródło
0

C # (interaktywny kompilator Visual C #) z opcją wiersza polecenia /u:System.Text.RegularExpressions.Regex;System.Int32, 40 bajtów

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

Oczekuje, że dane wejściowe będą w zmiennej o nazwie n.

Wypróbuj online!

Wcielenie ignorancji
źródło
2
Nieprawidłowy, nie można oczekiwać danych wejściowych w zmiennej
tylko ASCII
@ ascii-only To pytanie wyraźnie pozwala na to „chociaż osobiście starałbym się trzymać dzisiejszych standardów wprowadzania danych
Jo King
Oh czekaj: / ew to pytanie
tylko ASCII