Добавление номеров


15

Довольно простая задача: вы получите два ввода: строку и число (число может быть взято как строка, т.е. "123"вместо 123)

Если строка не заканчивается числом (т. Е. Не соответствует регулярному выражению \d$), просто добавьте число в конец строки.

Если строка заканчивается числом (то есть соответствует регулярному выражению \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. Хотя я не уверен, что это хороший выбор разделителя.
Джон Дворак

Справедливо, поменял на табулятор.
Деннис

Как насчет точки с запятой? Этого тоже не нужно избегать.
Джон Дворак

О, я только что прочитал разъяснения ОП. Новая строка это.
Деннис

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






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

Да, я только что понял это. Должно быть исправлено сейчас
Лука

4

Python 2 , 44 41 39 байт

РЕДАКТИРОВАТЬ: -4 байта благодаря @Dom Hastings. Я не часто использую регулярные выражения.

РЕДАКТИРОВАТЬ 2 : -2 байта благодаря @totallyhuman, указывающему, что число может быть взято как строка

Ожидалось ...

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

Просто удаляет цифры в конце строки и добавляет число

Попробуйте онлайн!


Если вы замените свое регулярное выражение на \d*$, можете ли вы заменить его на ""`` y ``, чтобы сохранить несколько байтов?
Дом Гастингс

@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

JavaScript (ES6), 28 26 25 байт

x=>y=>x.replace(/\d*$/,y)
  • 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

Я попытался сделать это без регулярных выражений, так что, возможно, это будет значительно улучшенный ответ. Также есть несколько способов, которыми я мог бы пойти по этому поводу, поэтому я не уверен, смогу ли я брить несколько байтов другим подходом.

ОБНОВЛЕНИЕ: я пошел в байтах, потому что я понял, что провалил тестовый случай, где в строке существуют числа, которые не являются суффиксом. Теперь я уверен, что регулярное выражение даст гораздо лучший ответ.

ОБНОВЛЕНИЕ 2: После некоторого отличного отзыва, было добавлено больше байтов!


2
b=(`elem`['0'..'9'])короче isDigit+ import. dropWhileможет быть заменен 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

@nimi Спасибо за предложения! Я продолжаю забывать о размахе и разрыве и насколько полезными они могут быть.
maple_shaft

1
Разве |b$last$d=d++e|2>1нельзя просто отбросить деталь? Все контрольные примеры работают нормально. Попробуйте онлайн!
Лайкони

@Laikoni Отличная идея! Вы только что сделали мне 18 байтов!
maple_shaft

2
Не будь! Изучение новых трюков и вещей о Хаскеле, о которых я раньше не знал, - это некоторые из моих любимых частей игры в гольф.
Лайкони

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




Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.