Numaraları Ekleme


15

Oldukça basit bir meydan okuma: İki giriş alırsınız, bir dize ve bir sayı (sayı dize olarak alınabilir, yani "123"yerine 123)

Dize bir sayıyla bitmezse (yani normal ifadeyle eşleşmezse \d$), sayıyı dizenin sonuna ekleyin.

Dize bir sayıyla bitiyorsa (yani normal ifadeyle eşleşiyorsa \d+$), önce bunu silmeli ve ardından sayıyı eklemelisiniz.

Girişlerin hiçbiri geçersiz veya boş olmayacaktır (geçersiz, yalnızca rakam içermeyen sayısal giriş tarafından tanımlanır)

Sayı hiçbir zaman a -veya a içermeyecektir ..

Dize hiçbir zaman yeni satır veya yazdırılamayan boşluk olmayan karakterler içermez.

Test Durumları:

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

Yanıtlar:


10

Retina , 5 bayt

\d*¶

Bir satırsonu ile ayrılmış iki dizeyi girdi olarak alır.

Çevrimiçi deneyin!


ninja'd. Alanın iyi bir ayırıcı seçim olup olmadığından emin değilim.
John Dvorak

Yeterince adil, bir tabülatör olarak değiştirildi.
Dennis

Noktalı virgül nasıl olur? Bunun da kaçmasına gerek yok.
John Dvorak

Oh, sadece OP'nin açýklamasýný okudum. Newline öyle.
Dennis

7

Python 2 , 30 bayt

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

Çevrimiçi deneyin!


1
Tüm rakamlarla bir sayı oluşturmak için güzel numara!
TheLethalCoder

Neler olup bittiğinden emin değilim, ama benim için (Windows'ta v2.7.11), bununla abittiği zaman başarısız oluyor "L"çünkü 56**7değerlendiriyor 1727094849536L. a="abcdL"; b="59"Çıkışların girişi "abcd59". TIO bağlantınız 56**7uzun süredir değerlendirilmiyor , bu yüzden ne olduğunu bilmiyorum
wnnmaw



5

Java 8, 32 bayt

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

Girdi alır aBir String olarak ve bbunun için bir String veya integer olması fark etmez (aşağıdaki TIO bağlantısında Integer kullanmamıza rağmen).

Burada deneyin.



4

05AB1E , 9 bayt

DvTFNÜ}}«

Çevrimiçi deneyin! Muhtemelen kötü bir çözüm ama gelebileceğim en iyisi

açıklama

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

Boşver, yanılmışım.
Sihirli Ahtapot Urn

4

Japt , 10 bayt

r"%d*$" +V

Çevrimiçi deneyin!

 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

UBir sayı ile bitmezse çalışmaz. *Bunun yerine RegEx'te kullanmayı deneyin +. TIO
Shaggy

Şimdi eğer bu işe yaramazsa U does bir dizi sonunu. Sanırım yapmanız gerekecekr"%d+$" +V
ETHproductions

Evet, farkettim. Şimdi düzeltilmelidir
Luke

4

Python 2 , 44 41 39 bayt

EDIT: @Dom Hastings sayesinde -4 bayt. Normal ifadeleri fazla kullanmıyorum.

DÜZENLEME 2 : -2 bayt @totallyhuman sayının bir dize olarak alınabileceğine işaret ederek

Beklenmesi gerekiyordu ...

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

Dizenin sonundaki rakamları kaldırır ve numarayı ekler

Çevrimiçi deneyin!


Normal ifadenizi ile \d*$değiştirirseniz, bazı baytları kaydetmek için ""`` y`` ile değiştirebilir misiniz ?
Dom Hastings

@DomHastings: Güzel! Düzenli ifadeleri fazla kullanmıyorum çok teşekkürler!
Neil

1
Sen alabilir yçok dize olarak parametreyi.
totallyhuman

@totallyhuman: Bu detayın üzerine sırlanmış. Teşekkürler!
Neil

4

Pip , 9 7 bayt

a<|XD.b

@DLosc beni 2 bayt kurtardı!

Çevrimiçi deneyin!

açıklama

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

Jöle , 5 bayt

œrØD;

Çevrimiçi deneyin!

Nasıl çalışır

œ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 bayt

x=>y=>x.replace(/\d*$/,y)
  • Neil sayesinde sabahın erken saatlerinde neden golf oynamamam gerektiğini hatırlatan 1 bayt kurtardı !

1
Is ?gerekli?
Neil


3

C #, 45 bayt

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

Açıklama:

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 bayt

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

Beklenen arayüzden emin değilim. Bu, iki girişi çağrı argümanları olarak kabul eden bir prosedür olarak yapılır. Stdin'den girdi okuyan ve sonucu stdout'a çıkaran bağımsız bir komut dosyasına dönüştürmek için ekstra satır gerekir:

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

veya hepsini "satır içi" yapar:

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

regsub, bir RE, orijinal dize ve eşleşen parçayı değiştirmek için bir dize alır.


2

Mathematica, 48 bayt

Zaten bir Mathematica çözümü var (84 bayt).

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

2

Havuç , 16 21 bayt

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

Çevrimiçi deneyin! (giriş satır besleme ile ayrılmıştır)

açıklama

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

Kod a5b3birden çok basamaklı gibi testcases için işe yaramadı çünkü bayt 5 artırmak zorunda kaldı .


2

Haskell, 75 bayt 95 bayt 91 79 61 bayt

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

Bunu regex olmadan yapmayı denedim, bu yüzden bu dramatik bir şekilde geliştirilmiş bir cevap olurdu. Ayrıca bu konuda gidebileceğim birkaç yol var, bu yüzden farklı bir yaklaşımla birkaç bayt tıraş edebileceğimden emin değilim.

GÜNCELLEME: Bayt olarak girdim çünkü dizede sayıların sonek olmayan sayılarının bulunduğu test senaryosunda başarısız olduğumu fark ettim. Şimdi regex'in daha iyi bir cevap sağlayacağından eminim.

GÜNCELLEME2: Harika geri bildirimlerden sonra daha fazla bayt golf oynadı!


2
b=(`elem`['0'..'9'])isDigit+ işaretinden daha kısa import. dropWhileile değiştirilebilir snd.span, yani =r(snd$span b$r d)++e. Testi tersine çevirirseniz, b=(`notElem`...)devam edebilirsiniz d#e|b$last$d=d++e|2>1=r(snd$break b$r d)++e.
nimi

@nimi Öneriler için teşekkürler! Yayılma ve kırılma ve bunların ne kadar yararlı olabileceğini unutmaya devam ediyorum.
maple_shaft

1
Can |b$last$d=d++e|2>1parçası basitçe bırakılabilir? Tüm test vakaları iyi çalışıyor gibi görünüyor. Çevrimiçi deneyin!
Laikoni

@Laikoni Harika bir fikir! Bana sadece 18 bayt golf yaptın!
maple_shaft

2
Olma! Daha önce bilmediğim Haskell hakkında yeni püf noktaları ve şeyler öğrenmek, golfün en sevdiğim kısımlarından bazıları.
Laikoni

1

Mathematica, 84 bayt

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

giriş 2 dizeleri

["ab3d5", "55"]

çıktı

ab3d55



1

Noether , 11 bayt

I"\d+$"-I+P

Burada deneyin!

Bir dize girerken onu tırnak içine alın

Açıklama:

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 bayt

DþRvyÜ}«

Çevrimiçi deneyin!

Açıklama:

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.