ต่อท้ายตัวเลข


15

ความท้าทายที่ค่อนข้างง่าย: คุณจะได้รับสองอินพุตสตริงและตัวเลข (ตัวเลขอาจถูกใช้เป็นสตริงเช่น"123"แทน123)

หากสตริงไม่ได้ลงท้ายด้วยตัวเลข (กล่าวคือสตริงนั้นไม่ตรงกับ regex \d$) เพียงแค่ต่อท้ายหมายเลขนั้นต่อท้ายสตริง

หากสตริงนั้นลงท้ายด้วยตัวเลข (เช่นมันจะตรงกับ regex \d+$) คุณควรลบมันก่อนแล้วจึงต่อท้ายหมายเลข

ทั้งอินพุตจะไม่ถูกต้องหรือว่างเปล่า (ไม่ถูกต้องถูกกำหนดโดยอินพุตตัวเลขที่ไม่มีตัวเลขเท่านั้น)

จำนวนจะไม่เคยมีหรือ-.

สตริงจะไม่ขึ้นบรรทัดใหม่หรือไม่สามารถพิมพ์อักขระที่ไม่ใช่ช่องว่างได้

กรณีทดสอบ:

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

คำตอบ:


10

เรติน่า 5 ไบต์

\d*¶

รับสายสองสายเป็นอินพุตโดยคั่นด้วยบรรทัดใหม่

ลองออนไลน์!


ninja'd แม้ว่าฉันจะไม่แน่ใจว่าพื้นที่เป็นตัวแยกที่ดีหรือไม่
John Dvorak

ยุติธรรมพอเปลี่ยนเป็นตาราง
Dennis

อัฒภาคล่ะ? คนนั้นไม่จำเป็นต้องถูกหลบหนีเช่นกัน
John Dvorak

โอ้ฉันเพิ่งอ่านคำอธิบายของ OP ขึ้นบรรทัดใหม่เลยค่ะ
Dennis

7

Python 2 , 30 ไบต์

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

ลองออนไลน์!


1
เคล็ดลับที่ดีในการสร้างตัวเลขด้วยตัวเลขทั้งหมด!
TheLethalCoder

ไม่แน่ใจว่าเกิดอะไรขึ้น แต่สำหรับฉัน (v2.7.11 บน Windows) สิ่งนี้จะล้มเหลวเมื่อaสิ้นสุดด้วย"L"เพราะ56**7ประเมิน1727094849536Lว่า ใส่ของเอาท์พุทa="abcdL"; b="59" "abcd59"ลิงก์ TIO ของคุณไม่ได้ประเมิน56**7นานดังนั้นฉันไม่รู้ว่าจะเกิดอะไรขึ้น
wnnmaw



5

Java 8, 32 ไบต์

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

รับอินพุตaเป็นสตริงและbไม่สำคัญว่าจะเป็นสตริงหรือจำนวนเต็ม (แม้ว่าฉันใช้ Integer ในลิงก์ TIO ด้านล่าง)

ลองที่นี่



4

05AB1E , 9 ไบต์

DvTFNÜ}}«

ลองออนไลน์! อาจเป็นทางออกที่ไม่ดี แต่มันก็เป็นสิ่งที่ดีที่สุดที่ฉันจะได้รับ

คำอธิบาย

DvTFNÜ}}«
Dv     }  # For each character in input1
  TF  }   # 10 times
    NÜ    # Get 0-9 and trim it from input1
        « # Concatenate with input2

ไม่เป็นไรฉันผิด
Magic Octopus Urn

4

Japt , 10 ไบต์

r"%d*$" +V

ลองออนไลน์!

 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

ใช้งานไม่ได้หากUไม่ได้ลงท้ายด้วยตัวเลข ลองใช้*ใน RegEx +แทน TIO
Shaggy

ตอนนี้มันไม่ทำงานถ้าU ไม่สิ้นสุดในจำนวน ฉันคิดว่าคุณต้องทำr"%d+$" +V
ETHproductions

ใช่ฉันเพิ่งรู้ว่า ควรได้รับการแก้ไขแล้ว
ลุค

4

Python 2 , 44 41 39 ไบต์

แก้ไข: -4 ไบต์ขอบคุณ @Dom Hastings ฉันไม่ได้ใช้การแสดงออกปกติมากนัก

แก้ไข 2 : -2 bytes ด้วย @totallyhuman ชี้ให้เห็นว่าตัวเลขสามารถนำมาเป็นสตริงได้

จะต้องมีการคาดหวัง ...

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

