附加号码


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

Answers:



7

Python 2,30个字节

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

在线尝试!


1
创建带有所有数字的数字的不错技巧!
TheLethalCoder

不知道发生了什么,但是对我来说(在Windows上为v2.7.11),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它是字符串还是整数都没关系(尽管我在下面的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
毛茸茸的

现在如果以数字结尾则U 不起作用。我认为您必须做r"%d+$" +V
ETHproductions'Jun

是的,我才意识到。现在应该解决
路加福音

4

Python 2中44 41 39个字节

编辑: -4字节感谢@Dom Hastings。我不太使用正则表达式。

编辑2:-2个字节,感谢@totallyhuman指出该数字可以作为字符串

不得不期待...

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

只需删除字符串末尾的数字并附加数字即可

在线尝试!


如果将regex \d*$替换为,是否可以将替换为""` y `”以节省一些字节?
Dom Hastings

@DomHastings:太好了!我不使用正则表达式,所以谢谢!
尼尔·

1
您也可以将y参数作为字符串。
完全人类

@totallyhuman:在那个细节上釉。谢谢!
尼尔·

4

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

果冻,5字节

œrØD;

在线尝试!

怎么运行的

œ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字节

x=>y=>x.replace(/\d*$/,y)
  • 感谢Neil提醒我为什么我不应该在清早打高尔夫球,节省了1个字节!

1
?必需的吗?
尼尔


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个字节

已经有一个Mathematica解决方案(84字节)。

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

2

胡萝卜16 21字节

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

在线尝试!(输入以换行分隔)

说明

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

我不得不将字节数增加5,因为该代码不适用于a5b3具有多个数字的测试用例。


2

Haskell,75字节 95字节 91 79 61个字节

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

我尝试在不使用正则表达式的情况下执行此操作,因此这可能会大大改善答案。此外,还有几种方法可以解决此问题,因此我不确定是否可以使用其他方法剃掉一些字节。

更新:我以字节为单位,因为我意识到我在测试用例中失败了,在该用例中字符串中存在数字而不是后缀。现在,我相信正则表达式将提供更好的答案。

UPDATE2:在获得一些反馈后,更多的字节被利用了!


2
b=(`elem`['0'..'9'])isDigit+ 短importdropWhile可以替换snd.span,即=r(snd$span b$r d)++e。如果您撤消测试b=(`notElem`...),可以选择d#e|b$last$d=d++e|2>1=r(snd$break b$r d)++e
nimi 2015年

@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

0

05AB1E,8个字节

DþRvyÜ}«

在线尝试!

说明:

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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.