सोमवार मिनी-गोल्फ # 2: लंबा पाठ ट्रंकटिंग


25

सोमवार मिनी गोल्फ: शॉर्ट चुनौतियों की एक श्रृंखला , हर सोमवार (उम्मीद!) पोस्ट की गई।

कई वेब एप्लिकेशन (विशेष रूप से सोशल मीडिया) स्वचालित रूप से पाठ के लंबे मार्ग को छोटा कर देते हैं ताकि वे ऐप के प्रारूपण में फिट हो जाएं। इस चुनौती में, हम एक निश्चित लंबाई तक पाठ के एक मार्ग को स्वचालित रूप से ट्रिम करने के लिए एक एल्गोरिथ्म बनाने जा रहे हैं।

चुनौती

चुनौती का लक्ष्य दो तर्कों में एक कार्यक्रम या फ़ंक्शन लिखना है:

  • टी , पाठ को छोटा करने के लिए।
  • एल , लौटने के लिए अधिकतम लंबाई।

और T , निम्न तर्क से काट दिया गया है:

  • यदि T की लंबाई L से कम या उसके बराबर है , तो किसी ट्रंकेशन की आवश्यकता नहीं है। मूल स्ट्रिंग वापस करें।
  • ट्रंकट टी को लंबाई एल -2। यदि इसमें कोई रिक्त स्थान या हाइफ़न नहीं है, तो T को L- 3 वर्णों तक काट दिया जाए , जिसके बाद एक दीर्घवृत्त होता है ...
  • अन्यथा, अंतिम स्थान या हाइफ़न तक परिणाम के अंत को ट्रिम करें। एक दीर्घवृत्त जोड़ें ...और परिणाम वापस करें।

विवरण

  • T और L को किसी भी क्रम और किसी भी प्रारूप में लिया जा सकता है।
  • आप मान सकते हैं कि 3 < L <2 31
  • आप U + 2026 क्षैतिज एलिप्सीस का उपयोग नहीं कर सकते हैं ; आपको तीन अवधियों का उपयोग करना चाहिए।
  • इनपुट एक स्थान या एक हाइफ़न के साथ शुरू नहीं होगा।
  • इनपुट में नियमित स्थानों के अलावा कोई व्हाट्सएप नहीं होगा। (कोई टैब, नया अंक आदि नहीं)

परीक्षण के मामलों

इनपुट:

"This is some very long text." 25
"This-is-some-long-hyphen-separated-text." 33
"Programming Puzzles & Code Golf is a question and answer site for programming puzzle enthusiasts and code golfers." 55 
"abcdefghijklmnopqrstuvwxyz" 20
"a b c" 4
"Very long." 100

आउटपुट:

"This is some very long..."
"This-is-some-long-hyphen..."
"Programming Puzzles & Code Golf is a question and..."
"abcdefghijklmnopq..."
"a..."
"Very long."

(ध्यान दें कि उद्धरण केवल यह निर्दिष्ट करने के लिए हैं कि ये तार हैं; उन्हें शामिल करने की आवश्यकता नहीं है।)

स्कोरिंग

यह , इसलिए बाइट्स जीत में सबसे कम वैध कोड है। टाईब्रेकर प्रस्तुत करने के लिए जाता है जो पहले अपने अंतिम बाइट की गिनती तक पहुंच गया। विजेता अगले सोमवार, 5 अक्टूबर को चुना जाएगा। शुभकामनाएँ!

संपादित करें: 25 बाइट्स के साथ, फिर से पाइथ के साथ @Jakube को अपने विजेता को बधाई !


7
इस चुनौती के जवाब उनकी संबंधित भाषाओं में एक मानक विशेषता होनी चाहिए। बहुत बार मैंने यूआई को देखा है जो खराब ट्रंक को फीचर करता है ...
सेंचुरी

1
... "अन्यथा, अंतिम स्थान या हाइफ़न सहित" और नहीं "तक परिणाम के अंत को ट्रिम करें।" सही?
अनातोलीग सिप

क्या पाठ में कोई टैब होगा?
kirbyfan64sos 16

@anatolyg नहीं, क्योंकि तब अंतिम स्थान या हाइफ़न एलिप्सिस से पहले दिखाई देगा।
ETHproductions

@ kirbyfan64sos नहींं। मैं उस विवरण अनुभाग में जोड़ दूँगा।
ETHproductions

जवाबों:


12

पायथ, 25 बाइट्स

+WnzK<zeo}@zN" -"-Q2K"...

