Số bổ sung


15

Một thử thách khá đơn giản: Bạn sẽ nhận được hai đầu vào, một chuỗi và một số (số có thể được lấy dưới dạng một chuỗi, tức là "123"thay vì 123)

Nếu chuỗi không kết thúc bằng một số (nghĩa là nó không khớp với biểu thức chính quy \d$), chỉ cần nối số đó vào cuối chuỗi.

Nếu chuỗi kết thúc bằng một số (nghĩa là nó khớp với biểu thức chính quy \d+$), trước tiên bạn nên xóa chuỗi đó và sau đó nối thêm số đó.

Cả hai đầu vào sẽ không hợp lệ hoặc trống (không hợp lệ được xác định bởi đầu vào số không chỉ chứa các chữ số)

Số sẽ không bao giờ chứa a -hoặc a ..

Chuỗi sẽ không bao giờ chứa một dòng mới, hoặc các ký tự không phải khoảng trắng không thể in được.

Các trường hợp thử nghiệm:

abc123 + 345 -> abc345
123 + 1 -> 1
hello + 33 -> hello33
123abc123 + 0 -> 123abc0
ab3d5 + 55 -> ab3d55
onetwo3 + 3 -> onetwo3
99ninenine + 9999 -> 99ninenine9999

Câu trả lời:


10

Võng mạc , 5 byte

\d*¶

Lấy hai chuỗi làm đầu vào, cách nhau bởi một dòng mới.

Hãy thử trực tuyến!


ninja Mặc dù tôi không chắc chắn nếu không gian là một lựa chọn phân tách tốt.
John Dvorak

Đủ công bằng, thay đổi thành một tab Tab.
Dennis

Làm thế nào về một dấu chấm phẩy? Cái đó cũng không cần phải thoát.
John Dvorak

Ồ, tôi vừa đọc phần làm rõ của OP. Dòng mới đó là.
Dennis

7

Python 2 , 30 byte

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

Hãy thử trực tuyến!


1
Thủ thuật hay để tạo một số có tất cả các chữ số!
TheLethalCoder

Không chắc chắn điều gì đang xảy ra, nhưng đối với tôi (v2.7.11 trên Windows), điều này không thành công khi akết thúc "L"56**7đánh giá 1727094849536L. Đầu vào của a="abcdL"; b="59"đầu ra "abcd59". Liên kết TIO của bạn không đánh giá được 56**7lâu nên tôi không biết chuyện gì đang xảy ra
wnnmaw



5

Java 8, 32 byte

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

Lấy đầu vào adưới dạng Chuỗi và đối với bnó không quan trọng cho dù đó là Chuỗi hay số nguyên (mặc dù tôi sử dụng Số nguyên trong liên kết TIO bên dưới).

Hãy thử nó ở đây.




4

Japt , 10 byte

r"%d*$" +V

Hãy thử trực tuyến!

 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

Không hoạt động nếu Ukhông kết thúc bằng một số. Hãy thử sử dụng *trong RegEx, thay vì +. TIO
Shaggy

Bây giờ nó không hoạt động nếu U không kết thúc trong một số. Tôi nghĩ bạn sẽ phải làmr"%d+$" +V
ETHproductions

Vâng, tôi chỉ nhận ra rằng. Nên sửa ngay bây giờ
Luke

4

Python 2 , 44 41 39 byte

EDIT: -4 byte nhờ @Dom Hastings. Tôi không sử dụng biểu thức chính quy nhiều.

EDIT 2 : -2 byte nhờ @totallyhuman chỉ ra rằng số này có thể được lấy dưới dạng chuỗi

Phải dự kiến ​​...

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

Chỉ cần xóa các chữ số ở cuối chuỗi và nối thêm số

Hãy thử trực tuyến!


Nếu bạn thay thế regex của mình bằng \d*$, bạn có thể thay thế ""bằng `` y `` để lưu một số byte không?
Dom Hastings

@DomHastings: Đẹp! Tôi không sử dụng biểu thức chính quy nhiều vì vậy cảm ơn!
Neil A.

1
Bạn cũng có thể lấy ytham số là một chuỗi.
hoàn toàn là

