Dołączanie liczb

15

Dość proste wyzwanie: otrzymasz dwa dane wejściowe, ciąg znaków i liczbę (liczbę można traktować jako ciąg znaków, tzn. "123"Zamiast123 )

Jeśli ciąg nie kończy się liczbą (tzn. Nie pasuje do wyrażenia regularnego \d$ ), wystarczy dołączyć liczbę na końcu ciągu.

Jeśli ciąg znaków kończy się liczbą (tzn. Pasuje do wyrażenia regularnego \d+$ ), należy go najpierw usunąć, a następnie dołączyć liczbę.

Żadne z danych wejściowych nigdy nie będzie niepoprawne ani puste (nieprawidłowe jest zdefiniowane przez dane liczbowe niezawierające samych cyfr)

Numer nigdy nie będzie zawierać a -lub a ..

Ciąg nigdy nie będzie zawierał znaku nowej linii ani drukowalnych znaków innych niż białe znaki.

Przypadki testowe:

abc123 + 345 -> abc345
123 + 1 -> 1
hello + 33 -> hello33
123abc123 + 0 -> 123abc0
ab3d5 + 55 -> ab3d55
onetwo3 + 3 -> onetwo3
99ninenine + 9999 -> 99ninenine9999
Okx
źródło

Odpowiedzi:

10

Siatkówka , 5 bajtów

\d*¶

Pobiera dwa ciągi jako dane wejściowe, oddzielone znakiem nowej linii.

Wypróbuj online!

Dennis
źródło
ninja'd. Chociaż nie jestem pewien, czy przestrzeń jest dobrym wyborem separatora.
John Dvorak,
W porządku, zmieniono na tabulator.
Dennis
A może średnik? Tego też nie trzeba uciekać.
John Dvorak
Och, właśnie przeczytałem wyjaśnienie PO. Jest to nowa linia.
Dennis
7

Python 2 , 30 bajtów

lambda a,b:a.rstrip(`56**7`)+b

Wypróbuj online!

Pręt
źródło
1
Fajna sztuczka, aby utworzyć liczbę ze wszystkimi cyframi!
TheLethalCoder
Nie jestem pewien, co się dzieje, ale dla mnie (v2.7.11 w systemie Windows) to się nie akończy, gdy kończy się, "L"ponieważ 56**7ocenia na 1727094849536L. Wejście a="abcdL"; b="59"wyjść "abcd59". Twój link TIO nie ocenia 56**7się zbyt długo, więc nie wiem, co się dzieje
wnnmaw
5

Perl 5, 12 bajtów

11 bajtów kod + 1 dla -p.

s/\d*$/<>/e

Wypróbuj online!

Dom Hastings
źródło
1
Hehe, wymyślił dokładnie ten sam kod! Glab do zobaczenia z powrotem :)
Dada
5

Java 8, 32 bajty

a->b->a.replaceAll("\\d*$","")+b

Pobiera dane wejściowe ajako ciąg znaków i bnie ma znaczenia, czy jest to ciąg znaków , czy liczba całkowita (chociaż używam liczby całkowitej w linku TIO poniżej).

Wypróbuj tutaj.

Kevin Cruijssen
źródło
4

Python 2 , 32 bajty

import re
re.compile("\d*$").sub

Wypróbuj online!

Pobiera dane wejściowe w odwrotnej kolejności, zarówno jako ciąg.

ovs
źródło
4

05AB1E , 9 bajtów

DvTFNÜ}}«

Wypróbuj online! Prawdopodobnie złe rozwiązanie, ale najlepsze, jakie mogłem wymyślić

Wyjaśnienie

DvTFNÜ}}«
Dv     }  # For each character in input1
  TF  }   # 10 times
    NÜ    # Get 0-9 and trim it from input1
        « # Concatenate with input2
Datboi
źródło
Nieważne, myliłem się.
Magic Octopus Urn
4

Japt , 10 bajtów

r"%d*$" +V

Wypróbuj online!

 r"%d*$" +V
Ur"%d*$" +V # Implicit input (U and V)
 r          # Remove
  "%d*$"    #   any trailing digits
U           #   from the first input
         +V # And append the second input
            # Implicit output
