실론 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)]+"...";
Ungolfed Original :
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)
, 그리고 부분 범위 반환 x
에서 시작하는 y
길이 z
- 문자열,이 문자열입니다. (도있다 x[y..z]
A는 문법 기간 Z에 인덱스 Y의 양단을 포함뿐만 아니라 반 개방 스팬 x[...z]
하고 x[y...]
).
List.lastIndexWhere
술어 (즉,리스트 요소를 취하고 부울을 리턴하는 함수, 즉 여기서 a Callable<Boolean, [Character]>
)를 취하고 , 술어가 이행되는 마지막리스트 요소의 색인을 제공합니다 (또는 이행되지 않은 경우 널 (NULL)). 문자열이 목록이므로 문자열에도 적용됩니다.
이것의 결과는 spaceIndex
type Integer|Null
이거나 Integer?
짧습니다. 즉 Integer 또는 null
type의 유일한 값일 수 Null
있습니다. (이름 도 특별 spaceIndex
하다는 사실을 알지 못했을 때 유래 한 것입니다. 더 좋을 것 -
같습니다 breakIndex
.)
와 exists spaceIndex
우리가하면 확인할 수 있습니다 spaceIndex
null가 아닌 다음 뭔가 다른 작업을 수행. (이 if-block 내부에서 컴파일러는 null이 아닌 것을 알고 있습니다 ... 그러지 않으면 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]+"...";
}
실제로, 동일한 두 문자를 포함하는 다른 범주는 두 문자 string " -"
입니다. 또한 하위 문자열도 포함되어 있지만 여기에는 아무런 영향이 없습니다. 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
null가 아닌 바로 그 때를, 그렇지 않으면 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
첫 번째 피연산자가 true이면 return은 두 번째 피연산자이고, 그렇지 않으면 null이며, 두 번째 피연산자 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
2 단계 후에 사용 된 이름 사용).
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));
}
}