@totallyhuman: Tráng qua chi tiết đó. Cảm ơn!
Neil A.

4

Pip , 9 7 byte

a<|XD.b

@DLosc đã tiết kiệm cho tôi 2 byte!

Hãy thử trực tuyến!

Giải trình

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.

3

Thạch , 5 byte

œrØD;

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

œ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.

3

JavaScript (ES6), 28 26 25 byte

x=>y=>x.replace(/\d*$/,y)
  • Lưu 1 byte nhờ Neil nhắc nhở tôi tại sao tôi không nên chơi gôn vào sáng sớm!

1
?yêu cầu?
Neil


3

C #, 45 byte

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

Giải trình:

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



2

Tcl 32 byte

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

Tôi không chắc chắn về giao diện dự kiến. Điều này được thực hiện như một thủ tục chấp nhận hai đầu vào làm đối số cuộc gọi. Để biến nó thành một tập lệnh độc lập đọc đầu vào từ stdin và đưa kết quả ra thiết bị xuất chuẩn, người ta sẽ cần thêm dòng:

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

hoặc sẽ làm tất cả "nội tuyến":

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

regsub lấy một RE, chuỗi gốc và một chuỗi để thay thế phần khớp với.


2

Toán học, 48 byte

Đã có một giải pháp Mathicala (84 byte).

StringDrop[StringTrim["."<>#,_?DigitQ..]<>#2,1]&

2

Cà rốt , 16 21 byte

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

Hãy thử trực tuyến! (đầu vào được phân tách theo dòng)

Giải trình

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

Tôi đã phải tăng bytecount lên 5 vì mã không hoạt động đối với các testcase như a5b3có nhiều chữ số.


2

Haskell, 75 byte 95 byte 91 79 61 byte

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

Tôi đã thử làm điều này mà không có regex vì vậy có lẽ đó sẽ là một câu trả lời được cải thiện đáng kể. Ngoài ra, có một vài cách tôi có thể thực hiện về điều này vì vậy tôi không chắc liệu tôi có thể cạo một vài byte bằng một cách tiếp cận khác không.

CẬP NHẬT: Tôi đã đi lên theo byte bởi vì tôi nhận ra rằng tôi đã thất bại trong trường hợp thử nghiệm trong đó các số tồn tại trong chuỗi không phải là hậu tố. Bây giờ tôi chắc chắn rằng regex sẽ cung cấp một câu trả lời tốt hơn nhiều.

CẬP NHẬT2: Sau một số phản hồi tuyệt vời, nhiều byte đã được chơi!


2
b=(`elem`['0'..'9'])ngắn hơn isDigit+ import. dropWhilecó thể được thay thế bằng snd.span, tức là =r(snd$span b$r d)++e. Nếu bạn đảo ngược bài kiểm tra b=(`notElem`...)bạn có thể đi với d#e|b$last$d=d++e|2>1=r(snd$break b$r d)++e.
nimi

@nimi Cảm ơn những gợi ý! Tôi tiếp tục quên khoảng nhịp và nghỉ và những thứ đó có thể hữu ích như thế nào.
maple_shaft

1
Không thể bỏ |b$last$d=d++e|2>1phần đơn giản? Tất cả các trường hợp thử nghiệm dường như hoạt động tốt. Hãy thử trực tuyến!
Laikoni

@Laikoni Ý tưởng tuyệt vời! bạn chỉ cần đánh golf tôi 18 byte!
maple_shaft

2
Đừng như vậy! Học những mánh mới và những điều về Haskell mà trước đây tôi không biết là một số phần yêu thích của tôi khi chơi gôn.
Laikoni

1

Toán học, 84 byte

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

đầu vào 2 chuỗi

["Ab3d5", "55"]

đầu ra

ab3d55



1

Noether , 11 byte

I"\d+$"-I+P

Hãy thử nó ở đây!

Khi nhập một chuỗi, hãy đặt nó trong dấu ngoặc kép

Giải trình:

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

0

05AB1E , 8 byte

DþRvyÜ}«

Hãy thử trực tuyến!

Giải trình:

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.