Dize çıkarma


37

Amaç

Dize bitiştirmeyi tersine çevirmek için bir işlev oluşturun

Giriş

Birinin diğeri için çıkarılması gereken iki dize (alfanümerik + boşluklar).

  • Çıkarılacak dizginin asla diğerinden daha büyük olmayacağını varsayabilirsiniz.

Çıktı

Çıkarma sonucu

Çıkarma

Bir dizgiyi başka bir dizgenin başlangıcından veya sonundan silmelisiniz. Dize başlangıçta ve sonunda mevcutsa, yalnızca hangisinin kaldırılacağı size ait olanı kaldırabilirsiniz.
Dize başlangıçta veya sonunda değilse veya tam bir eşleşme değilse, geçersiz bir çıkartmadır ve orijinal dizeyi çıkarmanız gerekir.

Test Kılıfları

Geçerli Çıkarma

'abcde','ab' -> 'cde'
'abcde','cde' -> 'ab'
'abab','ab' -> 'ab'
'abcab','ab' -> 'abc' or 'cab'
'ababcde','ab' -> 'abcde'
'acdbcd','cd' -> 'acdb'
'abcde','abcde' -> ''
'abcde','' -> 'abcde'
'','' -> ''

Geçersiz Çıkarma (orijinal dizeyi döndürür)

'abcde','ae' -> 'abcde'
'abcde','aa' -> 'abcde'
'abcde','bcd' -> 'abcde'
'abcde','xab' -> 'abcde'
'abcde','yde' -> 'abcde'

Geçersiz Giriş (ele alınması gerekmez)

'','a' -> ''

Bu , yani bayttaki en kısa kod kazanır!


4
Neden ilk davanın sonucu değil cde? Geçerli derken ne demek istiyorsun? Girdilerin geçerliliğini değerlendirmek zorunda mıyız yoksa geçersiz girdiler alamayacağımız anlamına mı geliyorsunuz?
Sızdıran Rahibe

7
Kahretsin, 'abcde','bcd' -> 'abcde'çözümümü
John Dvorak

5
Dizelerin regex-safe (alfanümerik + boşluklar) olacağını varsayabilir miyiz?
John Dvorak

2
Bir test olayı olarak 'ababcde', 'ab'→ öneririm 'abcde'. Bazı saf algoritmalar bu konuda başarısız.

2
@Rod "Dizge bitiştirmeyi ters çevir" zorluğunu tekrar denemeyi düşünebilirsiniz?
MD XF

Yanıtlar:


19

Java 8, 46 45 44 40 bayt

TheLethalCoder sayesinde -1 bayt

-1 bayt çünkü aptalım (teşekkürler Rod!)

Kevin Cruijssen sayesinde -4 bayt

a->b->a.replaceFirst("^"+b+"|"+b+"$","")

Çevrimiçi deneyin! (tüm test durumlarını içerir)

Bir Java cevabı aslında birkaç pratik dili daha atıyor. Smiles. (ve şimdi JS yener!)


Bir bayt kaydetmek için a->b->
currying

@TheLethalCoder Teşekkürler.
Okx,

Çevrimiçi örneğinizde neden kullanılmayan hashmap'ten ayrıldınız?
Michael

Değişebilirsin Firstiçin All-2 bayt için. Çünkü ^ve $böylece bile, bu sonunda ya hep ya dize başlangıcı replaceAllyalnızca bir kez değiştirir. Burada dene. Not: Cevabınıza grev yapan önceki bayt sayımlarını ekledim, bu genellikle PPCG'de kod-golf düzenlemelerinden sonra yapılır.
Kevin Cruijssen

@KevinCruijssen Grevden haberdarım, sanırım bu sefer sadece unuttum. Ancak, Allyerine kullanırsam First, bu gerçekleşir:"abab" + "ab" -> ""
Okx

9

JavaScript (ES6), 41 bayt

s=>t=>s.replace(eval(`/^${t}|${t}$/`),'')

Karıştırma sözdizimi ile girdi, yani f("abab")("ab").


3
Şimdi, neden daha eval()önce RegExes'i oluşturmak için kullanmayı hiç düşünmedim ?!
Shaggy

9

Brachylog (Çevrimiçi Deneyin!), 12 bayt

~cpĊh.∧Ċtw|w

Çevrimiçi deneyin!

Standart girdiden çıkarılacak dizgiyi ve komut satırı argümanı olarak çıkarılacak dizgiyi alır.

açıklama

~cpĊh.∧Ċtw|w
~c            Split {the input} into pieces
  p           and (possibly) rearrange those pieces
   Ċ          such that there are two pieces
    h         and the first
     .        matches the command line argument
      ∧       then
         w    print
        t     the last
       Ċ      piece.
          |   If all else fails,
           w  print {the input}.


