Anexando números

15

Um desafio bastante simples: você receberá duas entradas, uma sequência e um número (o número pode ser tomado como uma sequência, ou seja, em "123"vez de 123)

Se a sequência não terminar em um número (ou seja, não corresponde à regex \d$), basta acrescentar o número ao final da sequência.

Se a sequência terminar em um número (ou seja, corresponde ao regex \d+$), você deve primeiro excluí-lo e depois anexá-lo.

Nenhuma das entradas jamais será inválida ou vazia (inválida é definida pela entrada numérica que não contém apenas dígitos)

O número nunca conterá a -ou a ..

A sequência nunca conterá uma nova linha ou caracteres não-em branco que não podem ser impressos.

Casos de teste:

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

Respostas:

10

Retina , 5 bytes

\d*¶

Toma duas seqüências de caracteres como entrada, separadas por uma nova linha.

Experimente online!

Dennis
fonte
ninja'd. Embora eu não tenha certeza se o espaço é uma boa opção de separador.
John Dvorak
É justo, alterado para um tabulador.
Dennis
Que tal um ponto e vírgula? Esse também não precisa ser escapado.
John Dvorak
Acabei de ler o esclarecimento do OP. Nova linha é.
Dennis
7

Python 2 , 30 bytes

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

Experimente online!

Cajado
fonte
1
Bom truque para criar um número com todos os dígitos!
TheLethalCoder 6/06
Não tenho certeza do que está acontecendo, mas para mim (v2.7.11 no Windows), isso falha quando atermina "L"porque é 56**7avaliado como 1727094849536L. Entrada de a="abcdL"; b="59"saídas "abcd59". O seu link TIO não avalia 56**7a uma longa, então eu não sei o que está acontecendo
wnnmaw
6

PHP, 37 36 35 33 bytes

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

Guardado 1 byte graças a Jörg Hülsermann .

user63956
fonte
1
chopcomo alias salva 1 Bytes
Jörg Hülsermann 06/06
5

Perl 5, 12 bytes

Código de 11 bytes + 1 para -p.

s/\d*$/<>/e

Experimente online!

Dom Hastings
fonte
1
Hehe, veio exatamente com o mesmo código! Prazer em vê-lo de volta :)
Dada
5

Java 8, 32 bytes

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

Recebe entrada acomo uma String e, por bisso, não importa se é uma String ou um número inteiro (embora eu use Integer no link TIO abaixo).

Experimente aqui.

Kevin Cruijssen
fonte
4

Python 2 , 32 bytes

import re
re.compile("\d*$").sub

Experimente online!

Toma as entradas na ordem inversa, tanto como string.

ovs
fonte
4

05AB1E , 9 bytes

DvTFNÜ}}«

Experimente online! Provavelmente uma solução ruim, mas é a melhor que eu poderia

Explicação

DvTFNÜ}}«
Dv     }  # For each character in input1
  TF  }   # 10 times
    NÜ    # Get 0-9 and trim it from input1
        « # Concatenate with input2
Datboi
fonte
Deixa pra lá, eu estava errado.
Magic Octopus Urn
4

Japonês , 10 bytes

r"%d*$" +V

Experimente online!

 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
Lucas
fonte
Não funciona se Unão terminar em um número. Tente usar *no RegEx, em vez de +. TIO
Shaggy
Agora ele não funciona se U faz fim em um número. Eu acho que você vai ter que fazerr"%d+$" +V
ETHproductions
Sim, eu acabei de perceber isso. Deve ser corrigido agora
Lucas
4

Python 2 , 44 41 39 bytes

EDIT: -4 bytes thanks to @Dom Hastings. I don't use regular expressions much.

EDIT 2: -2 bytes thanks to @totallyhuman pointing out that the number could be taken as a string

Had to be expected...

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

Just removes the digits at the end of the string and appends the number

Try it online!

