সোমবার মিনি-গল্ফ # 2: দীর্ঘ পাঠ্য কেটে দেওয়া


25

সোমবার মিনি-গল্ফ: সংক্ষিপ্ত চ্যালেঞ্জগুলির একটি সিরিজ , প্রতি সোমবার পোস্ট করা (আশাবাদী!)

অনেক ওয়েব অ্যাপ্লিকেশন (বিশেষত সোশ্যাল মিডিয়া) স্বয়ংক্রিয়ভাবে পাঠ্যের দীর্ঘ প্যাসেজ কেটে দেয় যাতে এগুলি অ্যাপ্লিকেশানের বিন্যাসের মধ্যে ফিট হয় within এই চ্যালেঞ্জের মধ্যে আমরা একটি নির্দিষ্ট দৈর্ঘ্যের পাঠ্যকে স্বয়ংক্রিয়ভাবে ছাঁটাই করতে একটি অ্যালগরিদম তৈরি করতে যাচ্ছি।

চ্যালেঞ্জ

চ্যালেঞ্জের লক্ষ্য হ'ল একটি প্রোগ্রাম বা ফাংশন লিখুন যা দুটি যুক্তি দেখায়:

  • টি , পাঠ্য কেটে ফেলুন।
  • এল , ফিরে আসার সর্বোচ্চ দৈর্ঘ্য।

এবং টি প্রদান করে , নিম্নলিখিত যুক্তি দিয়ে কাটা:

  • যদি T এর দৈর্ঘ্য L এর চেয়ে কম বা সমান হয় তবে কোনও কাটা কাটা দরকার নেই। আসল স্ট্রিংটি ফিরিয়ে দিন।
  • Truncate টি দৈর্ঘ্যের এল -2। এটি কোন স্পেস বা হাইফেন থাকে তবে আসতে টি ঠিক করতে ছেঁটে ফেলা এল -3 অক্ষর, একটি ঊহ্য শব্দ দ্বারা অনুসরণ ...
  • অন্যথায়, ফলাফলের শেষটি শেষ স্থান বা হাইফেন পর্যন্ত ছাঁটাই। একটি উপবৃত্ত যুক্ত করুন ...এবং ফলাফলটি ফিরিয়ে দিন।

বিস্তারিত

  • টি এবং এল উভয় ক্রম এবং যে কোনও বিন্যাসে নেওয়া যেতে পারে।
  • আপনি ধরে নিতে পারেন যে 3 < এল <2 31
  • আপনি ইউ + 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 বাইট সহ!


7
এই চ্যালেঞ্জের উত্তরগুলি তাদের নিজ নিজ ভাষায় মানক বৈশিষ্ট্য হওয়া উচিত। খুব ঘন ঘন আমি UI দেখেছি যা খারাপ ট্রুঙ্কা বৈশিষ্ট্যযুক্ত ...
সানচিইস

1
... "অন্যথায়, শেষ স্থান বা হাইফেন সহ ফলাফলের শেষে এবং" "না" ট্রিম করুন "" রাইট?
অ্যানাটলিগ

পাঠ্যের কোনও ট্যাব থাকবে?
kirbyfan64sos

@ অ্যানাটলিগ নং, কারণ তখন চূড়ান্ত স্থান বা হাইফেন উপবৃত্তের আগে উপস্থিত হবে।
ETH প্রোডাকশনস

@ kirbyfan64sos নাহ। আমি এটি বিশদ বিভাগে যুক্ত করব।
ETH প্রোডাকশনস

উত্তর:


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
কোডটি শেষের দিকে যেভাবে বন্ধ হবে তা আমি পছন্দ করি ...
mathmandan

7

পার্ল, 69 59 52 বাইট

51 বাইট কোড + 1 বাইট কমান্ড লাইন। ধরে নেওয়া হচ্ছে -i প্যারামিটারের সাথে সংখ্যার ইনপুট দেওয়া যাবে is

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

জাভাস্ক্রিপ্ট (ES6), 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 দোহ! আমি দৈর্ঘ্যের চেকটির জন্য একটি অপ্টিমাইজেশন খুঁজছিলাম, ভেবেছিলাম এটিকে ছাঁটাই করার কোনও উপায় আছে, তবে আপনার পদ্ধতিটি আমার কাছে ঘটেনি। দুর্দান্ত পরামর্শ! : ডি
Mwr247

আপনি আরও 5 টি বাইট সংরক্ষণের [ -][^ -]সাথে প্রতিস্থাপন করতে পারেন\s\S
শন এইচ

দুর্দান্ত সমাধান! @ শনহহ, যদি তিনি করেন যে এটি হাইফেনগুলির পক্ষে কাজ করবে না, অবশ্যই?
জারমেক্স

@ জারমেক্স নিরীহ মস্তিষ্ক, হ্যাঁ এটি অবশ্যই না।
শান এইচ

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

