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

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
Okx
источник

Ответы:

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
6

PHP, 37 36 35 33 байта

<?=chop($argv[1],3**39),$argv[2];

Сохранено 1 байт благодаря Jörg Hülsermann .

user63956
источник
1
chopкак псевдоним спасает 1 байт
Йорг Хюльсерманн
5

Perl 5, 12 байт

11 байт код + 1 для -p.

s/\d*$/<>/e

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

Дом Гастингс
источник
1
Хе-хе, придумал точно такой же код! Глэб, чтобы увидеть тебя снова :)
Дада
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
Datboi
источник
Неважно, я был неправ.
Волшебная Урна Осьминога
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.
steenbergh
источник
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
TheLethalCoder
источник
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, исходную строку и строку для замены соответствующей части.

avl42
источник
2

Mathematica, 48 байтов

Уже есть решение Mathematica (84 байта).

StringDrop[StringTrim["."<>#,_?DigitQ..]<>#2,1]&
user202729
источник
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с несколькими цифрами.

Kritixi Lithos
источник
2

Haskell, 75 байтов 95 байтов 91 79 61 байтов

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

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

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

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

maple_shaft
источник
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

J42161217
источник
1

C (gcc) , 99 98 96 95 байт

Должен быть в состоянии сыграть в гольф немного вниз ...

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]);}

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

cleblanc
источник
1

Нетер , 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.
Товарищ Спаркл Пони
источник