เพียงแค่ลบตัวเลขในตอนท้ายของสตริงและผนวกตัวเลข

ลองออนไลน์!


หากคุณแทนที่ regex ของคุณคุณ\d*$สามารถแทนที่""ด้วย `` y `` เพื่อบันทึกบางไบต์?
Dom Hastings

@ DomHastings: ดี! ฉันไม่ได้ใช้การแสดงออกปกติมากนักขอบคุณมาก!
Neil A.

1
คุณสามารถใช้yพารามิเตอร์เป็นสตริงได้เช่นกัน
มนุษย์โดยรวม

@tallyallyhuman: Glaze มากกว่ารายละเอียดที่ ขอบคุณ!
Neil A.

4

Pip , 9 7 ไบต์

a<|XD.b

@DLosc บันทึกฉันไว้ 2 ไบต์!

ลองออนไลน์!

คำอธิบาย

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

JavaScript (ES6), 28 26 25 ไบต์

x=>y=>x.replace(/\d*$/,y)
  • บันทึกได้ 1 ไบต์ขอบคุณนีลเตือนฉันว่าทำไมฉันไม่ควรเล่นกอล์ฟตอนเช้า!

1
เป็น?ต้อง?
Neil


3

C #, 45 ไบต์

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

คำอธิบาย:

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 ไบต์

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

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

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

หรือจะทำทุกอย่าง "แบบอินไลน์":

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

regsub ใช้ RE, สตริงเดิมและสตริงเพื่อแทนที่ส่วนที่ตรงกันด้วย


2

Mathematica, 48 ไบต์

มีวิธีการแก้ปัญหาทางคณิตศาสตร์ (84 ไบต์) อยู่แล้ว

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

2

แครอท , 16 21 ไบต์

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

ลองออนไลน์! (อินพุตถูกแยก linefeed)

คำอธิบาย

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

ฉันต้องเพิ่มจำนวน bytec โดย 5 เพราะรหัสไม่ทำงานสำหรับ testcases เช่นเดียวa5b3กับหลายหลัก


2

Haskell, 75 ไบต์ 95 ไบต์ 91 79 61 ไบต์

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

ฉันพยายามทำสิ่งนี้โดยไม่ต้อง regex ดังนั้นอาจเป็นคำตอบที่ดีขึ้นอย่างมาก นอกจากนี้ยังมีอีกสองสามวิธีที่ฉันสามารถไปเกี่ยวกับเรื่องนี้ดังนั้นฉันไม่แน่ใจว่าฉันสามารถโกนไม่กี่ไบต์ด้วยวิธีการที่แตกต่างกัน

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

UPDATE2: หลังจากได้รับผลตอบรับที่ดีเยี่ยมไบต์จำนวนมากก็ถูกนำออกใช้!


2
b=(`elem`['0'..'9'])สั้นกว่า+ isDigit สามารถถูกแทนที่ด้วยคือ ถ้าคุณย้อนกลับการทดสอบคุณสามารถไปกับ importdropWhilesnd.span=r(snd$span b$r d)++eb=(`notElem`...)d#e|b$last$d=d++e|2>1=r(snd$break b$r d)++e
nimi

@nimi ขอบคุณสำหรับคำแนะนำ! ฉันลืมเกี่ยวกับช่วงเวลาและช่วงพักและสิ่งที่มีประโยชน์เหล่านั้นจะเป็นอย่างไร
maple_shaft

1
ไม่สามารถส่งชิ้น|b$last$d=d++e|2>1ส่วนได้อย่างง่ายดายหรือ ทุกกรณีทดสอบดูเหมือนจะทำงานได้ดี ลองออนไลน์!
Laikoni

@Laikoni ความคิดที่ยอดเยี่ยม! คุณเพิ่งกอล์ฟฉัน 18 ไบต์!
maple_shaft

2
อย่าเป็น! เรียนรู้เคล็ดลับและสิ่งต่าง ๆ เกี่ยวกับ Haskell ที่ฉันไม่เคยรู้จักมาก่อนเป็นส่วนที่ฉันชอบในการเล่นกอล์ฟ
Laikoni

1

Mathematica, 84 ไบต์

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

อินพุต 2 สตริง

["ab3d5", "55"]

เอาท์พุต

ab3d55



1

Noether , 11 ไบต์

I"\d+$"-I+P

ลองที่นี่!

เมื่อป้อนสตริงให้ใส่ในเครื่องหมายคำพูด

คำอธิบาย:

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

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