সিলোন, 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!");
}
}
এটি একটি কমান্ড লাইন প্যারামিটার থেকে যুক্তিটি গ্রহণ করে ... প্রক্রিয়া.আরগারুমেন্টগুলি স্ট্রিংগুলির একটি (সম্ভবত খালি) অনুক্রম হয়, সুতরাং এর মধ্যে একটি ব্যবহার করার আগে আমাদের এটি পরীক্ষা করা দরকার যে এটি আসলে আছে কিনা। অন্য ক্ষেত্রে আমরা একটি ত্রুটি বার্তা আউটপুট করি (এটি প্রশ্নের দ্বারা প্রয়োজনীয় নয় এবং পরবর্তী সংস্করণগুলিতে ফেলে দেওয়া হবে)।
সিলোন এর sum
ফাংশনটি এমন কোনও ধরণের উপাদানগুলির একটি খালি-খালি আইটেবল গ্রহণ করে যা পূরণ করতে হয় Summable
, অর্থাত্ plus
পূর্ণসংখ্যার মতো একটি পদ্ধতি রয়েছে । (এটি খালি সিকোয়েন্সগুলির সাথে কাজ করে না কারণ প্রতিটি সাম্মেবল টাইপের নিজস্ব শূন্য থাকে এবং রানটাইমটি কোনটি বোঝায় তা জানার কোনও সুযোগ নেই))
কোনও স্ট্রিংয়ের উপাদান বা একটি পূর্ণসংখ্যার এক বিটগুলি খালি খালি পুনরাবৃত্ত হয় না। অতএব আমরা কিছু উপাদান নির্দিষ্ট করে একটি পুনরাবৃত্তিযোগ্য গড়ার জন্য বৈশিষ্ট্যটি এখানে ব্যবহার করছি, তারপরে একটি "বোধগম্যতা" (যা শূন্য বা আরও বেশি উপাদানের কাছে মূল্যায়ন হবে)। সুতরাং চরিত্রের ক্ষেত্রে আমরা যুক্ত করছি (তবে কেবলমাত্র সম্পর্কিত বিট সেট করা থাকলে), স্ট্রিংয়ের ক্ষেত্রে আমরা অক্ষরের ফলাফল যুক্ত করছি। (উপলব্ধিটি কেবল তখনই মূল্যায়ন করা হবে যখন গ্রহণযোগ্য ফাংশনটি আসলে এটির উপরে পুনরাবৃত্তি করে, আইটেবল তৈরি করার সময় নয়))
আসুন আমরা কীভাবে এটি সঙ্কুচিত করতে পারি তা দেখুন। প্রথমত, প্রতিটি ক্রিয়াকলাপ কেবল একটি জায়গায় ডাকা হয়, তাই আমরা সেগুলি ইনলাইন করতে পারি। এছাড়াও, উপরে উল্লিখিত হিসাবে, ত্রুটি বার্তা থেকে মুক্তি পান। (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
, আমরা এটির একটি বড় উপলব্ধি করতে পারি। (এটি আমাদের sum({0,})
জন্য পাদদেশের 37 37 পয়েন্ট এবং আরও কিছু সাদা অংশের জন্য সংরক্ষণ করে , যা যাইহোক শেষে শেষ করে দেওয়া হবে)) এটি 7৯7:
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 }));
}
আমরা এখানে বিকল্প ফাংশন কল সিনট্যাক্স ব্যবহার করে এখানে ফাংশনটির ()
জন্য বাদ দিতে পারি , যা এর পরিবর্তে ব্যবহার করে এবং পুনরাবৃত্ত যুক্তিগুলিতে বোঝাপড়া পূরণ করবে। এটির পদচিহ্ন 538:sum
{...}
()
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 পয়েন্ট, দুটি লাইনের বিরতির জন্য দুটি):
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});}
এপিআই ব্রাউজ করার সময়, আমি পেয়েছি যে ক্যারেক্টার.হ্যাশ আসলে এটির 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});}