इसे ऑनलाइन आज़माएँ: प्रदर्शन या टेस्ट सूट

स्पष्टीकरण:

+WnzK<zeo}@zN" -"-Q2K"...  implicit: z = input string, Q = input number
        o        -Q2       order the indices N in [0, 1, ..., Q-3] by
         }@zN" -"            z[T] in " -"
                           (hyphen-indices get sorted to the back)
       e                   take the last such number
     <z                    reduce z to length ^
    K                      save this string to K
+WnzK               K"...  print (K + "...") if z != K else only K

4
मैं अंत में कोड ट्रेल्स को जिस तरह से पसंद करता हूं ...
मैथमैटैंडन

7

पर्ल, 69 59 52 बाइट्स

51 बाइट्स कोड + 1 बाइट कमांड लाइन। मान लें कि संख्यात्मक इनपुट को -i पैरामीटर के साथ दिए जाने की अनुमति है।

s/.{$^I}\K.*//&&s/(^([^ -]*).|.*\K[ -].*)..$/$2.../

उपयोग:

echo "This-is-some-long-hyphen-separated-text." | perl -p -i"33" entry.pl

7

पायथन 2, 78 73 बाइट्स

t,l=input()
u=t[:l-2]
print(t,u[:max(map(u.rfind,' -'))]+'...')[l<len(t)]

इनपुट प्रारूप उदाहरण इनपुट का अनुसरण करता है।


1
अनार्की गोल्फ का एक जाना पहचाना नाम। स्वागत हे!
xnor

7

जावास्क्रिप्ट (ईएस 6), 123 78 67 61 बाइट्स

मुझे उम्मीद नहीं थी कि मैं इसे इतना नीचे काट पाऊंगा, लेकिन यह स्प्लिस / रिप्लेस को बदल देता है / कॉम्बो हर मामले को कवर करने में सक्षम है, जहां ट्रंकेशन की जरूरत है।

(T,L)=>T[L]?T.slice(0,L-2).replace(/([ -][^ -]*|.)$/,'...'):T

पहला तर्क स्ट्रिंग है, दूसरा लंबाई है। लंबाई जाँच अनुकूलन के लिए edc65 के लिए विशेष धन्यवाद!

यहाँ मूल कोड (123 बाइट्स) है:

(T,L)=>(T.length>L?(S=T.slice(0,L)).slice(0,(m=Math.max(S.lastIndexOf` `,S.lastIndexOf`-`))<0?L-3:Math.min(L-3,m))+'...':T)

4
चतुर! +1। युक्ति: अक्सर आपको .lengthस्ट्रिंग (T,L)=>T[L]?T.slice(0,L-2).replace(/([ -][^ -]*|.)$/,'...'):Tस्कोर 61 की लंबाई की जांच करने की आवश्यकता नहीं होती है
edc65

@ edc65 दोह! मैं लंबाई जांच पर एक अनुकूलन की तलाश में था, यह सोचकर कि इसे नीचे ट्रिम करने का कोई तरीका होना चाहिए, लेकिन आपका तरीका मेरे लिए नहीं हुआ था। बहुत बढ़िया सुझाव! : डी
मूर 247

आप बदल सकते हैं [ -][^ -]के साथ \s\Sकरने के लिए सेव 5 अधिक बाइट्स
शॉन एच

महान समाधान! @ शौन, अगर वह करता है कि यह हाइफ़न के लिए काम नहीं करेगा, निश्चित रूप से?
जॅमेर्क्स

@Jarmex मूर्खतापूर्ण मस्तिष्क, हाँ यह निश्चित रूप से नहीं करता है।
शॉन एच।

5

टीआई-बेसिक, 87 बाइट्स