6

JavaScript (ES6), 76 70 45 41 bayt

s=>t=>s.replace(RegExp(`^${t}|${t}$`),"")

Dene

f=
s=>t=>s.replace(RegExp(`^${t}|${t}$`),"")
o.innerText=f(i.value="abcde")(j.value="ab")
i.oninput=j.oninput=_=>o.innerText=f(i.value)(j.value)
<input id=i><input id=j><pre id=o>


2
İhtiyacın yok new .
programcı5000

@ programmer500, ETH'nin versiyonunu görünce bu konuda çalışmaktan vazgeçtim! : D Şimdi güncellendi. Teşekkürler.
Shaggy



3

TI-Basic (TI-84 Plus CE), 63 bayt

Prompt Str0,Str2
inString(Str0,Str2
If Ans
sub(Str0,1,Ans-1)+sub(Str0,Ans+length(Str2),length(Str0)-Ans+1-length(Str2→Str0
Str0

Bir sorum var, neden Str1'i değişken olarak kullanmadınız?
Zacharý

@ Zacharý Ben o zaman depoda bir şey vardı sanırım. Gerçekten hatırlamıyorum.
pizzapants184

AnsDördüncü hatta ne anlama geliyor ?
Zacharý

@ Zacharý Ans, son değerlendirilen değeri ifade eder, bu durumda bu, döndürülen değeri ifade eder; bu , dizgede inString(alt Str2dizginin dizinidir Str0veya alt dizge görünmüyorsa 0'dır. Bir if ifadesi Ans'in değerini değiştirmez, bu nedenle dördüncü satırda dizin hala içindedir Ans.
pizzapants184

Oh, nasıl inStringçalıştığını unuttum . Güzel golf!
Zacharý

3

Mathematica, 162 bayt

(c=Characters;a=c@#;b=c@#2;l=Length;t={};If[l@Intersection[a,b]==l@b,If[MemberQ[Partition[a,l@b,1],b],t=a;Table[t=DeleteCases[t,b[[i]],1,1],{i,l@b}]],t=a];""<>t)&

test girişi stili ["abcde", "ab"]


1
Güzel çözüm! Bir bayt kullanarak #yerine kaydedebilirsiniz #1- bunlar tam olarak aynı anlama gelir. Ayrıca, kullanmak yerine, StringJoin@tboş bir dizgeyi de ekleyerek hile yapabilirsiniz ""<>t; bu da her şeyi otomatik olarak birleştirir t. Mathematica golf ipuçları sayfasını gördünüz mü ?
Ağaç değil

Baytları kurtarmak için yapabileceğiniz birkaç şey var ( t={};örneğin, başlangıçta tanımlamanız gerekmediğini sanmıyorum ), ancak tamamen farklı bir yaklaşım kullanmak daha kolay olabilir - tamamen kullanmaya çalıştınız mı? StringReplacefonksiyon?
Ağaç değil

Bir String dizisini girdi olarak alma izniniz var, yani gerçekten ihtiyacınız yokc=Characters;a=c@#;b=c@#2;
JungHwan Min 17:17

Ayrıca, l@Intersection[a,b]öyle l[a∩b].
JungHwan Min


3

Bash ,66 61 49 bayt

case $1 in *$2)echo ${1%$2};;*)echo ${1#$2};;esac

Çevrimiçi deneyin!

daha az golf oynadı:

a=$1;
case $1 in 
    *$2)  c=${a%$2};;       
    $2*)  c=${a#$2};;
      *)  c=$1;;
esac;
echo $c

Başlangıç ​​veya bitişi test etmek için büyük / küçük harf ve dizi öneki / sonek (% / #) alt bölümlerini kullanır.


1
Güzel kullanımı case, ancak gerekenden daha uzun. 2. ve 3. desen tek bir birleştirilecek olabilir: *)c=${1#$2};;. Sonra sadece 2 dalları için kısa olacağını echoyerine doğrudan değişkenini kullanarak her $c: case $1 in *$2)echo ${1%$2};;*)echo ${1#$2};;esac. Yoksa kullanmaya devam ama olmadan olabilir case: c=${1%$2};[[ $c = $1 ]]&&c=${1#$2};echo $c.
Manatwork

3

APL (Dyalog) , 31 30 bayt

-1 Zacharý'ya teşekkürler .

Bu aslında ters (yani ters) birleştirme kullanır! Orijinal dizgiyi sol argüman olarak ve ne argüman olarak çıkarmak için alır.

{0::⍺{0::⍺⋄,∘⍵⍣¯1⊢⍺}⍵⋄⍵,⍣¯1⊢⍺}

Çevrimiçi deneyin!

Ungolfed:

{
    0::⍺{          if an error happens, apply the following function on the arguments
        0::⍺           if an error happens, return the left argument unmodified
        ,∘⍵⍣¯1⊢⍺       inverse-append right argument on left argument
        }⍵
    ⍵,⍣¯1⊢⍺       inverse-prepend the right argument on the left argument
}

Açıklama:

{} Anonim işlev

 geçerli fonksiyonun sol argümanı

 geçerli fonksiyonun doğru argümanı

0::… Herhangi bir hata olursa, bunu yürütün, başka…

⍣¯1⊢ ters

,∘⍵sağda  birleştirmek

⍵,solda  birleştirmek


Sanırım bir bayt kurtarabilirsin {0::⍺{0::⍺⋄,∘⍵⍣¯1⊢⍺}⍵⋄⍵,⍣¯1⊢⍺}.
Zacharý,

@ Zacharý Evet, teşekkürler.
Adám



2

Haskell , 49 bayt

f s a b|s==b=a|a/=b,h:t<-a=f(s++[h])t b|1<3=s
f""

Çevrimiçi deneyin! Kullanımı: f"" "abcdef" "ab". Alternatif olarak, tanımlayın (-)=f""ve kullanın "abcdef" - "ab".

Bu regex içermeyen çözüm, dizeyi tüm ön ve son eklerinde yinelemeli olarak bölerek ve çıkarılacak dizenin bunlardan biriyle eşleşip eşleşmediğini kontrol ederek çalışır.



1

C #, 88 bayt

s=>r=>s.StartsWith(r)?s.Substring(r.Length):s.EndsWith(r)?s.Substring(0,s.IndexOf(r)):s;

A derler Func<string, Func<string, string>>.


1

Yakut (lambda ifadesi), 29 bayt

->a,b{a.sub /^#{b}|#{b}$/,""}

Regex enterpolasyonu için yay! Regex-güvenli subtendend'ler gerektirir, ancak bu zorlukya göre tamam.


1

Tcl , 37 bayt

proc s {a b} {regsub "^$b|$b$" $a {}}

Çevrimiçi deneyin!(şimdi tüm testleri çalıştırıyor)

Tcl basittir. ve alan parametrelerini alan proc s {a b}bir işlevi tanımlar . boş bir dize olan yerini , başlangıcında veya sonundaki değerine göre değiştirir . Dönüş tamdır.sabregsub{}ba


1

C, 96 bayt

Bir uzatma golfünün borderline mazoşist olacağından, C'deki string manipülasyonunun hantal olduğu yaygın bir bilgidir. Bana iyi geliyor.

f(a,b,t,l)char**a,*b,*t;{t=*a;l=strlen(b);bcmp(t,b,l)?bcmp(t+=strlen(t)-l,b,l)||(*t=0):(*a+=l);}

Yazdığım daha az okunabilen programlardan biri. ( char**Girdi işlevine rağmen) iki giriş alır, dekontanlaştırılacak dizeye bir işaret ve char*hangisi kaldırılacak dizedir. Giriş işaretçisi yerinde düzenlenir ve çıktı haline gelir (kim yine de bellek sızıntısı varsa).

Örnek kullanım:

char *a = malloc(6);
strcpy(a, "abcde");
char *b = malloc(4);
strcpy(b, "abc");
f(&a,b);
printf("%s\n", a); // "de"

1

AWK , 21 32 bayt

{sub("^"$2"|"$2"$",z,$1);$0=$1}1

Çevrimiçi deneyin!

Orijinal gönderim, yalnızca başında veya sonunda değil, ilk dizedeki metni saf bir şekilde değiştirdi.

{sub($2,z,$1);$0=$1}1

Çevrimiçi deneyin!

Başlangıçta ayraçlar olmadan denenmiş, ancak boş sürümleri yazdırmak için püf noktaları ve / veya bu sürümden daha fazla bayt ekleyen eşleşmeler gerektirmiyordu.


1

R, 20 42 41 bayt

pryr::f(sub(sprintf('^%s|%s$',b,b),'',a))

MickyT sayesinde -1 bayt!

Anonim bir işlev döndürür (sırayla argüman olan b,a). Dize farkını hesaplar a-b. subBu, desenin ilk oluşumunu bu durumda boş dizeyle değiştiren basit bir ikamedir ''. Regex'i sprintfyalnızca dizenin başında ve sonunda eşleşecek şekilde yapılandırır . pryrPaketin kurulmasını gerektirir .

TIO bağlantısında, function(a,b)dört bayt için işlev için daha ayrıntılı tanımı kullanır .

Çevrimiçi deneyin!


1
Peki ya 'abcde','bcd' -> 'abcde'dava?
Jonathan Allan

" subBasitçe ilk geçtiği takas olduğu basit bir yer değiştirme olduğu biçinde a": ikinci dize birinci dize ortasında bu takas olan Will olur?
TheLethalCoder 16:17

Soruyu yanlış anladım! Hata. Onu yakaladığın için teşekkürler!
Giuseppe

1 byte geri alabilirsinizsprintf('^%s|%s$',b,b)
MickyT

@MickyT, teşekkürler! sabit.
Giuseppe,

1

Ortak Lisp, 121 bayt

(lambda(x y)(cond((equal(#1=subseq x 0 #3=(length y))y)(#1#x #3#))((equal(#1#x #2=(-(length x)#3#))y)(#1#x 0 #2#))(t x)))

Çevrimiçi deneyin!

Her zamanki wordy Common Lisp!

Ungolfed versiyonu:

(defun f(x y)
  (cond ((equal (subseq x 0 (length y)) y)               ; if x starts with y
         (subseq x (length y)))                          ; return rest of x
        ((equal (subseq x (- (length x) (length y))) y)  ; if x ends with x
         (subseq x 0 (- (length x) (length y))))         ; return first part of x
        (t x)))                                          ; else return x


1

PowerShell, 34 40 bayt

Invalid SubtractionTest vakaları eklendiğinde +6 bayt

param($s,$t)$s-replace"^$t(?!.*$t$)|$t$"

Yorum Yap:

Regexp ifadesi ^$t|$t$beklendiği gibi çalışmaz: bir yerine her iki eşleşmeyi de değiştirir (bayrak gdaima açıktır). Bu nedenle, negatif gözetleme grubunu kullanmak zorundayız.

Test komut dosyası:

$f = {
    param($s,$t)$s-replace"^$t(?!.*$t$)|$t$"
}

@(
    ,('abcde','ab', 'cde')
    ,('abcde','cde', 'ab')
    ,('abab','ab', 'ab')
    ,('abcab','ab', 'abc', 'cab')
    ,('ababcde','ab', 'abcde')
    ,('acdbcd','cd', 'acdb')
    ,('abcde','abcde', '')
    ,('abcde','', 'abcde')
    ,('','', '')

    ,('abcde','ae', 'abcde')
    ,('abcde','aa', 'abcde')
    ,('abcde','bcd', 'abcde')
    ,('abcde','xab', 'abcde')
    ,('abcde','yde', 'abcde')

    ,('','a', '')
) | % {
    $s,$t,$e = $_
    $r = &$f $s $t
    "$($r-in$e): $r"
}

Çıktı:

True: cde
True: ab
True: ab
True: abc
True: abcde
True: acdb
True:
True: abcde
True:

0

QBIC , 57 bayt

Whegh, bu QBIC / QBasic’teki bir karışıklık ...

B=@ `+B┘x=instr(;,;)~x|?_t_sB,x-1|+_sB,x+_lC|,_lB|||\?B

B=@ `+B          Prepend a string to B$. Thisis a hack to avoid errors with 
                 removing substrings stating at index 1
┘                Line-break in QBasic output
       (;,;)     Read the string (B$) and the to-be-removed substring (C$)
x=instr          And make x to be the starting index of the first C$ in B$
~x|              IF X <> 0 (ie C$ is present in B$)
?                PRINT
 _t                trimmed version (drops the prepended space)
  _sB,x-1|+        of a substring from 1 to x (the start of C$) -1
  _sB,x+_lC|,_lB   and the rest of the string, starting after C$
                     _l takes the length of a string
  |||              End TRIM, end Substring, end Length
\?B              When missing C$, just print B$


0

Başlangıçta talimatları yanlış anladım. Hatamı söylediğin için teşekkürler, Ørjan Johansen !

PowerShell , 46 51 bayt

Function F($o,$a){([regex]"^$a").replace($o,'',1);}

Çevrimiçi deneyin!


Bu 'abcde' 'bcd' durumunda başarısız olur.
Ørjan Johansen

Bu test durumundan beklenen sonuçları görüyorum - Buradaki
Jeff Freeman

Bu OP'nin listelenmiş bir test durumu ve sonuç şöyle olmalı abcde- bcddizenin iki ucunda da oluşmuyor.
Ørjan Johansen

Haklısın. Talimatları yanlış okudum. Gösterdiğin için teşekkürler!
Jeff Freeman,

0

Excel, 129 bayt

=IFERROR(IF(FIND(B1,A1)=1,SUBSTITUTE(A1,B1,"",1),IF(FIND(B1,A1,LEN(A1)-LEN(B1))>LEN(A1)-LEN(B1),LEFT(A1,LEN(A1)-LEN(B1)),A1)),A1)

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.