Neil A.
fonte
If you replace your regex with \d*$, can you replace the "" with `` y `` to save some bytes?
Dom Hastings
@DomHastings: Nice! I don't use regular expressions much so thanks!
Neil A.
1
You can take the y parameter as a string too.
totallyhuman
@totallyhuman: Glazed over that detail. Thanks!
Neil A.
4

Pip, 9 7 bytes

a<|XD.b

@DLosc saved me 2 bytes!

Try it online!

Explanation

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
fonte
3

Jelly, 5 bytes

œrØD;

Try it online!

How it works

œ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.
Dennis
fonte
3

JavaScript (ES6), 28 26 25 bytes

x=>y=>x.replace(/\d*$/,y)
  • 1 byte saved thanks to Neil reminding me why I shouldn't golf early in the morning!
Shaggy
fonte
1
Is the ? required?
Neil
3

C#, 45 bytes

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

Explanation:

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
fonte
3

V, 7 4 bytes

óä*î

Try it online!

This uses the same regex as the Retina answer above:

s:/\d*\n//
nmjcman101
fonte
2

Perl 6, 20 bytes

->$_,\n{S/\d*$/{n}/}
Sean
fonte
2

Tcl 32 bytes

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

Não tenho certeza sobre a interface esperada. Isso é feito como um procedimento que aceita as duas entradas como argumentos de chamada. Para transformá-lo em um script independente que lê a entrada de stdin e gera o resultado em stdout, seria necessário a linha extra:

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

ou faria tudo "inline":

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

regsub pega um RE, a string original e uma string para substituir a parte correspondente.

avl42
fonte
2

Mathematica, 48 bytes

Já existe uma solução Mathematica (84 bytes).

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

Cenoura , 16 21 bytes

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

Experimente online!(a entrada é separada por avanço de linha)

Explicação

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

Eu tive que aumentar o número de bytes em 5 porque o código não funcionava para casos de teste como a5b3com vários dígitos.

Kritixi Lithos
fonte
2

Haskell, 75 bytes 95 bytes 91 79 61 bytes

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

Eu tentei fazer isso sem regex, então talvez essa seria uma resposta dramaticamente aprimorada. Além disso, existem algumas maneiras pelas quais eu poderia fazer isso, por isso não tenho certeza se consigo raspar alguns bytes com uma abordagem diferente.

UPDATE: Eu subi em bytes porque percebi que estava falhando no caso de teste em que existem números na string que não são o sufixo. Agora tenho certeza que o regex forneceria uma resposta muito melhor.

UPDATE2: Após um ótimo feedback, mais bytes foram transferidos!

maple_shaft
fonte
2
b=(`elem`['0'..'9'])é menor que isDigit+ import. dropWhilepode ser substituído por snd.span, ie =r(snd$span b$r d)++e. Se você reverter o teste, b=(`notElem`...)poderá prosseguir d#e|b$last$d=d++e|2>1=r(snd$break b$r d)++e.
N
@nimi Obrigado pelas sugestões! Eu continuo esquecendo a extensão e a quebra e o quão útil isso pode ser.
Maple_shaft
1
A |b$last$d=d++e|2>1peça não pode ser simplesmente descartada? Todos os casos de teste parecem funcionar bem. Experimente online!
Laikoni
@Laikoni Ótima idéia! você acabou de me jogar 18 bytes!
Maple_shaft
2
Não seja! Aprender novos truques e coisas sobre Haskell que eu não conhecia antes são algumas das minhas partes favoritas do golfe.
Laikoni 7/07
1

Mathematica, 84 bytes

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

input 2 strings

["ab3d5", "55"]

resultado

ab3d55

J42161217
fonte
1

C (gcc) , 99 98 96 95 bytes

Deve ser capaz de jogar isso um pouco ...

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

Experimente online!

cleblanc
fonte
1

Noether , 11 bytes

I"\d+$"-I+P

Experimente aqui!

Ao inserir uma sequência, coloque-a entre aspas

Explicação:

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
Beta Decay
fonte
0

05AB1E , 8 bytes

DþRvyÜ}«

Experimente online!

Explicação:

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.
Camarada SparklePony
fonte