Prompt L,Str1
For(X,1,L
{inString(Str1," ",X),inString(Str1,"-",X
max(I,max(Ans*(Ans≤L-3->I
End
Str1
If L<length(Ans
sub(Ans,1,I+(L-3)not(I))+"...
Ans

TI-BASIC में कई स्ट्रिंग हेरफेर कमांड नहीं हैं, इसलिए हमें मैन्युअल रूप से अंतिम इंडेक्स खोजने की आवश्यकता है: यदि स्ट्रिंग में खोज करने के लिए स्ट्रिंग नहीं है, तो inString(रिटर्न 0. हम हाइफ़न और रिक्त स्थान के लिए खोज करते हैं जो 1 से हर स्थिति में शुरू होता है। करने के लिए L, और सबसे बड़ी संख्या कम से कम रिकॉर्ड या के बराबर L-3। यदि वह संख्या Iअभी भी 0 है, तो हम L-3इसके बजाय अंत सूचकांक के रूप में उपयोग करते हैं।

कैलकुलेटर की सीमाओं के कारण, एक स्ट्रिंग का सबसे बड़ा पता योग्य सूचकांक 9999 है; इसलिए, यह बड़े तारों के लिए विफल हो जाएगा।

मैं चर Iको स्वचालित रूप से 0 से शुरू करने के लिए कैलकुलेटर के व्यवहार पर भरोसा करता हूं , इसलिए Iदौड़ने से पहले अपने कैलकुलेटर की मेमोरी को हटा दें या साफ़ करें।


सबसे बड़े सूचकांक को खोजने के लिए सूचियों का उपयोग करके एक छोटा समाधान है, लेकिन तब आकार सीमा ~ 500 होगी, 9999 नहीं।
lirtosiast

4

C # .NET, 187 169 बाइट्स

हम्म ...

string f(string T,int L){if(T.Length<=L)return T;T=T.Substring(0,L-2);return T.Substring(0,T.Contains(" ")||T.Contains("-")?T.LastIndexOfAny(new[]{' ','-'}):L-3)+"...";}

हां, मैंने बाइट्स को कम करने के लिए रिक्त स्थान हटा दिए हैं।
सलाह अलमी

3

पायथन 2, 105 बाइट्स

def t(s,l):a=s[:l-2];return s[:max(a.rfind(' '),a.rfind('-'))]+'...'if' 'in a or'-'in a else a[:-1]+'...'

के साथ बुलाया गया

>>> print t("This is some very long text.", 25)
This is some very long...

1

ग्रूवी, 95 बाइट्स

a={T,L->F=T.size()<=L?T:T[0..L-3]
m=F=~'(.*[- ])'
F==T?F:m?m[0][0].trim()+'...':F[0..-2]+'...'}

बहुत सीधा, शायद आगे गोल्फ हो सकता है



1

टी-एसक्यूएल, 145 बाइट्स

create proc a(@t varchar(max),@l int)as if LEN(@t)<=@l return @t;set @t = LEFT(@t,@l-3) select LEFT(@t,LEN(@t)-CHARINDEX('-',REVERSE(@t)))+'...'

उपयोग:

exec a("This is some very long text.", 25) exec a("This-is-some-long-hyphen-separated-text.", 33)



1

सीलोन 386 333 252 230 222 216 171 153 131 111

String t(String s,Integer l)=>s.size<l then s else s[0:(s[0:l-2].lastIndexWhere(" -".contains)else l-3)]+"...";

अधूरा मूल:

String truncate(String text, Integer length) {
    if(text.size < length) {
        return text;
    }
    Boolean spacePredicate(Character char) {
        return char == ' ' || char == '-';
    }
    Integer? spaceIndex = text[0:length-2].lastIndexWhere(spacePredicate);
    if(exists spaceIndex) {
        return text[0:spaceIndex] + "...";
    }
    return text[0:length-3]+"...";
}

यह 386 बाइट्स / वर्ण है। यहाँ कुछ दिलचस्प विशेषताएं:

x[y:z]वाक्य रचना के लिए वाक्यात्मक चीनी है x.measure(y, z), और की एक subrange रिटर्न xपर शुरू yलंबाई के साथ z- स्ट्रिंग्स के लिए, यह एक स्ट्रिंग है। (वहाँ भी है x[y..z]वाक्य रचना, एक है जो काल z करने के लिए सूचकांक y से, दोनों समावेशी है, साथ ही आधा खुला फैला x[...z]और x[y...]।)

List.lastIndexWhereएक विधेय लेता है (यानी एक सूची तत्व लेने वाला एक समारोह और एक बूलियन, यानी यहां Callable<Boolean, [Character]>) वापस लौटता है , और अंतिम सूची तत्व का सूचकांक देता है जहां विधेय पूरा होता है (या अशक्त, अगर यह कभी पूरा नहीं होता है)। जैसा कि तार सूची हैं, यह तार के लिए भी काम करता है।

इसका परिणाम, spaceIndexप्रकार का है Integer|Null, या Integer?संक्षिप्त रूप से है - अर्थात यह या तो एक पूर्णांक या nullकेवल प्रकार का मान हो सकता है Null। (नाम spaceIndexतब आता है जब मुझे एहसास नहीं था कि -यह भी विशेष था - मुझे लगता है breakIndexकि बेहतर होगा।)

साथ exists spaceIndexहम देख सकते हैं कि spaceIndexहै गैर-शून्य, और कुछ अलग तो है। (इसके अंदर अगर संकलक जानता है कि यह गैर-अशक्त है ... तो इसके बिना अगर मुझे spaceIndexस्ट्रिंग का उपयोग करने की शिकायत होती, तो वह शिकायत करता।)

स्थानीय फ़ंक्शन के बजाय spacePredicateहम एक अनाम फ़ंक्शन का भी उपयोग कर सकते हैं

(Character char) => char == ' ' || char == '-'

यह हमें 333 अक्षरों में लाता है:

String truncate(String text, Integer length) {
    if(text.size < length) {
        return text;
    }
    Integer? spaceIndex = text[0:length-2].lastIndexWhere(
        (Character char) => char == ' ' || char == '-');
    if(exists spaceIndex) {
        return text[0:spaceIndex] + "...";
    }
    return text[0:length-3]+"...";
}

अगला अनुकूलन छोटे चर और फ़ंक्शन नामों का उपयोग करना है, जो हमें 81 बाइट्स से 252 तक लाता है:

String t(String s, Integer l) {
    if(s.size < l) {
        return s;
    }
    Integer? i = s[0:l-2].lastIndexWhere(
        (Character e) => e == ' ' || e == '-');
    if(exists i) {
        return s[0:i] + "...";
    }
    return s[0:l-3]+"...";
}

विधेय फ़ंक्शन को वास्तव में घोषित किए गए अपने तर्क प्रकार की आवश्यकता नहीं है, जिसे कंपाइलर द्वारा अनुमान लगाया जा सकता है। उसी प्रकार के लिए i(जहां हमें अभी भी valueइसे एक घोषणा के रूप में चिह्नित करने के लिए लिखना है)। अब यह घोषणा एक पंक्ति में फिट होने के लिए काफी कम है, हमें 230 पर लाती है:

String t(String s, Integer l) {
    if(s.size < l) {
        return s;
    }
    value i = s[0:l-2].lastIndexWhere((e) => e == ' ' || e == '-');
    if(exists i) {
        return s[0:i] + "...";
    }
    return s[0:l-3]+"...";
}

इसके बजाय e == ' ' || e == '-'हम यह भी लिख सकते हैं e in [' ', '-'](या e in {' ', '-'}, यह एक टपल एक के बजाय एक चलने योग्य कंस्ट्रक्टर है)। inऑपरेटर विधि Category.contains है, जो हमें विचार करने के लिए लाता है कि हम उस टपल के पास कर सकते हैं करने के लिए नक्शे containsविधि सीधे (यह एक प्रतिदेय है किसी भी वस्तु ले रही है, तो भी चरित्र को स्वीकार करने), बिना (e) => ...बॉयलरप्लेट (222 बाइट्स):

String t(String s, Integer l) {
    if(s.size < l) {
        return s;
    }
    value i = s[0:l-2].lastIndexWhere([' ', '-'].contains);
    if(exists i) {
        return s[0:i] + "...";
    }
    return s[0:l-3]+"...";
}

दरअसल, एक ही श्रेणी जिसमें दो वर्ण होते हैं, वह दो-वर्ण स्ट्रिंग है " -"। (इसके अलावा इसमें इसका सबस्ट्रिंग भी शामिल है, लेकिन यहाँ चोट नहीं लगती है)। 216 बाइट्स।

String t(String s, Integer l) {
    if(s.size < l) {
        return s;
    }
    value i = s[0:l-2].lastIndexWhere(" -".contains);
    if(exists i) {
        return s[0:i] + "...";
    }
    return s[0:l-3]+"...";
}

मुझे लगता है कि हम इस पंक्ति से सबसे अधिक बाहर निकल गए हैं, चलो दूसरों की ओर मुड़ते हैं ... पिछले दो रिटर्न स्टेटमेंट में कुछ समानता है जो हम शोषण कर सकते हैं - वे बस iबनाम में भिन्न l-3हैं, और iबस का उपयोग कर रहे हैं जब यह अशक्त नहीं है, अन्यथा l-3। सौभाग्य से यह वास्तव में क्या हैelse ऑपरेटर के लिए बनाया गया है!

String t(String s, Integer l) {
    if(s.size < l) {
        return s;
    }
    value i = s[0:l-2].lastIndexWhere(" -".contains);
    return s[0:(i else l-3)] + "...";
}

(कोष्ठक यहाँ आवश्यक प्रतीत होते हैं, जैसा कि elseपहले की तुलना में कम है [:]।) यह 171 वर्ण है। अभी वi बस एक बार उपयोग किया जाता है, इसलिए हम इसे इनलाइन कर सकते हैं, हमें 153 वर्णों में ला सकते हैं:

String t(String s, Integer l) {
    if(s.size < l) {
        return s;
    }
    return s[0:(s[0:l-2].lastIndexWhere(" -".contains) else l-3)] + "...";
}

हम इस if-return-returnसंयोजन को एक में ऑपरेटरों thenऔर elseऑपरेटरों के संयोजन से भी बदल सकते हैं return। ( thenरिटर्न दूसरा ऑपरेंड है जब पहला सच है, अन्यथा अशक्त है, जो तब अनुमति देता हैelse अपने दूसरे ऑपरेंड को वापस करने की है। `) 131 बाइट्स (हालांकि कुछ बचत सफेद रिक्त स्थान हैं जो हम किसी भी रास्ते से छुटकारा पा लेंगे):

String t(String s, Integer l) {
    return s.size < l then s else s[0:(s[0:l-2].lastIndexWhere(" -".contains) else l-3)] + "...";
}

एक फ़ंक्शन जिसमें अभिव्यक्ति के साथ सिर्फ एक रिटर्न होता है, वैकल्पिक रूप से "वसा तीर" संकेतन के साथ लिखा जा सकता है, 123 दे रहा है:

String t(String s, Integer l) =>
    s.size < l then s else s[0:(s[0:l-2].lastIndexWhere(" -".contains) else l-3)] + "...";

अनावश्यक व्हाट्सएप को हटाने से हमें अंतिम 111 बाइट मिलती हैं:

String t(String s,Integer l)=>s.size<l then s else s[0:(s[0:l-2].lastIndexWhere(" -".contains)else l-3)]+"...";

इसके अतिरिक्त, यहां एक फ़ंक्शन है जो प्रश्न से उदाहरणों को प्रिंट करता है ( tचरण दो के बाद नाम का उपयोग किया जाता है):

shared void testTruncate() {
    value testInputs = {
        ["This is some very long text.", 25],
        ["This-is-some-long-hyphen-separated-text.", 33],
        ["Programming Puzzles & Code Golf is a question and answer site for programming puzzle enthusiasts and code golfers.", 55], 
        ["abcdefghijklmnopqrstuvwxyz", 20],
        ["a b c", 4],
        ["Very long.", 100]
    };
    for(input in testInputs) {
        print(t(*input));
    }
}

1

POSIX शेल + GNU sed, 65 बाइट्स

sed -re "s/(.{$1}).+/\1/;T;s/(.*)[- ]...*/\1.../;t;s/...$/.../;:"

यह सेड के लिए बनाई गई नौकरी है! लेकिन मुझे लंबाई सीमा प्राप्त करने के लिए शेल की आवश्यकता थी (शायद पर्ल बेहतर होगा)। जब हम समाप्त कर देते हैं, तो यह भाग काफी सरल अनुक्रम में फैल जाता है, सशर्त कूदता है:

s/(.{$1}).+/\1/
T
s/(.*)[- ]...*/\1.../
t
s/...$/.../
:

1

गणितज्ञ 192 बाइट्स

t=With[{r=StringTake[#,Min[#2-2,StringLength[#]]],p={"-",Whitespace},e="..."}, 
  Which[StringLength[#]<=#2,#,StringFreeQ[r,p],StringDrop[r,-1]<>e,
   True,StringTake[r,Max[StringPosition[r,p]]-1]<>e]]&

के रूप में पुकारा गया

t["This is some very long text.", 25]

1

> <>, 74 बाइट्स

l$-:1)?\~r05.
/?=0:~$<-1
\}:0=  ?\::"- "@=@=+?
>~"..."r\}
/!?     <
>ol?!;

इस समाधान के लिए स्ट्रिंग को छोटा किया जाना चाहिए और L पहले से ही उस क्रम में स्टैक पर होना चाहिए।

संरेखण मुद्दों के कारण 7 बर्बाद बाइट्स हैं, फिर भी उन लोगों को बाहर निकालने की कोशिश कर रहे हैं।


1

C # (157):

सलाह अलमी के जवाब पर आधारित है , लेकिन कम है। स्ट्रिंग से वर्ग की व्युत्पत्ति IEnumerable<char>है, तो बजाय T.Contains(" ")||T.Contains("-"), मैं का उपयोग करें " -".Any(x=>T.Contains(x))

समाधान:

string f(string T,int L){if(T.Length<=L)return T;T=T.Substring(0,L-2);return T.Substring(0," -".Any(T.Contains)?T.LastIndexOfAny(new[]{' ','-'}):L-3)+"...";}

Ungolfed:

string f (string T, int L)
{
    if (T.Length <= L)
        return T;

    T = T.Substring(0, L - 2);

    return T.Substring(0, " -".Any(T.Contains) ? T.LastIndexOfAny(new[]{' ', '-'}) : L - 3) + "...";
}

अद्यतन करें:

के Any(T.Contains)बजाय का उपयोग कर, SLuck49 की टिप्पणी के लिए 6 बाइट्स को बचाया Any(x=>T.Contains(x))


1
के लिए .Any(x=>T.Contains(x))की तरह आप के बजाय सीधे विधि का उपयोग कर सकते हैं एक लैम्ब्डा के .Any(T.Contains)6 बाइट्स को बचाने के लिए
SLuck49

@ SLuck49 धन्यवाद, मेरे उत्तर को अपडेट किया।
अब्बास

1

GS2 , 29 बाइट्स

यह कार्यक्रम मानक इनपुट लेता है। पहली पंक्ति स्ट्रिंग है, और दूसरी लक्ष्य लंबाई संख्या है।

2a 0e 56 3c 40 a0 74 20 22 22 04 5d 2e 2a 3f 5b
20 2d 5d 7c 2e 07 2e 2e 2e 9d 20 e4 35

GS2 कोड कभी-कभी पढ़ने में थोड़ा कठिन हो सकता है। :) यहाँ कुछ टिप्पणी है।

2a         # lines - split input on newlines yielding a two element array
0e         # extract-array - pop array, push both elements 
56         # read-num - convert length string to number
3c         # take - truncate the string to specified length
40         # dup - duplicate truncated string on stack
a0         # junk1 - push the last popped value, the un-truncated string
74         # ne - test for inequality
    20     # reverse string
    22 22  # tail tail - remove first two characters

    # regex replace first occurrence of ".*?[ -]|." with "..."
    04 5d 2e 2a 3f 5b 20 2d 5d 7c 2e 07 2e 2e 2e 9d 

    20     # reverse string
e4         # block5 - make a block out of last 5 instructions
35         # when - conditionally execute block

1

ग्रूवी, 56 बाइट्स

पहले केलीग्रेथ के उत्तर को कॉपी किया गया था, इसलिए समान चर नाम ...

स्ट्रिंग को 2 वर्णों से नीचे ट्रिम करें, फिर अधिकांश कार्य रेगेक्स द्वारा किया जाता है, एक डैश या स्पेस को प्रतिस्थापित करता है, इसके बाद किसी भी संख्या में चार या डेज़ या स्पेस नहीं है जो स्ट्रिंग के अंत में "" है। या स्ट्रिंग के अंत में किसी भी वर्ण को प्रतिस्थापित करें यदि इससे पहले के सभी वर्ण न तो डैश या "" के साथ एक स्थान है। Regex लिखने की तुलना में शब्दों में डालना मुश्किल ...

a={T,L->T.size()<=L?T:T[0..L-3].replaceAll("([- ][^ -]*|(?<=[^- ]*).)\$",".")+".."}

संपादित करें: वास्तव में, केवल उस स्ट्रिंग के हिस्से को हटा सकते हैं जो रेगेक्स से मेल खाता है और अंत में "..." जोड़ें:

a={T,L->T.size()<=L?T:T[0..L-3]-~/[- ][^ -]*$|.$/+"..."}



0

सी # (विजुअल सी # इंटरएक्टिव कंपाइलर) , 117 बाइट्स

a=>b=>a.Length>b?a.Substring(0,(" -".Any(x=>a.IndexOf(x,0,b-2)>-1)?a.LastIndexOfAny(new[]{' ','-'},b-2):b-3))+"...":a

@ अब्बा के आधार पर, जो @ अललाह के जवाब से दूर है। उपयोग करने Containsऔर एक अनावश्यक Substringकॉल के बजाय , यह जांचने के लिए IndexOf का उपयोग करता है कि क्या एक हाइफ़न या स्थान ट्रंकित स्ट्रिंग में मौजूद है।

इसे ऑनलाइन आज़माएं!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.