Ceylon, 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});}
นี่คือต้นฉบับที่ไม่ได้รับเกียรติ:
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 เป็นลำดับของสตริง (อาจว่างเปล่า) ดังนั้นก่อนที่จะใช้หนึ่งในนั้นเราต้องตรวจสอบว่ามีอยู่จริงหรือไม่ ในอีกกรณีหนึ่งเราแสดงข้อความแสดงข้อผิดพลาด (ไม่จำเป็นต้องมีคำถามและจะถูกโยนทิ้งในเวอร์ชันถัดไป)
sum
ฟังก์ชั่นของ Ceylon ใช้Iterable ที่ไม่ว่างเปล่าของอิลิเมนต์บางประเภทที่ต้องทำให้พอใจSummable
นั่นคือมีplus
เมธอดเหมือน Integer (มันไม่ทำงานกับลำดับที่ว่างเปล่าเพราะ Summable แต่ละประเภทจะมีศูนย์เป็นของตัวเองและรันไทม์ไม่มีโอกาสรู้ว่าอันไหนที่มีความหมาย)
องค์ประกอบของสตริงหรือหนึ่งบิตของจำนวนเต็มไม่สามารถทำซ้ำได้ที่ไม่ว่างเปล่า ดังนั้นเราจึงใช้คุณลักษณะนี้เพื่อสร้างการทำซ้ำได้โดยการระบุองค์ประกอบบางอย่างจากนั้นเป็น "ความเข้าใจ" (ซึ่งจะได้รับการประเมินเป็นศูนย์หรือมากกว่านั้น) ดังนั้นในกรณีตัวละครเรากำลังเพิ่มอันใหม่ (แต่เมื่อตั้งค่าบิตที่สอดคล้องกัน) ในกรณีสตริงเรากำลังเพิ่มผลลัพธ์ของตัวละคร (ความเข้าใจจะได้รับการประเมินก็ต่อเมื่อฟังก์ชั่นที่ได้รับนั้นวนซ้ำจริง ๆ ไม่ใช่เมื่อสร้าง 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 }));
}
}
เราทำสิ่งเดียวกันนี้เป็นครั้งแรก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
ฟังก์ชั่นที่นี่โดยใช้ไวยากรณ์ฟังก์ชั่นการโทรทางเลือกซึ่งใช้{...}
แทน()
และจะกรอกข้อมูลลงใน comprehensions เข้าไปในข้อโต้แย้ง iterable สิ่งนี้มีรอย 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 (ชื่อฟังก์ชั่นซีลอนต้องเริ่มต้นด้วยตัวอักษรตัวพิมพ์เล็กดังนั้นเราจึงไม่สามารถรับน้อยกว่า 3 คะแนนได้ที่นี่)
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 จุดสำหรับแต่ละพื้นที่สองสำหรับการแบ่งบรรทัดสองครั้ง):
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
แอตทริบิวต์ของจริง แต่มันมีเพียง 14 คะแนนแทนที่จะเป็น 30 ดังนั้นเราจึงลงไปที่ 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});}