সিলোন 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));
}
}