실론, 1431 , 764 , 697 , 571 , 547 , 538 , 501 , 493 , 467 , 451
shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.hash.get(b))1});}
이것은 원래 ungolfed였습니다.
Integer footprintCharacter(Integer b) {
return sum({0, for(i in 0..7) if(b.get(i)) 1 });
}
Integer footPrintString(String s) {
if(s == "test") {return 0;}
return sum({0, for(c in s) footprintCharacter(c.integer)});
}
shared void footprint() {
if(exists s = process.arguments[0]) {
print(footPrintString(s));
} else {
print("This program needs at least one parameter!");
}
}
이것은 명령 행 매개 변수에서 인수를 가져옵니다 ... process.arguments는 문자열의 (비어있는) 시퀀스이므로 문자열 중 하나를 사용하기 전에 실제로 존재하는지 확인해야합니다. 다른 경우에는 오류 메시지를 출력합니다 (질문에 필요하지 않으며 다음 버전에서는 버리게됩니다).
Ceylon의 sum
함수는 충족 해야하는 어떤 유형의 요소 , 즉 Integer와 같은 메소드 가 비어 있지 않은 Iterable을 취합니다 . (각 Summable 유형에는 고유 한 0이 있으며 런타임에서 어떤 유형을 의미하는지 알 수 없기 때문에 빈 시퀀스에서는 작동하지 않습니다.)Summable
plus
문자열의 요소 또는 정수의 1 비트는 비어 있지 않은 반복이 아닙니다. 따라서 여기서는 일부 요소를 지정한 다음 "이해"(0 개 이상의 요소로 평가됨)를 지정하여 이터 러블을 빌드하는 기능을 사용하고 있습니다. 따라서 문자의 경우에는 비트를 추가하고 (해당 비트가 설정된 경우에만) 문자열의 경우에는 문자의 결과를 추가합니다. 이해력은 Iterable을 빌드 할 때가 아니라 수신 함수가 실제로 반복 할 때만 평가됩니다.
어떻게 축소 할 수 있는지 봅시다. 먼저 각 함수는 한 곳에서만 호출되므로 인라인 할 수 있습니다. 또한 위에서 언급했듯이 오류 메시지를 제거하십시오. (764 발자국 포인트)
shared void footprint() {
if (exists s = process.arguments[0]) {
if (s == "test") {
print(0);
} else {
print(sum({ 0, for (c in s) sum({ 0, for (i in 0..7) if (c.integer.get(i)) 1 }) }));
}
}
}
우리는 실제로 내부 중첩이 필요하지 않습니다 sum
. 우리는 이것을 하나의 큰 이해로 만들 수 있습니다. (이것은 우리에게 37 개의 발자국 포인트를 절약하고 sum({0,})
, 공백을위한 더 많은 포인트를 절약합니다 . 어쨌든 결국 제거 될 것입니다.) 이것은 697입니다.
shared void footprint() {
if (exists s = process.arguments[0]) {
if (s == "test") {
print(0);
} else {
print(sum({ 0, for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
}
}
}
우리는 특수한 경우에 유사한 원칙을 적용 할 수있다 "test"
:이 경우 결과가 0 (즉, 합계에 기여하는 것은 없다)과 같이 우리는 단지 합산의 일부로서 이것을 할 수있다 (그러나 조건을 반전시켜야한다) . 이는 주로 print(0);
, 일부 괄호 및 들여 쓰기 공간을 절약 하여 풋 프린트 571로 내려갑니다.
shared void footprint() {
if (exists s = process.arguments[0]) {
print(sum({ 0, if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
}
}
우리는 first에 대해 동일한 작업을 수행하지만 if
부작용이 없어서 0
아무 것도하지 않고 출력도 발생한다는 부작용이 있습니다 . (적어도 나는 그것이 여기서 일어날 것이라고 생각했지만, 그것은 영원한 고리로 매달려있는 것처럼 보입니까?
shared void footprint() {
print(sum({ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
}
우리는 대체 함수 호출 구문을 사용하여 여기서 함수에 ()
대해 생략 할 수 있습니다. 이 sum
함수 는 대신에 를 사용 하고 반복 가능한 인수로 이해를 채 웁니다. 여기에는 풋 프린트 538이 있습니다.{...}
()
shared void footprint() {
print(sum{ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 });
}
함수 이름 footprint
(40)을 p
(3)으로 바꾸면 37 포인트가 더 절약되어 501이됩니다.
shared void p() {
print(sum{ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 });
}
변수 이름 s
(5) 및 c
(4), i
(4)도 최적이 아닙니다. 그것들을 a
(인수), d
(숫자?) 및 b
(비트 인덱스)로 바꾸자 . 발자국 493 :
shared void p() {
print(sum{ 0, if (exists a = process.arguments[0]) if (a != "test") for (c in a) for (b in 0..7) if (c.integer.get(b)) 1 });
}
공백이 아닌 나머지 최적화가 표시되지 않으므로 필요하지 않은 공백을 제거하십시오 (각 공백에 대해 1 점, 두 줄 바꿈에 대해 2 점).
shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.integer.get(b))1});}
API를 탐색 할 때 Character.hash가 실제로 해당 integer
속성 과 동일한 값을 반환 한다는 것을 알았 습니다 . 그러나 30 대신 14 포인트 만 있으므로 451로 내려갑니다!
shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.hash.get(b))1});}