Łukasz
źródło
Nie działa, jeśli Unie kończy się liczbą. Spróbuj użyć *w RegEx, zamiast +. TIO
Shaggy
Teraz to nie działa, jeśli U nie zakończy się liczby. Myślę, że będziesz musiał zrobićr"%d+$" +V
ETHproductions
Tak, właśnie to zrozumiałem. Powinien zostać teraz naprawiony
Łukasz
4

Python 2 , 44 41 39 bajtów

EDYCJA: -4 bajty dzięki @Dom Hastings. Nie używam często wyrażeń regularnych.

EDYCJA 2 : -2 bajty dzięki @totallyhuman wskazując, że liczba może być traktowana jako ciąg znaków

Trzeba było się spodziewać ...

lambda x,y:re.sub("\d*$",y,x)
import re

Po prostu usuwa cyfry na końcu ciągu i dołącza liczbę

Wypróbuj online!

Neil A.
źródło
Jeśli zamienisz wyrażenie regularne na \d*$, czy możesz zamienić na ""`` y '', aby zapisać niektóre bajty?
Dom Hastings,
@DomHastings: Nicea! Nie używam często wyrażeń regularnych, więc dzięki!
Neil A.,
1
Możesz również wziąć yparametr jako ciąg.
całkowicie ludzki,
@totallyhuman: Glazurowany nad tym szczegółem. Dzięki!
Neil A.,
4

Pip , 9 7 bajtów

a<|XD.b

@DLosc zapisał mi 2 bajty!

Wypróbuj online!

Wyjaśnienie

a<|         Strip all matches off the end of 'a' (the first cmd line arg)
   XD         of the pattern \d (ordinarily, a regex would be entered as '\d', but digits 
              have a pre-existing constant XD)
     .b     Then concatenate 'b' (the second cmd line arg)
            PIP implicitly prints the results of the last operation.
Steenbergh
źródło
3

Galaretka , 5 bajtów

œrØD;

Wypróbuj online!

Jak to działa

œrØD;  Main link. Left argument: s. Right argument: t

  ØD   Digits; yield "0123456789".
œr     Trim these characters from the right of s.
    ;  Append t.
Dennis
źródło
3

JavaScript (ES6), 28 26 25 bajtów

x=>y=>x.replace(/\d*$/,y)
  • 1 bajt zaoszczędzony dzięki Neilowi przypominającemu mi, dlaczego nie powinienem grać w golfa wcześnie rano!
Kudłaty
źródło
1
Czy jest to ?wymagane?
Neil
3

C #, 45 bajtów

s=>n=>s.TrimEnd("0123456789".ToCharArray())+n

Wyjaśnienie:

s=>n=>                                        // Take input
      s.TrimEnd(                              // Trim the end of the string with the specified chars
                "0123456789"                  // Create a string of the digits
                            .ToCharArray())   // Turn the string into a char array
                                           +n // Append the integer onto the end
TheLethalCoder
źródło
3

V , 7 4 bajtów

óä*î

Wypróbuj online!

Używa tego samego wyrażenia regularnego, co odpowiedź Retina powyżej:

s:/\d*\n//
nmjcman101
źródło
2

Perl 6 , 20 bajtów

->$_,\n{S/\d*$/{n}/}
Sean
źródło
2

Tcl 32 bajty

proc s a\ b {regsub \\d*$ $a $b}

Nie jestem pewien oczekiwanego interfejsu. Odbywa się to jako procedura, która przyjmuje dwa dane wejściowe jako argumenty wywołania. Aby zmienić go w samodzielny skrypt, który odczytuje dane wejściowe ze standardowego wejścia i wyświetla wynik na standardowe wyjście, potrzebny byłby dodatkowy wiersz:

puts [s [gets stdin] [gets stdin]]

lub zrobiłby to wszystko „w linii”:

puts [regsub \\d*$ [gets stdin] [gets stdin]]

regsub pobiera RE, oryginalny ciąg i ciąg, aby zastąpić pasującą część.

avl42
źródło
2

Mathematica, 48 bajtów

Istnieje już rozwiązanie Mathematica (84 bajty).