টিআই-বেসিকের অনেকগুলি স্ট্রিং ম্যানিপুলেশন কমান্ড নেই, সুতরাং আমাদের ম্যানুয়ালি শেষ সূচিটি সন্ধান করতে হবে: যদি স্ট্রিংটিতে অনুসন্ধানের জন্য স্ট্রিং না থাকে, তবে inString(0 প্রদান করে 1 থেকে Lএবং এর চেয়ে কম বা সমান বৃহত্তম সংখ্যাটি রেকর্ড করুন L-3। যদি সংখ্যাটি Iএখনও 0 হয় তবে আমরা L-3পরিবর্তে সূচক হিসাবে ব্যবহার করি ।

ক্যালকুলেটারের সীমাবদ্ধতার কারণে, স্ট্রিংয়ের বৃহত্তম ঠিকানাযোগ্য সূচকটি 9999; অতএব, এটি বৃহত্তর স্ট্রিংয়ের জন্য ব্যর্থ হবে।

আমি ভ্যারিয়েবলটি I0 থেকে স্বয়ংক্রিয়ভাবে আরম্ভ করার ক্যালকুলেটরের আচরণের উপর নির্ভর করি , তাই Iচলার আগে আপনার ক্যালকুলেটরের স্মৃতি মুছুন বা সাফ করুন।


বৃহত্তম সূচীটি অনুসন্ধানের জন্য তালিকাগুলি ব্যবহার করার একটি ছোট সমাধান রয়েছে, তবে তারপরে আকারের সীমাটি 9999 নয়, 500
ডলার হবে

4

সি #। নেট, 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]সিনট্যাক্সও রয়েছে, যা সূচক y থেকে z পর্যন্ত স্প্যান , উভয় সমেত, পাশাপাশি অর্ধ-খোলা স্প্যান x[...z]এবং x[y...]।)

List.lastIndexWhereএকটি শিকারী নেয় (যেমন একটি ফাংশন একটি তালিকা উপাদান গ্রহণ করে এবং বুলিয়ান ফিরিয়ে দেয়, অর্থাত্ এখানে এ Callable<Boolean, [Character]>)) এবং সর্বশেষ তালিকা উপাদানটির সূচক দেয় যেখানে ভবিষ্যদ্বাণীটি পূর্ণ হয় (বা নাল, যদি এটি কখনও পূরণ না হয়)। স্ট্রিংগুলি তালিকা হিসাবে এটি স্ট্রিংয়ের জন্যও কাজ করে।

এর ফলাফলটি spaceIndexটাইপযুক্ত Integer|Null, বা Integer?সংক্ষিপ্তটির জন্য - অর্থাত্ এটি হয় একটি পূর্ণসংখ্যা বা null(কেবলমাত্র একমাত্র মান Null)। (নামটি spaceIndexতখন থেকেই এসেছিল যখন আমি বুঝতে পারি নি যে -এটিও বিশেষ I আমি অনুমান করি 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, যা আমাদের ধারণার প্রতি এনেছে যে, আমরা যে tuple এর পাস করতে মানচিত্র containsপদ্ধতি সরাসরি (এটি একটি callable কোন বস্তুর গ্রহণ, তেমনি চরিত্র গ্রহণ), ছাড়া (e) => ...boilerplate, (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তার দ্বিতীয় অপারেন্ডটি ফেরত দিতে দেয় `) ১৩১ বাইট (যদিও কিছু সঞ্চয় শ্বেতস্থান হয় যা আমরা যাই হোক মুক্তি পাব):

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

পসিক্স শেল + জিএনইউ সেড, 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এবং ইতিমধ্যে স্ট্যাকের মধ্যে থাকা দরকার requires

প্রান্তিককরণ সমস্যার কারণে সৃষ্ট 7 টি অপচয় বাইট রয়েছে, এখনও সেগুলি গল্ফ করার চেষ্টা করছে।


1

সি # (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

@ এসলাক 49 ধন্যবাদ, আমার উত্তর আপডেট করেছে updated
আব্বাস

1

জিএস 2 , 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

জিএস 2 কোডটি মাঝে মাঝে পড়তে কিছুটা কঠিন হতে পারে। :) এখানে কিছু মন্তব্য।

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 টি অক্ষর দ্বারা নীচে ছাঁটা করুন, তারপরে বেশিরভাগ কাজ রেইজেক্স দ্বারা সম্পন্ন করা হবে, একটি ড্যাশ বা একটি স্থানের পরিবর্তে স্ট্রিংয়ের শেষে ড্যাশ বা একটি স্থান নয় এমন কোনও সংখ্যক অক্ষর দ্বারা স্থান পরিবর্তন করুন "" " অথবা স্ট্রিংয়ের শেষে যে কোনও অক্ষর প্রতিস্থাপন করুন যদি এর আগে সমস্ত অক্ষর ড্যাশ বা একটি স্পেস না থাকে ""। রেজেক্স লেখার চেয়ে কথায় কথায় বলা শক্ত ...

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কল ব্যবহার করার পরিবর্তে , এটি সূচিপত্র ব্যবহার করে কাটা স্ট্রিংয়ে কোনও হাইফেন বা স্থান রয়েছে কিনা তা পরীক্ষা করে।

এটি অনলাইন চেষ্টা করুন!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.