Tích Lan, 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});}
Đây là bản gốc, chưa được chỉnh sửa:
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!");
}
}
Điều này lấy tham số từ một tham số dòng lệnh ... process.argument là một chuỗi (có thể trống) của chuỗi, vì vậy trước khi sử dụng một trong số chúng, chúng ta cần kiểm tra xem nó có thực sự tồn tại không. Trong trường hợp khác, chúng tôi đưa ra một thông báo lỗi (câu hỏi này không bắt buộc và sẽ bị loại bỏ trong các phiên bản tiếp theo).
sum
Hàm của Ceylon có một phần tử lặp không rỗng của một số loại cần thỏa mãn Summable
, tức là có một plus
phương thức, như Integer. (Nó không hoạt động với các chuỗi trống vì mỗi loại Summable sẽ có số 0 riêng và thời gian chạy không có cơ hội để biết loại nào có nghĩa.)
Các phần tử của một chuỗi, hoặc một bit của một số nguyên, không phải là một phép lặp không trống. Do đó, chúng tôi đang sử dụng tính năng này để xây dựng một lần lặp bằng cách chỉ định một số phần tử, sau đó là "mức độ hiểu" (sẽ được đánh giá bằng 0 hoặc nhiều phần tử). Vì vậy, trong trường hợp ký tự, chúng ta sẽ thêm các ký tự (nhưng chỉ khi bit tương ứng được đặt), trong trường hợp chuỗi chúng ta sẽ thêm kết quả của các ký tự. (Mức độ hiểu sẽ chỉ được đánh giá khi chức năng nhận thực sự lặp lại trên nó, chứ không phải khi xây dựng Iterable.)
Chúng ta hãy xem làm thế nào chúng ta có thể thu nhỏ điều này xuống. Đầu tiên, mỗi hàm chỉ được gọi ở một nơi, vì vậy chúng ta có thể nội tuyến chúng. Ngoài ra, như đã đề cập ở trên, thoát khỏi thông báo lỗi. (764 điểm dấu chân.)
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 }) }));
}
}
}
Chúng ta không thực sự cần nội tâm lồng vào nhau sum
, chúng ta có thể làm cho điều này trở nên lớn hơn. (Điều này giúp chúng tôi tiết kiệm được 37 điểm cho dấu chân sum({0,})
và một số điểm khác cho khoảng trắng sẽ bị loại bỏ ở cuối mọi cách.) Đây là 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 }));
}
}
}
Chúng ta có thể áp dụng một nguyên tắc tương tự cho "test"
chuỗi có vỏ đặc biệt : vì trong trường hợp đó, kết quả là 0 (nghĩa là không có gì được đóng góp vào tổng), chúng ta chỉ có thể thực hiện điều này như một phần của phép tính tổng (nhưng chúng ta phải đảo ngược điều kiện) . Điều này chủ yếu giúp chúng tôi tiết kiệm print(0);
, một số niềng răng và một loạt các không gian thụt đầu dòng, đi xuống dấu chân của 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 }));
}
}
Chúng tôi làm tương tự cho lần đầu tiên if
, với hiệu ứng phụ mà bây giờ không đưa ra đối số nào cũng xuất ra 0
thay vì không làm gì cả. (Ít nhất tôi nghĩ điều đó sẽ xảy ra ở đây, thay vào đó nó dường như bị treo với một vòng lặp vĩnh cửu? Lạ thật.)
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 }));
}
Chúng ta thực sự có thể bỏ qua hàm ()
cho sum
ở đây, bằng cách sử dụng cú pháp gọi hàm thay thế , sử dụng {...}
thay vì ()
và sẽ điền vào các hiểu biết vào các đối số có thể lặp lại. Điều này có dấu chân 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 });
}
Thay thế tên hàm footprint
(40) bằng p
(3) sẽ tiết kiệm thêm 37 điểm, đưa chúng tôi tới 501. (Tên hàm Ceylon phải bắt đầu bằng các ký tự chữ thường, vì vậy chúng tôi không thể có ít hơn 3 điểm ở đây.)
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 });
}
Tên biến s
(5) và c
(4), i
(4) cũng không tối ưu. Hãy thay thế chúng bằng a
(đối số), d
(chữ số?) Và b
(chỉ mục bit). Dấu chân 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 });
}
Tôi không thấy bất kỳ tối ưu hóa không phải khoảng trắng nào còn lại, vì vậy, hãy xóa khoảng trắng không cần thiết (1 điểm cho mỗi khoảng trắng, hai điểm cho mỗi lần ngắt hai dòng):
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});}
Khi duyệt API, tôi thấy rằng Character.hash thực sự trả về cùng giá trị với integer
thuộc tính của nó . Nhưng nó chỉ có 14 điểm thay vì 30, vì vậy chúng tôi giảm xuống còn 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});}