StringDrop[StringTrim["."<>#,_?DigitQ..]<>#2,1]&
użytkownik202729
źródło
2

Marchewka , 16 21 bajtów

$^//^.*?(?=\d*$)/S0^#

Wypróbuj online!(wejście jest oddzielone od linii)

Wyjaśnienie

$^                Set the stack-string to be equal to the first line in the input
/                 Set the stack-array to be equal to the matches of this regex:
 /^.*?(?=\d*$)/   The beginning of the string followed by non-digit characters at the end that are not included in the match.
S0                Convert to a string with 0 as the delimiter
^#                Append the rest of the input to the stack-string

Musiałem zwiększyć liczbę bajtów o 5, ponieważ kod nie działał dla przypadków testowych, jak w a5b3przypadku wielu cyfr.

Kritixi Lithos
źródło
2

Haskell, 75 bajtów 95 bajtów 91 79 61 bajtów

b=(`notElem`['0'..'9'])
r=reverse
d#e=r(snd$break b$r d)++e

Próbowałem to zrobić bez wyrażenia regularnego, więc może to byłaby znacznie poprawiona odpowiedź. Jest też kilka sposobów, w jakie mógłbym to zrobić, więc nie jestem pewien, czy uda mi się ogolić kilka bajtów innym podejściem.

AKTUALIZACJA: Poszedłem w górę w bajtach, ponieważ zdałem sobie sprawę, że zawiodłem przypadek testowy, w którym w ciągu istnieją liczby, które nie są przyrostkiem. Teraz jestem pewien, że wyrażenie regularne zapewniłoby znacznie lepszą odpowiedź.

AKTUALIZACJA 2: Po świetnych opiniach, więcej bajtów zostało zagranych w golfa!

wałek klonowy
źródło
2
b=(`elem`['0'..'9'])jest krótszy niż isDigit+ import. dropWhilemożna zastąpić snd.spannp =r(snd$span b$r d)++e. Jeśli cofniesz test b=(`notElem`...), możesz iść dalej d#e|b$last$d=d++e|2>1=r(snd$break b$r d)++e.
nimi
@nimi Dzięki za sugestie! Ciągle zapominam o rozpiętości i zerwaniu oraz o tym, jak przydatne mogą być.
maple_shaft
1
Czy tej |b$last$d=d++e|2>1części nie można po prostu porzucić? Wszystkie przypadki testowe wydają się działać dobrze. Wypróbuj online!
Laikoni
@Laikoni Świetny pomysł! właśnie grałeś we mnie 18 bajtów!
maple_shaft
2
Nie bądź! Uczenie się nowych sztuczek i rzeczy o Haskell, których wcześniej nie znałem, to niektóre z moich ulubionych części gry w golfa.
Laikoni
1

Mathematica, 84 bajty

(k=#;T=ToCharacterCode;L=T@k;While[47<Last@L<58,w=k~StringDrop~-1;k=w;L=T@w];w<>#2)&

wprowadź 2 ciągi

[„ab3d5”, „55”]

wynik

ab3d55

J42161217
źródło
1

C (gcc) , 99 98 96 95 bajtów

Powinien być w stanie trochę zagrać w golfa ...

main(c,v)char**v;{for(c=strlen(v[1]);~c*isdigit(v[1][--c]);v[1][c]=0);printf(v[1]),puts(v[2]);}

Wypróbuj online!

cleblanc
źródło
1

Noether , 11 bajtów

I"\d+$"-I+P

Wypróbuj tutaj!

Wprowadzając ciąg, umieść go w cudzysłowie

Wyjaśnienie:

I       - Push input to stack
"\d+$"  - Push string to stack
-       - Remove characters from first string which match the regex
I       - Push input to stack
+       - Append to the first string
P       - Print top item of stack
Rozpad beta
źródło
0

05AB1E , 8 bajtów

DþRvyÜ}«

Wypróbuj online!

Wyjaśnienie:

DþRvyÜ}«
D        Duplicate input.
 þ       Get the digits of the input.
  R      Reverse the digits of the input.
   v  }  For each of the digits in the input:
    y        Push the current digit
     Ü       Trim that from the right of the input.
       « Concatenate to 2nd input.
Towarzyszu SparklePony
źródło