Belirli Anahtar Kelimelerle Alt Dize Çıkarıcı
Meydan okuma
Bu zorluğun amacı, bir girdi dizesi, bir başlangıç anahtar sözcüğü ve bir bitiş anahtar sözcüğü alan bir işlev yapmaktır. Çıkarılan çıktı sonucu, verilen başlangıç anahtar sözcüğünden (ancak hariç tutulan) son anahtar sözcüğünden (ancak hariç tutuldu). Çıktı alt dizesi aşağıdaki kurallara uyar.
Her durumda, çıktı alt dizesindeki baştaki / sondaki boşluklar kaldırılmalıdır.
Verilen başlangıç anahtar sözcüğü boş bir dizeyse, bu, çapanın giriş dizesinin başlangıcında olduğu anlamına gelir. Aksi takdirde, verilen start anahtar kelimesinin ilk geçtiği yer bir başlangıç çapasıdır. Verilen start anahtar kelimesinin herhangi bir oluşumu yoksa, çıktı boş bir dizedir.
Verilen son anahtar kelime boş bir dizeyse, çapanın giriş dizesinin sonunda olduğu anlamına gelir. Aksi takdirde, verilen son anahtar kelimenin ilk geçtiği yer bir son bağlantıdır. Verilen son anahtar kelimenin herhangi bir oluşumu yoksa, çıktı boş bir dizedir.
Başlangıç çapasının konumu, bitiş çapasının konumundan sonraysa veya verilen start anahtar kelimesinin ilk geçtiği yerin bir parçası ve verilen son anahtar kelimenin ilk geçtiği yerin bir kısmı örtüşüyorsa, çıktı boş bir dizedir.
Benzer, ancak belirli bir dizeden bir dizeyi ayıklamaktan farklı olarak , verilen başlangıç ve bitiş bağlantıları birden çok karakterdir.
İşte C # 'da kurtsuz bir referans uygulaması
private static string GetTargetString(string stringInput, string startKeywordInput, string endKeywordInput)
{
int startIndex;
if (String.IsNullOrEmpty(startKeywordInput))
{
startIndex = 0;
}
else
{
if (stringInput.IndexOf(startKeywordInput) >= 0)
{
startIndex = stringInput.IndexOf(startKeywordInput) + startKeywordInput.Length;
}
else
{
return "";
}
}
int endIndex;
if (String.IsNullOrEmpty(endKeywordInput))
{
endIndex = stringInput.Length;
}
else
{
if (stringInput.IndexOf(endKeywordInput) > startIndex)
{
endIndex = stringInput.IndexOf(endKeywordInput);
}
else
{
return "";
}
}
// Check startIndex and endIndex
if (startIndex < 0 || endIndex < 0 || startIndex >= endIndex)
{
return "";
}
if (endIndex.Equals(0).Equals(true))
{
endIndex = stringInput.Length;
}
int TargetStringLength = endIndex - startIndex;
return stringInput.Substring(startIndex, TargetStringLength).Trim();
}
Örnek Giriş ve Çıkış
Örnek giriş ve çıkış aşağıda listelenmiştir.
Giriş Dizesi | Anahtar Kelime Başlat | Anahtar Kelime Sonu | Çıktı |
---|---|---|---|
"C #, .NET girişiminin bir parçası olarak Microsoft tarafından 2000 yılı civarında geliştirilmiştir" | "" (boş dize) | "" (boş dize) | "C #, .NET girişiminin bir parçası olarak Microsoft tarafından 2000 yılı civarında geliştirilmiştir" |
"C #, .NET girişiminin bir parçası olarak Microsoft tarafından 2000 yılı civarında geliştirilmiştir" | "" (boş dize) | ".AĞ" | "C #, 2000 yılı civarında Microsoft tarafından onun bir parçası olarak geliştirildi" |
"C #, .NET girişiminin bir parçası olarak Microsoft tarafından 2000 yılı civarında geliştirilmiştir" | "C #" | "" (boş dize) | "Microsoft tarafından .NET girişiminin bir parçası olarak 2000 yılında geliştirilmiştir" |
"C #, .NET girişiminin bir parçası olarak Microsoft tarafından 2000 yılı civarında geliştirilmiştir" | "C #" | ".AĞ" | "2000 yılı civarında Microsoft tarafından geliştirilmesinin bir parçası olarak" |
"C #, .NET girişiminin bir parçası olarak Microsoft tarafından 2000 yılı civarında geliştirilmiştir" | ".AĞ" | "" (boş dize) | "girişim" |
"C #, .NET girişiminin bir parçası olarak Microsoft tarafından 2000 yılı civarında geliştirilmiştir" | "" (boş dize) | "C #" | "" (boş dize) |
"C #, .NET girişiminin bir parçası olarak Microsoft tarafından 2000 yılı civarında geliştirilmiştir" | ".AĞ" | "C #" | "" (boş dize) |
"C #, .NET girişiminin bir parçası olarak Microsoft tarafından 2000 yılı civarında geliştirilmiştir" | "ABC" | "C #" | "" (boş dize) |
"C #, .NET girişiminin bir parçası olarak Microsoft tarafından 2000 yılı civarında geliştirilmiştir" | ".AĞ" | "XYZ" | "" (boş dize) |
"C #, .NET girişiminin bir parçası olarak Microsoft tarafından 2000 yılı civarında geliştirilmiştir" | "ABC" | "XYZ" | "" (boş dize) |
Kurallar
Bu kod golf . En az bayta sahip olan cevap kazanır.
Yanıtlar
APL (Dyalog Extended) , 24 bayt ( SBCS )
Dizi için soran tam program [EndKeyword,StartKeyword,InputString]
. 0 tabanlı indeksleme gerektirir.
⌂deb⊃(⌽⊢↓⍨1⍳⍨⊣,⍷)/⌽¨@0⊢⎕
Çevrimiçi deneyin!
⎕
giriş istemi
⊢
Bu konuda…
⌽¨@0
ofset 0'da oluşan tüm elemanları tersine çevirin
(
… )/
Aşağıdaki zımni işlevi kullanarak sağdan küçültün:
⍷
Sağ bağımsız değişkende sol bağımsız değişkenin başladığı tüm yerleri bir Boole listesiyle belirtin
⊣,
Sol argümanı buna ekleyin
1⍳⍨
ilk 1'in ofsetini bulun
⊢↓⍨
doğru argümandan birçok öncü unsuru çıkarın
⌽
tersine çevir (bir dahaki sefere bunu sondan itibaren yap ve ondan sonra düzeni geri al)
⊃
1 boyutlu bir diziden 0 boyutlu bir diziye indirgemenin neden olduğu kapsamı açıklar
⌂deb
d elete e bulamayabilir (ön ve arka), b Lanks
JavaScript (ES6), 80 75 bayt
Bu, aşağıda çıkmış bazı yazdırılamayan karakterler içeriyor.
(s,a,b)=>s.replace(b||/$/,"").replace(a,"").match(/ *(.*?) *|$/)[1]||""
Çevrimiçi deneyin!
Yorum yaptı
(s, a, b) => // s = input string, a = start keyword, b = end keyword
s.replace( // replace in s:
b || /$/, // look for the end keyword, or the regex /$/ if it's empty
"\3" // and replace it with ETX (end of text)
) //
.replace( // replace in the resulting string:
a, // look for the start keyword
"\2" // and replace it with STX (start of text)
) //
.match( // attempt to match:
/\2 *(.*?) *\3|$/ // "\2" STX ) // " *" followed by optional whitespace // "(.*?)" followed by a non-greedy string (the payload) // " *" followed by optional whitespace // "\3" followed by ETX // "|$" OR match an empty string to make sure that
// match() doesn't return null
[1] || "" // return the payload string, or an empty string if undefined
Python 3 , 86 77 75 bayt
Movatica sayesinde 9 bayt tasarruf sağladı !!! Ovs
sayesinde 2 bayt tasarruf sağladı !!!
lambda s,a,b:s[s.find(a):(b in s)*s.find(b)if b else None][len(a):].strip()
Çevrimiçi deneyin!
JavaScript (Node.js) , 74 bayt
(s,a,b)=>s.substr(p=(s+a).indexOf(a)+a.length,b?s.indexOf(b)-p:1/0).trim()
Çevrimiçi deneyin!
Oldukça açık...
Ruby , 66 bayt
->w,s,e,r=Regexp{"#{w[/#{r.quote s}\K.+(?=#{r.quote e})/]}".strip}
Çevrimiçi deneyin!
Normal ifade kullanmadan başka bir yöntem,
Ruby , 72 bayt
->w,s,e{"#{w[((w+s).index(s)+s.size rescue 0)...w.rindex(e)||0]}".strip}
Çevrimiçi deneyin!
Python 3 , 100 85 bayt
Regex sürümü, dilimleme algoritmasını hala yenemez .
from re import*
r=escape
f=lambda s,b,e:(search(r(b)+'(.+)'+r(e),s)or' ')[1].strip()
Çevrimiçi deneyin!
Retina 0.8.2 , 60 bayt
(.*)¶(.+)?¶.*?\1 *(.*?) *(?<!(?=\2).*)(?(2)\2.*|$)|(.|¶)+ $3
Çevrimiçi deneyin! Girdiyi ayrı satırlarda başlangıç, bitiş, dize olarak alır, ancak bağlantı, kolaylık sağlamak için virgülle ayrılmış dizge, bitiş, başlangıçtan dönüştüren başlık içeren paketi test etmektir. Açıklama:
(.*)¶
Başlangıç anahtar kelimesini eşleştirin.
(.+)?¶
İsteğe bağlı olarak, boş olmayan bir son anahtar kelimeyle eşleştirin.
.*?\1
Başlangıç anahtar sözcüğünü dizede olabildiğince erken ve isteğe bağlı boşlukları bulun.
*(.*?) *
Bir sonucu olabildiğince kısa eşleştirin (böylece son anahtar kelime dizede olabildiğince erken bulunur) ancak aynı zamanda etrafındaki boşlukları da kırpın.
(?<!(?=\2).*)
Son anahtar kelimenin bu noktada zaten geçirilmediğinden emin olun.
(?(2)\2.*|$)
Son anahtar kelime boşsa, yalnızca dizenin sonunda eşleşir, aksi takdirde son anahtar kelime ve dizenin geri kalanıyla eşleşir.
|(.|¶)+
Herhangi bir şeyi eşleştirmek mümkün değilse, her şeyi silin.
$3
İstenen sonucu koruyun.
Wolfram Dili (Mathematica) , 93 bayt
sStringTrim@StringTake[s,i=1;If[i*=-1;#=="",0,StringPosition[s,#][[1,i]]]-i&/@#]/._@_:>""&
Çevrimiçi deneyin!
Kırmızı , 90 bayt
func[t s e][p:""if""<> s[append s" "]if e =""[e:[end]]parse t[thru s copy p to[opt" "e]]p]
Çevrimiçi deneyin!
C (GCC) , 168 152 143 132 112 bayt
@Ceilingcat'e muazzam bir -38 teşekkürler
#define r strstr(c
*f(c,s,e)int*c,*s,*e;{return*e&&r,s)>r,e)|!r,s)|!r,e)||*e&&(*r,e)=0)?"":r,s)+strlen(s)+!!*s;}
Çevrimiçi deneyin!
JavaScript (ES6) 95 92 Bayt, Normal İfade Yok!
(i,s,e,t=i.indexOf(s),r=i.lastIndexOf(e))=>t!=-1&r!=-1?(i.substring(t+s.length,r)).trim():''
Nasıl denenmeli:
Tarayıcınızın JavaScript Konsolunu açın ve aşağıdakileri yapıştırın.
((i,s,e,t=i.indexOf(s),r=i.lastIndexOf(e))=>t!=-1&r!=-1?(i.substring(t+s.length,r)).trim():'')('C# was developed around 2000 by Microsoft as part of its .NET initiative', 'C#', '.NET')
Kömür , 41 bayt
≔⎇ζ…θ⌕θζθθ≔⎇η⪫Φ⪪θηκηθθ≔⌕AEθ›ι ¹ε¿ε✂θ⌊ε⊕⌈ε
Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı sürümüne yöneliktir. Anahtar sözcüklerden biri boş olsa bile, girişe yeterli sayıda yeni satır eklemeye dikkat edin. Açıklama:
≔⎇ζ…θ⌕θζθθ
Son anahtar kelime boş değilse, dizeyi ilk görünümünde kesin. (Neyse ki CycleChop
, girdisi negatifse dizeyi boş olacak şekilde keser.)
≔⎇η⪫Φ⪪θηκηθθ
Başlangıç anahtar kelimesi boş değilse, anahtar kelimedeki dizeyi bölün, ilk öğeyi atın ve dizeyi yeniden birleştirin. Bu, başlangıç anahtar sözcüğü dizede görünmüyorsa boş bir dizeyle sonuçlanır.
≔⌕AEθ›ι ¹ε
Dizede boşluk olup olmadığını kontrol edin.
¿ε✂θ⌊ε⊕⌈ε
Öyleyse, ilk boşluk olmayan sonuncuya kadar yazdırın.
R , 111 bayt
function(s,a,b,c=?s,`?`=nchar,r=regexpr)trimws(substr(s,`if`((d=r(a,s,f=T))>0,d+?a,c),`if`(?b,r(b,s,f=T)-1,c)))
Çevrimiçi deneyin!
Kolay yaklaşım: kullanarak kelimeleri sınırlayan buluntular regexpr
(argüman ile f
ixed = T
metin dizesi regex olarak yorumlanmaz sağlamak için rue), alır substr
aralarındaki ing ve sonra trim
s w
hite s
iki taraftan hızı.
İşlevlerin yana nchar
ve regexpr
her biri iki kez kullanılır, bu tek karakterlik adlar tanımlamak kısa. Söz konusu olduğunda nchar
, tekli operatörü ?
takma adı olarak yeniden tanımlayabiliriz , böylece parantez ihtiyacını ortadan kaldırabiliriz . Ne yazık ki, bu numara, regexpr
onu ek argüman f
ixed = T
rue ile besleme ihtiyacı nedeniyle burada mümkün değildir .
C # 114 bayt
(i,s,e)=>{int p=(i+(s??="")).IndexOf(s)+s.Length,q=$"{e}"==""?i.Length:i.IndexOf(e);return p<q?i[p..q].Trim():"";}